上一篇的传送门:TCP/IP常见问题总结(一)
6. TCP滑动窗口与回退N帧协议
TCP作为一个提供可靠服务的传输层协议,对于数据的发送必须拥有一套良好的反馈机制,让发送方得知接收方接收到了数据,而TCP下的反馈机制大部分借鉴与数据链路层的反馈机制,因此在此我们分析一下数据链路层的反馈机制。
1.停等协议
停等协议是一种非常简单的协议,发送方在发送完一帧数据后就一直等待接收方的确认信号(ACK),要是超时就重传数据,只到收到ACK信号后才发送下一帧数据。停等协议效率较低(如此低效数据链路层都不适用,TCP协议当然也不用了),其示意图如下:
2.滑动窗口协议之GoBackN
由于发完一帧数据后发送方就挂起等待的行为非常低效,因此滑动窗口协议诞生了。滑动窗口的意思其实就是一个缓冲区(发送方为发送窗口,接收方为接收窗口),缓冲区的内容会随着数据的发送而移动,因此称为滑动窗口。
我们先来讲讲滑动窗口协议中的GoBackN协议。滑动窗口协议允许发送方连发数帧,每发一帧都对应 一个计时器timeout,而GoBackN协议要求发送方把丢失帧及其之后的帧全部重传(因为光凭一个ACK并不能确定哪些帧出现了丢失,ACK的含义是:期待接收序号为N的帧,之前所有的帧都已经成功收到并依此交给了上层)。其示意图如下:
上图由于Data2丢失,导致了Data2~Data5的重发(窗口大小为4)
3.滑动窗口协议之选择性重发
由于GoBackN中重发已经发送过的数据有点多余,因此选择性重发协议诞生了。选择性重发协议在ACK上引入了NAK的概念(否定性确认帧),表示小于N的帧已经全部收到并交给了上层,而第N帧丢失了,要求重发第N帧。当发送方接到NAK后,只要重发NAK表示的那一帧即可。其示意图如下:
上图中发送方发送的Data2丢失了,因此收到了接收方的NAK2,然后发送方只需重新发送Data2即可。
在TCP协议中使用的也是选择性重发协议。
7. Http的报文结构
Http协议(Hypertext