(八)tcp/ip之超时重传与保活

超时重传机制


超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.  

检测丢失segment的方法从概念上讲还是比较简单的,每一次开始发送一个TCP segment的时候,就启动重传定时器,定时器的时间一开始是一个预设的值(Linux 规定为1s),随着通讯的变化以及时间的推移,这个定时器的溢出值是不断的在变化的,有相关算法计算RTO,如果在ACK收到之前,定时器到期,协议栈就会认为这个片段被丢失,重新传送数据。

TCP在实现重传机制的时候,需要保证能够在同一时刻有效的处理多个没有被确认的ACK,也保证在合适的时候对每一个片段进行重传,有这样几点原则:

1 . 这些被发送的片段放在一个窗口中,等待被确认,没有确认不会从窗口中移走,定时器在重传时间到期内,每个片段的位置不变,这个地方其实在滑动窗口的时候也有提到过

2 .只有等到ACK收到的时候,变成发送并ACK的片段,才会被从窗口中移走。

3 .如果定时器到期没有收到对应ACK, 就重传这个TCP segment

重传之后也没有办法完全保证,数据段一定被收到,所以仍然会重置定时器,等待ACK,如果定时器到期还是没有收到ACK,继续重传,这个过程重传的TCP segment一直留着队列之内。
 

快速重传机制


在超时重传中,重点是定时器溢出超时了才认为发送的数据包丢失,快速重传机制,实现了另外的一种丢包评定标准,即如果我连续收到3次dup ACK,发送方就认为这个seq的包丢失了,立刻进行重传,这样如果接收端回复及时的话,基本就是在重传定时器到期之前,提高了重传的效率。

在传输过程中会出现out-of-order的现象,但是在滑动窗口中会有严格的顺序控制,假设有4,5,6三个待接收的数据包,先收到了5,6,协议栈是不会回复对5,6包的确认,而是根据TCP协议的规定,当接收方收到乱序片段时,需要重复发送ACK, 在这个地方会发送报文4 seq的ACK,表明需要报文4没有被接收到,如果此后收到的是报文7,那么仍然要回报文4 seq的ACK,如果连续发送3个 dup ACK,接收端认为这个片段已经丢失,进行快速重传。
 

保活机制

保活机制:是一种在不影响数据流内容的情况下探测对方的方式。它是由一个保活计时器实现的。当计时器被激发, 连接端将发送一个保活探测(简称保活)报文 , 另一端接收报文的同时会发送一个ACK作为响应。

保活功能在默认情况下是关闭的,TCP连接的任何一端都可以请求打开这一功能。保活功能可以被设置在连接的一端、两端,或者两端都没有。

但是保活机制也存在一定的争议:保活机制是一个可选择激活的功能。它可能会导致一个好的连接由于两端系统之间网络的短暂断开而终止。

机制
在一段时间(称为保活时间,keepalive time)内连接处于非活动状态,开启保活功能的一端将向对方发送一个保活探测报文。如果发送端没有收到响应报文,那么经过一个已经提前配置好的保活时间间隔(keepalive interval),将继续发送保活探测报文,直到发送探测报文的次数达到保活探测数(keepalive probe),这时对方主机将被确认为不可到达,连接也将被中断。

报文
保活探测报文为一个空报文段(或1个字节),序列号等于对方主机发送的ACK报文的最大序列号减1。 
因为这一序列号的数据段已经被成功接收,所以不会对到达的报文段造成影响,但探测报文返回的响应可以确定连接是否仍在工作。接收方收到该报文以后,会认为是之前丢失的报文,所以不会添加进数据流中。但是仍然要发送一个ACK确认。

探测及其响应报文丢失后都不会重传。探测方主动不重传,相应方的ACK报文并不能自己重传,所以需要保活探测数。

保活检测的结果
TCP保活功能工作过程中, 开启该功能的一端会发现对方处于以下四种状态之一: 
1. 对方主机仍在工作 
服务器端正常收到ACK,说明客户端正常工作。 
请求端将保活计时器重置。重新计时。

对方主机已经崩溃 
对方的TCP将不会响应ACK。 
超过保活探测数以后,认为对方主机已经关闭,连接也将被断开。

客户主机崩溃并且已重启 
客户端响应是一个重置报文段,请求端将会断开连接。

对方主机仍在工作 
但是因为其他原因(网络问题)就是没有收到ACK。

总结
现在所有主流TCP版本都实现保活功能。应用层可以选择是否开启这一功能来建立连接。

若某个连接长时间处于空闲状态( 通常这段时间设定为2 小时) , 在该连接的一端会发送一个探测数据包( 虽然这个数据包可以包含任何数据, 但通常情况下会包含“ 垃圾” 字节) , 从而实现保活功能。可能会发4种不同的情况:另一端仍在工作; 另一端已经崩溃; 另一端崩溃并且已经重新启动; 另一端当前无法到达。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值