TCP协议中的定时器
重传超时定时器
- 建立连接、传输数据,在发送SYN或FIN时,会启动一个定时器, 如果在定时器超时前没有收到ACK,就会重新发送。
- SYN发送的次数也有限制:cat /proc/sys/net/ipv4/tcp_syn_retries
- 传输数据过程中,当发送方发送一个报文段后,如果没有在RTO内收到确认,就会触发重传。重传定时器的时间是动态变化的。
坚持定时器
坚持定时器用于解决零窗口死锁问题:
- 当接收方通告一个零窗口时,发送方会停止发送数据。
- 如果接收方发送的窗口更新报文段丢失,那么发送方会一直等待,从而造成死锁。
坚持定时器会定期发送零窗口探测报文段,以确保接收方的窗口状态能够被发送方及时知晓。
保活定时器
保活定时器用于检测空闲连接:如果一个TCP连接长时间没有数据传输,保活定时器会发送保活探测报文段来确认对端是否仍然存活。如果探测失败,说明连接可能已经断开,TCP就会释放这个连接。
TIME_WAIT定时器
TIME_WAIT定时器在TCP连接关闭时使用,也称为2MSL定时器。
- 当连接进入TIME_WAIT状态时,该定时器开始计时。
- 确保连接的最后一次确认报文能够到达对端,并让网络中该连接的旧报文段自然消失,防止新连接收到旧报文段的干扰。
- MSL(Maximum Segment Lifetime)表示报文段在网络中的最大生存时间,通常为2分钟,因此2MSL是4分钟。
延迟应答定时器
延迟应答是TCP的一种性能优化机制。 1.当接收方收到一个数据报文段时,它不会立即发送ACK。
- 它会启动一个延迟应答定时器,通常时间很短,比如40毫秒。
- 在定时器设定的时间内,接收方会观察是否有数据要发送给发送方。
- 如果在这段时间内,接收方的应用层有了需要发送的数据,那么ACK就会和这个数据报文段一起发送出去。
- 如果定时器超时了,但接收方仍然没有数据要发送,那么它会单独发送这个ACK报文段。