TCP四种定时器

本文详细介绍了TCP的四种定时器:重传定时器用于控制丢失报文段的重传;坚持定时器解决接收端缓存满导致的死锁问题;时间等待计时器确保数据完整传输和避免旧报文干扰新连接;保活定时器探查空闲连接的状态,防止资源浪费。通过这些定时器,TCP确保了可靠的数据传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重传定时器

为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报文段时,就创建这个特定报文段的重传计时器,可能发生两种情况:若在计时器超时之前收到对报文段的确认,则撤销计时器;若在收到对特定报文段的确认之前计时器超时,则重传该报文,并把计时器复位。

坚持定时器

问题:当接收端的缓存满的时候,接收端回向发送端回复一个窗口为0的ack,当是ack的输出是不可靠的,如果ack丢失了,那么,发送端永远不会向接收端发送数据,因为他认为接收端的缓存是满的,而接收端却在等待发送端发送数据,这就产生了死锁。
 
解决方法:使用坚持定时器。当发送端接收到接收端窗口为0的回复,那么发送端启动坚持定时器,然后定期向接收端发送一个字节的报文段的,告知服务器我需要窗口了,直到接收端回复缓存可用为止。

流程:
1. 发送端收到0窗口通告后,就启动坚持定时器,并在定时器溢出的时候向客户端查询窗口是否已经增大。
2. 在定时器未到,就收到非零通告,则关闭该定时器,并发送数据。
3. 若定时器已到,还没有收到非零通告,就发探查报文。
4. 如果探查报文ACK的通告窗口为0,就将坚持定时器的值加倍,TCP的坚持定时器使用1,2,4,8,16……64秒这样的普通指数退避序列来作为每一次的溢出时间,重复1、2、3步,如果通告窗口非零,发送数据,关闭定时器。

糊涂窗口综合征:糊涂窗口综合症是指当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小; 极端情况下,有效载荷可能只有1个字节;传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象。也就是说,传输有用的数据很少,负荷大,然后开销大。
Solution:
接受方:接受方不通告小窗口。通常的做法是除非窗口可以增加一个报文段或者可以增加接受方缓存的一半,否则不予通告窗口更新。
发送方:满足下述条件之一再发送数据:
① 可以发送一个满长度的报文段
②可以发送至少是接受方通告窗口大小一半的报文段
③ 可以发送任何数据并且不希望接收ACK(没有未被确认的数据)或者该连接上不能使用Nagle算法

时间等待计时器:TIME_WAIT 2MSL(报文最大生存时间)

两大功能:
1. 确保数据的完整传输,和ACK
2. 保证新连接中不会出现之前连接中延迟到来的报文段
详细流程如下:
1. TIME_WAIT 确保有足够的时间让对端收到了ACK,如果被动关闭的那方
没有收到 ACK,就会触发被动端重发 FIN。因为最后一次确认应答 ACK 报文段很有可能丢失,因而使被动关闭方处于在LIST_ACK 状态的,此时被动关闭方会重发这个 FIN+ACK 报文段,在这等待的 2MSL 时间内主动关闭方重新收到这个被动关闭方重发的 FIN+ACK 报文段,因此,主动关闭方会重新发送确认应答信息,从而重新启动 2MSL 计时器,直到通信双方都进入 CLOSED 状态。如果主动关闭方在 TIME_WAIT 状态不等待一段时间就直接释放连接并进入 CLOSED 状态,那么主动关闭方无法收到来自被动关闭方重发的 FIN+ACK 报文段,也就不会再发送一次确认 ACK 报文段,因此被动关闭方就无法正常进入CLOSED 状态。
2. 有足够的时间让这个连接不会跟后面的连接混在一起。防止已失效的请求连接出现在本连接中。在连接处于 2MSL 等待时,任何迟到的报文段将被丢弃,因为处于 2MSL等待的、由该插口(插口是IP和端口对的意思,socket)定义的连接在这段时间内将不能被再用,这样就可以使下一个新的连接中不会出现这种旧的连接之前延迟的报文段。

保活定时器(HTTP也有,不同)

1.保活定时器的由来
现实中可能存在一种空闲的TCP连接–连接的双方都没有向对方发送数据,则在两个TCP模块之间不交换任何信息,这意味我们可以启动一个客户和服务器建立连接,然后离去很长时间,而连接依然保持。而且中间的路由器可以崩溃或重启,只要两端的主机没有重启,则依然保持连接建立。
服务器为了知道客户机是否崩溃或关机等情况,从而引入了保活定时器来探查这种情况。
2.工作原理
如果一个给定的连接在2小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一:
(1)客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方的正常工作的,服务器在2小时内将保活定时器复位。
(2)客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应,服务器将不能收到对探查的响应,并在75秒后超时,总共发送10个探查,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
(3)客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个RST复位,使得服务器终止这个连接。
(4)客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能够区分状态4与2之间的区别,它所能发现的就是没有收到探查的响应。

服务器不用关注客户主机被关闭或者重新启动的情况。当客户机被关闭之后,所有的应用进程也被终止,这会使客户的TCP在连接上发出一个FIN。接收到FIN会使服务器的TCP向服务器进程报告文件结束,从而服务器检测到了这种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值