TCP可靠传输的实现
以字节为单位的滑动窗口:
窗口有两端
发送方:
低序号端表示在此之前的序号已经收到确认;
高序号端表示发送方现在最多只能发送到此序号为止,因为这端是根据接收端发过来的缓冲区大小而决定的。如果发送超过此序号的数据,很可能接收方会来不及接收。
窗口内部发送从低序号端开始依次发送数据(到高序号端为止),超时数据需要重传。
每次接收到确认帧,低序号端就会更新(因为又有数据被正确发送了嘛,低序号端之前的就是表示正确发送的数据),同时高序号端也更新,因为确认帧包含接收端窗口大小。
接收方:
低序号端表示在此之前的数据已经正确接收;
高序号端表示接收方的缓存目前只能放得下到此序号为止的数据,再多就放不下啦。
TCP标准并没有规定如何处理未按序到达的数据。
接收方要有积累确认的功能,也就是要积累一定按序到达的数据后,一次性发送一个确认帧。(这时候发送方低序号端前进到确认了的数据后边,高序号端是否后移是和缓存中数据被送往高层的速度有关系的,而不是和确认帧有关系)
超时重传时间的选择:
报文往返时间:收到确认时间---对应报文的发送时间
加权平均往返时间RTTs: 新的RTTs = (1-a) * ( 旧的RTTs) + a * (新的RTT样本)
超时重传时间RTO = RTTs + 4 * RTTd;
新的RTTd = (1- b) * ( 旧的RTTd) + b * | RTTs - 新的RTT样本 |
对Karn算法的改进:
报文每重传一次,就把超时重传时间RTO增大一些