TCP—定时器简介

本系列文章是博主学习TCP协议以来的个人笔记。博主不能保证本文所述内容绝对正确,

以请读者抱着怀疑的态度阅读本博客内的文字。如果读者因本博客内的文字造成损失,

本人无力负责。如果有任何谬误或者问题,希望读者不吝赐教。

 
定时器在TCP可靠传输的过程中起着举足轻重的作用。TCP在建立连接之后可能(保活
keep-alive定时器是可选的)会 启动四个定时器,分别是:
重传定时器:为了防止报文丢失或者损坏,TCP在发送一个报文以后启动重传定时器,
如果定时器溢出之前该报文的ACK还未到达,则重传该报文。重传定时器超时时间
(Retransmision Timeout)依赖于往返时间RTT,而RTT在传输的过程中是动态变化的,
而且变化范围较大,精准的计算RTT较困难,TCP有时间戳选项,为准确的计算RTT提供
了方便
坚持定时器:TCP报文段可能是不携带任何数据的ACK分节,接收端对此分节无确认必要。
假设有如下场景,A是发送端,B为接收端,B的通告窗口win大小为100字节,这时A发送
100字节到B,由于A的ACK告知B A.win=0,所以,A暂停发送数据等待A.win变大,稍后A的
接受缓存中的数据被上层应用处理,于是A.win增大,接着A发送ACK窗口更新通知B,如果这
个不携带任何数据的分节丢失,则A,B就会处于一种死锁状态(A等待B通知窗口更新,B等待A
发送数据)。为了解决这一问题,TCP发送方使用一个坚持定时器来周期性的向接收方查询,
以便发现窗口是否已经增大。这些从发送方发出的报文段称为窗口探查(window probe)

2MSL定时器:MSL是报文段做大生存时间(Maximum Segment Lifetime),设置这个定时器
有两个目的其一是为了测量连接处于TIME_WAIT状态的时间.这样可以让TCP再次发送最后
的ACK以防止这个ACK丢失(如果丢失,另一端会重传FIN)。
其二,为允许老的重复分节在网络中消逝。具体可以解释为,如果一个TCP连接在断开之前
有迷途分节尚未消逝,在断开该TCP连接之后立刻重启一个同样的连接(双方的IP地址和端口
port相同),这时之前的迷途的老分节可能对新的新的TCP连接接收,从而造成未定义的错误。
为了避免这种情况,TCP规定在TIME_WAIT状态,不能启动一个连接的化身。既然TIME_WAIT
状态维持2MSL,这就保证了一个连接上的分组及其应该在2MSL内都会消失。

保活定时器:这个定时器在选项中设置,默认是关闭的。如果开启这个选项,那么如果一个连
接闲置了一定时间以后,服务端会发送探寻分节给客户端判断客户端是否有响应。这个时间在
TCP的各种实现中不尽相同,但通常都在一小时以上。由于这个保活时间间隔太长,所以很多
需要频繁检测对端是否存活的应用都是在应用层自行开发心跳机制。博主计划近期实现一个简
单的心跳消息组件,希望到时候能够对此有更深入的探讨。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值