TCP的四种主要定时器:
1、重传定时器:配合确认机制使用,防止报文段丢失。如果在超时时间之前收到接收方ACK,则撤销定时器,否则重传该报文段,并复位重传定时器,重新计时。
2、坚持定时器:当出现零窗口后,避免接收方窗口更新报文丢失而定时探测接收方窗口大小的定时器。
3、保活定时器:检测空闲连接中的TCP双方是否还处于连接中。
4、2SML定时器:指定TIME_WAIT状态的持续时间。
重传定时器
指数退避(Exponential Backoff ) :发送方因为屡次丢失ACK而连续重传时,每次重传之间的时差增加一倍,总体程指数增长。它的首次重传是在1.5秒后,往后的每次重传的时间是1.5*2的N次方,最大是64秒,重传的时间体现为1、3、6、12、24、48、64.....总共重传12次,大约经历9分钟,9分钟之后发生RST报文断开连接。
RTT与RTO
RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;
RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。
重传时的重新分组
当出现超时并需要重传数据时,可能不会传同样大小的报文段,可能会重新分组而传输一个更大的报文段(但不会超过SMSS大小),因为TCP使用的是字节序号而不是报文段序号来进行标识数据,在协议中,这样也是允许的。
坚持定时器
坚持定时器是由发送方维护的,当接收方通告零窗口后被设置的,用于定期探测接收方窗口大小的定时器。
坚持定时器的定时时间也采用了指数退避的方式(最大间隔为60秒)。
糊涂窗口综合症
表现为:当出现零窗口并在进程读取缓冲区的数据后,接收方在窗口较小时就开始通告,并且发送方也配合地发送少量的数据,传输效率低下。
糊涂窗口综合症解决办法:
- 在接收端解决,接收方不通告小窗口(小于一个MSS或窗口大小小于接收方缓存空间一半大小),当缓冲区较小时回复的ACK中窗口大小还是为0
- 在发送方解决,发送方只有在报文段大小满足一个SMSS大小或可以发送的数据至少是接收方通告的最大窗口时才发送报文段。
保活定时器
保活定时器的作用是探测长期空闲的TCP连接(连接双方仅仅是建立了连接但是没有发送数据)双方是否还处于连接之中,主要是检测对方是否崩溃或者意外关机,如果是,则己方需要终止连接,来释放资源。
RFC是不建议开启TCP的保活定时器的。如果需要探活,应该在应用程序中实现。
如果一个连接在2小时内相互之间不交换任何数据,则开启保活定时器的一方就会向另一方发送探查报文段,
如果
- 对方正常并且从己方可达,则重置定时器,准备下一次探查
- 对方崩溃,并且关闭或是正在重新启动,则对方不会响应,并在75秒后超时,己方会发总共10个探查报文,每个间隔75秒,如果一个响应都没收到,则认为对方已经关闭,己方终止连接。
- 对方崩溃但是重新启动,对方将会响应己方的探查报文一个RST报文,己方收到后会终止连接。
- 对方正常,但是从己方不可达,此情况的表现与2一致,TCP不能区分2与4,都是收到探查响应。
2SML定时器
- 防止执行被动关闭的一端收不到对FIN的ACK
- 在2MSL的等待时间内,对同一插口对是不能建立新的连接的,能够防止新的连接收到延迟到达的数据。