可靠数据传输需要用到的机制:
- 自动重传(ARQ):如果报文出错了,需要重传,这需要差错检测、接收方反馈(ack表示成功确认和nak表示失败确认)、重传三部分
- 有序到达:需要序号来标识数据包,确认是否是重传报文或者是否乱序到达报文
- 定时器:用于限制时延,超时则确认是丢包
- 流水线:为了加快传输速率,提高带宽利用率,在流水线中如果出现丢包或者乱序到达有两种应对方法
a) GBN(回退N步):只要出现丢包或者乱序到达,以后的数据包都不接收,全部需要重传
b) SR(选择重传):出现了丢包或者乱序到达,保留后接收到的数据包,同时提醒发送方重发丢失的数据包
TCP可靠传输的实现:
- 实现了自动重传,有ack应答报文,但是没有nak报文(nak时使用重复上一次ack代替,形成冗余ack报文)
- 实现了有序到达,用序列号标识一个报文,同时序号不是按“个”计算的,而是按字节计算的。举例来说,相邻的两个TCP报文,各100字节大小,它们的需要不会是0,1,而是0,100
- 实现了定时器:丢包的定时器时间设定在TCP当中是一个很有技巧的事情。TCP通过随机检测报文的送达情况获得若干个RTT(往返时间)样本,然后将其加权(新RTT样本的权重比旧RTT样本的更大),然后加上一个RTT偏差(不可能正好一个RTT就回得来,需要一个可容忍的浮动时间),得到超时重传的时间。公式是:
TimeoutRTT=EstimeedRTT(指数加权移动平均RTT)+4DevRTT(4倍的RTT偏差)
- 实现了流水线,当出现丢包或乱序时采取的策略既不是GBN也不是SR,看起来更像GBN一些。
- 超时时间计算:每一次确认丢包,TCP认为是网络拥塞,会将下一次的超时时间*2,避免加重拥塞
- 重复的ACK报文:即接收到对发送的同一报文的多次ACK报文,这是由于TCP没有否定确认,如果出现数据出错,或者报文乱序到达,只会重复应答最后一次正确接受的报文。TCP处理时认为这就是数据出错、发送数据乱序到达或者丢包的意思,但是网络的拥塞并不严重,此时TCP会启动快速重传机制
- 快速重传:即不用等丢包的计时器超时才重发报文,而是在3次冗余ACK之后立即发送冗余ACK确认的下一个序号的报文