TCP连接的问题以及TIME_OUT状态

时间:2022-05-11 21:28:49

本文主要讨论两个问题

1、为什么TCP链接设计为三次握手(为什么不是两次或者四次)

2、TIME_OUT状态的一些问题

 

首先第一个,先看一个所谓 Two Generals' Problem

两个将军想要攻打同一个敌人,必须他们同时攻打才可能胜利。他们的通信方式,接设是信鸽传递。信鸽可能被其他人捕获从而达不到另一个将军的地方。

模拟过程如下:

A给B发信息,我们明天进攻如何?

假设B收到了,B给A回复信息:可以。这时候B是不敢明天进攻的,因为他不确定自己的消息是否被A接到。

假设A接到,A回复:收到你统一的消息。这时A也是不敢明天进攻的,因为他不确定自己这条信息是否被B收到。

假设B又收到这条消息,B回复。。。。。。这是B还是不敢进攻

就这样循环下去,结论是永远不能就此达成一致。永远不会进攻

 

这就是一个计算机网络中关于不可靠链路的一个问题,接着说为何在这样的链路上建立链接需要三次握手

接设是两次握手建立链接,那么服务器端的行为就可以概括如下:每接到一个SYN,便进入ESTABLISH状态。

考虑如下情形,客户端发送了一个SYN报文,一端时间后,超时。此时客户端撤销的这个请求。

不久后,服务器端又接受到了这个报文,如果是两次握手,服务器会进入ESTABLISH状态,并回复一个ack。

客户端不会理睬server的确认,也不会向server发送数据。(不确定)。然后服务器端白白浪费资源。

至于为何不是四次握手,我的理解是,其实

TCP链接逻辑上区分成两个通道,一个通道用于A-》B,另一个通道用于B-》A。这一点从链接建立阶段看不明晰,但是链接拆除阶段非常清楚。我们知道TCP链接的拆除是所谓的优雅拆除,任何一方都可以拆除自己发往对方数据的那个通道,而同时还要保证对方发往自己的数据能被正常处理。所以TCP链接拆除就要经历一个半链接的阶段。用四个协议数据包进行拆除。
再回过头看看链接建立阶段,就非常明确的看出来,这三次握手确实是用于建立这个链路上的两个通道的。
那么为什么要三次握手?最近看到弯曲评论上有一篇文章,说TCP链接甚至可以建立半链接,也就是只建立一个通道,数据只能单向流动。这时候的三次握手就退化成两次握手,一次Sync以及一个对应的Ack。

可以看到在服务器回复ACK时顺便带上了SYN信息。这样就是三次握手。

 

TIME_OUT状态主要是解决两个问题

1、重新发送最后一个ACK,我们可以看到TIME_OUT是整个TCP通信过程发送最后一个包的,如果不进入TIME_OUT直接关闭,那么最后一个ACK有可能丢失,这样对方重新发送FIN时,会收到错误信息。

2、CP数据包可能由于路由器异常而迷路,在迷路期间,数据包发送方可能因超时而重发这个包,迷路的数据包在路由器恢复后也会被送到目的地,这个迷路的数据包就称为Lost Duplicate。在关闭一个TCP连接后,如果马上使用相同的IP地址和端口建立新的TCP连接,那么有可能出现前一个连接的迷路重复数据包在前一个连接关闭后再次出现,影响新建立的连接。为了避免这一情况,TCP协议不允许使用处于TIME_WAIT状态的连接的IP和端口启动一个新连接,只有经过2MSL的时间,确保上一次连接中所有的迷路重复数据包都已消失在网络中,才能安全地建立新连接。

 

TIME_OUT的影响:

 

对于Client而言,每个连接都需要占用一个端口,而系统允许的可用端口数不足65000个(这也是在TCP参数优化后才能达到)。因此,如果Client发起过多的连接并主动关闭(假设没有重用端口或者连接多个Server),就会有大量的连接在关闭后处于TIME_WAIT状态,等待2MSL的时间后才能释放网络资源(包括端口),于是Client会由于缺少可用端口而无法新建连接。

 

  对Server而言(特别是处理高并发短连接的Server),Server端与Client建立的连接是使用同一个端口的,即监听的端口,每个连接通过一个五元组区分,包括源IP地址、源端口、传输层协议号(协议类型)、目的IP地址、目的端口,因而在理论上,Server不受系统端口数的限制。但是,Server对每个端口上的连接数是有限制的,它要使用哈希表记录端口上的每个连接,并受到文件描述符的最大打开数的限制。所以,如果Server主动关闭连接,同样会有大量的连接在关闭后处于TIME_WAIT状态,等待2MSL的时间后才能释放网络资源(包括哈希表上的连接记录和文件描述符),于是Server会由于达到哈希表和文件描述符的限制而无法接受新连接,造成性能的急剧下滑,性能曲线会持续产生严重的波动。对于这种情况,有三种应对方式:

 

  1. 试图让Client主动关闭连接,由于每个Client的并发量都比较低,因而不会产生性能瓶颈。
  2. 优化Server的系统TCP参数,使其网络资源的最大值、消耗速度和恢复速度达到平衡。