TCP常见问题

server/2024/12/20 6:26:09/

文章目录

      • 一、两种状态图
      • 二、常见问题
        • 1、MSL是什么
      • 3、为何等待2MSL
      • 3、为何三次握手,不握手、握手一次、两次行吗
      • 4、为何四次挥手,三次行吗,两次行吗

一、两种状态图

在这里插入图片描述

四次挥手

在这里插入图片描述

二、常见问题

1、MSL是什么

MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

3、为何等待2MSL

为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在 LAST-ACK 状态的服务器收不到对 FIN-ACK 的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。即:
保证客户端发送的最后一个ACK报文段能够到达服务端。

这个ACK报文段有可能丢失,使得处于 LAST-ACK 状态的B收不到对已发送的 FIN+ACK 报文段的确认,服务端超时重传 FIN+ACK 报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK 报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到 CLOSED 状态,若客户端在 TIME-WAIT 状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的 FIN+ACK 报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到 CLOSED 状态。

(2)防止“已失效的连接请求报文段”出现在本连接中。

客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生 的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。

3、为何三次握手,不握手、握手一次、两次行吗

1、无法确保双方通信能力
在三次握手过程中,客户端和服务器都发送和接收了数据包,以此来确认彼此具备发送和接收数据的能力。如果缺少握手步骤,服务器可能无法确认客户端的接收能力,这可能导致通信过程中的数据丢失或错误.
2、可能导致过期连接请求被接受
网络中数据包可能因网络拥塞、路由错误等原因延迟到达 。若只有两次握手,客户端可能因等待服务器响应超时而重发连接请求,服务器可能会接收到多个连接请求,导致资源浪费和数据混乱。而三次握手的第三次握手可以避免这种情况,确保双方确认通信状态是新的,而非旧连接.
3、难以同步初始序列号
三次握手过程中,客户端和服务器会交换彼此的初始序列号,该序列号在后续数据传输中用于确保数据的顺序性和完整性。若缺少第三次握手,可能无法正确地同步这些序列号,从而影响数据的可靠传输.
4、容易出现半开连接状态
只进行两次握手,可能会导致半开连接状态的出现,即一端已经准备好发送数据,但另一端却没有确认连接建立。这种状态可能会导致资源浪费或者连接泄漏。而第三次握手可以确保双方都已经确认了连接的建立,避免了半开连接状态的出现.
5、存在安全隐患
减少握手次数会增加遭受攻击的风险,例如 SYN 洪泛攻击。攻击者可能会发送大量伪造的 SYN 请求,导致服务器建立大量半连接,消耗服务器资源,甚至使服务器瘫痪.

4、为何四次挥手,三次行吗,两次行吗

1、为什么三次挥手不太合适
在 TCP 连接关闭过程中,需要考虑到双向的数据传输通道。假设客户端(A)和服务器(B)之间有数据传输,当 A 想要关闭连接时,A 发送一个 FIN(结束标志)给 B,此时 A 到 B 这个方向的数据传输通道 A 认为可以关闭了,这是第一次挥手。
B 收到 FIN 后,会回复一个 ACK(确认标志)给 A,这表示 B 已经收到了 A 的关闭请求,此时这个 ACK 只是确认了 A 到 B 方向的通道关闭请求,这是第二次挥手。但是 B 可能还有数据要发送给 A,所以不能直接关闭 B 到 A 方向的通道。
只有当 B 发送完自己的数据后,B 再发送一个 FIN 给 A,这是第三次挥手,表示 B 到 A 这个方向的数据传输通道也可以关闭了。
最后 A 收到 FIN 后,回复一个 ACK 给 B,这是第四次挥手,确认 B 到 A 方向的通道关闭。
如果只有三次挥手,就可能出现 B 还有数据没发送完,但是连接却被强制关闭的情况,导致数据丢失。
2、两次挥手存在的问题
如果只有两次挥手,当 A 发送 FIN 给 B 后,B 回复 ACK,然后直接关闭连接。这就完全没有考虑 B 到 A 方向的数据传输情况。
例如,B 可能还有大量的数据正在发送给 A 的途中,或者 B 还没来得及处理 A 的关闭请求(比如 B 的接收缓冲区还有数据没处理完),这种情况下直接关闭连接会导致数据丢失、数据不完整等问题。
而且从网络状态的维护角度来看,两次挥手不能准确地告知双方两个方向的连接都已经妥善处理完毕,会使得网络状态变得混乱,不利于网络资源的合理回收和再利用。


http://www.ppmy.cn/server/151637.html

相关文章

python飞机大战游戏.py

python飞机大战游戏.py import pygame import random# 游戏窗口大小 WINDOW_WIDTH 600 WINDOW_HEIGHT 800# 颜色定义 BLACK (0, 0, 0) WHITE (255, 255, 255)# 初始化Pygame pygame.init()# 创建游戏窗口 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))…

0基础学java之Day29(单例模式、死锁)

单例模式 理解:在整个项目中,该类的实例只能有一个 1.饿汉式 优点:线程安全 缺点:浪费资源 public class A { ​private static A a new A();private A(){}public static A getInstance(){return a;}public static void met…

【C语言】头文件”“和<>的详解

前言 作者在刚开始学C语言的时候&#xff0c;都是用的< >去引用头文件&#xff0c;但在学习STM32的时候发现&#xff0c;程序中大量使用" "去引用双引号。 那么二者有什么区别呢? 无论使用哪种方式&#xff0c;头文件的目的都是为了引用你需要的文件供你编程使…

网络安全(5)_访问控制列表ACL

6. 访问控制列表ACL 6.1 标准访问控制列表 &#xff08;1&#xff09;标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件。即&#xff0c;所有的条件都是基于源IP地址的。 ②基本不允许或拒绝整个协议组。它不区分IP流量类型。如Telnet、UDP等服务。 &#…

工作与学习方向

从去年9月开始线上实习&#xff0c;实习了6个月。 今年6月开始工作&#xff0c;在临实习期被辞退。 现在又在新公司干了三个月。 工作中哪些点于我是重要的呢&#xff1f; 代码规范,比如命名规范&#xff0c;以及一些写程序时需要注意的点。 需要好好学习设计模式&#xff0c;虽…

什么是单页面应用,有哪些特点

单页面应用 (Single Page Applications, SPAs) 的定义与特点 一、定义 单页面应用&#xff08;Single Page Application&#xff0c;简称 SPA&#xff09;是一种 Web 应用程序类型&#xff0c;它在用户与应用交互时不会重新加载整个网页。相反&#xff0c;SPA 使用 JavaScrip…

Shell自定义(二)

1.Shell自定义 1.初始化 定义全局变量environ&#xff0c;把g_env的内容用memset初始化为0&#xff0c;这里用malloc开辟的空间为对应环境变量的长度1&#xff0c;多1位置是最后结束符0&#xff0c;strcpy把此时的对应的环境变量拷贝到g_env里面&#xff0c;下面是新增一个环…

利用PHP和phpSpider进行图片爬取及下载

利用PHP和phpSpider进行图片爬取及下载&#xff0c;可以遵循以下步骤。phpSpider是一个开源的PHP爬虫框架&#xff0c;它可以帮助你轻松地抓取网页内容。以下是一个基本的步骤指南&#xff1a; 1. 安装phpSpider 首先&#xff0c;你需要确保你已经安装了Composer&#xff08;…