TCP相关内容 | 青训营
这篇文章尝试理解一下TCP的重传和滑动窗口机制。当然TCP机制很复杂,全然是些皮毛。
重传机制:TCP是可靠的传输协议,实现可靠性,重传机制十分重要。常见有几种重传机制,超时重传、快速重传、SACK、D-SACK。
超时重传,一方发送请求,并附上自己的序列号和确认应答号(就是下次期望收到数据的序列号),当出于各种原因没有收到对方的应答消息,超过一定时间就会重发数据,就是超时重传。也分两种情况,一种是发送的数据包丢失,另一种是应答数据包丢失。
超时重传的时间(RTO)设置应该比报文一个往返的时间(RTT)长一点。所以并不是一个固定的值,而是动态变化的。以Linux系统为例,第一次计算RTO:RTO = 3RTT,后序计算RTO:RTO = (R1 + 0.125 (R2 - R1)) * 0.25 + 4 * (0.325 * R1 + 0.25 * |R2 - R1|),R1是第一次测量的RTT,R2是后序测得RTT。
超时重传每次的时间间隔都是加倍的,所以等的时间有点长,所以有了快速重传。简单说客户端收到了ACK3报文,应该发送Seq3数据包,但是这个数据包丢失了,后续的Seq4、5、6都发送到达了,但服务端还是会发送先前的ACK3数据包。客户端3次收到就会重发Seq3数据包(在定时器过期之前)。这样就不必等待时间,三次重申,直接重传了,但是如果有两个或以上的连续的数据包丢失了,这个机制就有了问题,重传一个不解决问题,重传所有又浪费资源。
所以就有了SACK机制,在快速重传机制上,在TCP头加一个“标签” :SACK,告诉发送方已经收到数据的信息,这样配合快速重传机制,就会准确的知道是哪一个数据需要重传。
还有一个 D-SACK ,比如当应答报文200丢失,发送方也会重传数据包Seq199,接收方就收到了重复的数据,于是回复SACK200,代表我已收到200之前的所有数据,这样发送方就知道是应答报文丢失
待续...