目录
7.5 TCP滑动窗口与拥塞控制
我们假设一个场景,发送方发送了滑动窗口内的所有段,但是段21在传输过程中丢失;31最先到达,被接收方顺利接收;41,51,61随后到达,未在一个RTT内被接收方接收。
此时接收方会发送并将接收窗口剩余的大小发送给接收方,即。
随后,段41和51逐步到达:
由于在定时器时间内发生了三次冗余的接收(没有收到21,但31,41和51都已收到)。会立刻触发快速重传:。
原始数据流+丢包控制
在单一的点对点链路上已经存在了很长时间。TCP最初借鉴了链路层拥塞控制的经验,但这导致了一些不好的设计决定。
两种类型的流量控制
Go-back-N(回退N步)
当一个数据包丢失时,回到它被传送的地方,并(重新)传送从该点开始的所有内容。
优势:接收者不需要存储/重新排序数据包。
Selective Repeat(选择性重传)
只重传丢失的数据包。
数据包不按顺序到达。接收者必须存储失序的数据包,以便将其按顺序发送给应用程序。更复杂,只有在数据包损失比较普遍的时候才有帮助。但是由于链路层对错误是有修复的,数据包损失并不普遍。
继续上面的滑动窗口情景,当快速重传发生时:
此时,相当于一个死锁:
- 发送方不会再发送任何数据(窗口大小为0)。
- 接收方不会收到任何数据,所以发送方不会发送任何ACK来增加窗口。
随后通过接收方滑动窗口内的段被上传给应用程序解除死锁状态:
接收者可以通过发送WindowUpdate来启动更新:
发送者可以通过发送一个ZeroWindowProbe来监控和启动更新:
收到0大小的窗口时,发送方: