TCP重传的原理
在TCP重传的理论中,重传计时器是用于决定是否有必要进行数据包重传的一个主要机制。重传计时器维护着一个叫做重传超时(Retransmission timeout,RTO)的值。在使用TCP进行数据包的传送时,重传计时器就会被启动。当收到数据包的ACK,也就是确认数据包时,计时器就会停止。从发送数据包到接收到确认数据包的时间,被称作往返时间(Round-trip time,RTT)。我们将若干个往返时间求和并计算平均值,就可以得出最终的RTO值。
我们通过实验文件来学习TCP重传技术:
重传.jpg (189.16 KB, 下载次数: 12)
2016-8-3 11:45 上传
上面的第一个数据包是一个正常的TCP PSH/ACK数据包,接下来如果正常的话会受到一个用于响应的TCP ACK数据包,但是这里的第二个数据包却是却是一个TCP Retransmission数据包,表明这是一个重传:
重传1.jpg (195.67 KB, 下载次数: 18)
2016-8-3 11:46 上传
而且接下来的几个数据包都是重传数据包。
TCP的快速重传
如果接收方接收到了乱序的数据包,就发送重复的TCP ACK数据包。TCP在其头部使用序号和确认字段,以确保数据被可靠接收并以发送的顺序进行重组。我们上次课说过,Seq序列号可以帮助数据进行有序的传输。
我们继续通过分析实验文件来学习TCP的快速重传:
ack.jpg (235.71 KB, 下载次数: 15)
2016-8-3 11:48 上传
观察第一个数据包,这个TCP ACK数据包是从数据的接收方发往数据的发送方,是对前一个数据包的确认。该数据包的ACK值为期望的下一个数据包的seq值。我们来看第二个数据包:
ack2.jpg (231.16 KB, 下载次数: 8)
2016-8-3 11:49 上传
发现这个数据包的seq的值是10945,并不是期望的1,所以说明数据在传输中可能出现了丢包的情况。当接收方发现这个问题之后,就会向发送方发送一个重复的ACK数据包:
ack3.jpg (243.19 KB, 下载次数: 6)
2016-8-3 11:59 上传
接下来的数据包依旧不是我们期望的内容,所以接收方发送第二个重复ACK数据包,接下来的还不是期望的数据包,所以接收方发送了第三个重复ACK数据包。
由于发送方收到了三个重复的ACK数据包所以,它会对这个丢失的数据包进行重传:
ack4.jpg (237.94 KB, 下载次数: 8)
2016-8-3 12:00 上传
这就是快速重传,在数据流中的传递方式。
然后我们观察如下数据包:
aa.jpg (126.46 KB, 下载次数: 8)
2016-8-3 12:01 上传
该位置内容是接收方告诉发送方5473-12313之间的数据包都已经收到了。
di1.jpg (22.81 KB, 下载次数: 12)
2016-8-3 12:03 上传
Windows操作系统会重传5次,而Linux则为15次。
di2.jpg (22.77 KB, 下载次数: 10)
2016-8-3 12:03 上传
通过上面的数据包分析,可知接收方会发送3个重复的ACK数据包。
d3.jpg (26.73 KB, 下载次数: 11)
2016-8-3 12:04 上传
接收方告诉发送方100-200之间的数据包已经收到。
di3.jpg (23.28 KB, 下载次数: 10)
2016-8-3 12:05 上传
通过重传的方式,来保证数据包不会缺失。