TCP是保证数据可靠传输的。那么TCP是怎么保证传输可靠的呢?
TCP有特定的计时器来保证正常的工作。重传计时器是为了保持数据丢失的时候,避免发送端无线等待接收方的ACK包。
重传计时器超时重传
重传计时器的创建
TCP发送报文段时,就创建了特定报文的重传计时器
因此 Q1:重传计时器可能同时存在多个?
重传计时器的撤销or重置
当在计时器截止时间之前收到了特定报文的ACK,则该计时器被撤销
当在计时器截止时间之前没有收到特定报文的ACK(两个情况,发送成功,但是ACK包因为其他原因没有及时到达;发送失败。对发送方来说,发送方会认为是发送失败),则重传这个报文,并重置计时器
重传超时时间(RTO,Retransmission TimeOut)
因为传输情况是无法预知的。TCP通过每一个传输的往返时间(RTT,Round Trip Time)来加权计算RTT
主要的算法有:
Karn算法:为了避免二义性而提出的算法,收集的RTT样本不包括有ACK二义性的样本
快速重传
丢包重传
如果发送端连续收到三个重复确认,则不需要等到重传计时器超时,启动快速重传。
detail
TCP采取拥塞窗口来控制数据流量。(拥塞控制具体细节会在另外的笔记中详细总结)
几个基本的概念
cwnd:拥塞窗口
ssthresh:慢启动门限,拥塞窗口未超出门限时,采用慢启动算法,超出门限时,采取拥塞避免算法
当发送端收到第三个重复的ACK时,将ssthresh减小为原来的一半(很形象的吧) 然后重传该报文段,cwnd大小调整为ssthresh+报文段大小的三倍 大小
SACK重传
ACK是累计接收的。
前文TCP报文中有可选项,SACK是其中的一个可选项,只要用来告知发送端接收到的数据段,避免已经接收到的数据重传。