一、TCP流量控制
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
1、利用滑动窗口实现流量控制
注:每个报文段为 100 字节长,而数据报文段序号的初始值设置为 1。
在箭头上面大写 ACK表示首部中的确认位 ACK,小写 ack 表示字段的值。只有 ACK = 1 时,确认号字段才有意义。
从上图,可以看出接收方的主机 B 进行了三次流量控制。第一次把窗口减小到 rwnd = 300,第二次减小到 rwnd = 100,最后减小到 rwnd = 0,即不允许发送方在发送数据了。这种发送方暂停发送将持续到主机 B 重新发出一个新的窗口值为止。
2、持续计时器
考虑存在一种情况:在图中,B 向 A 发送的带有新的接收窗口值的报文段丢失, A 一直等待 收到 B 的发送的非零窗口的通知,而 B 也一直等待 A 发送的数据。如果没有其他措施,这种相互等待的死锁局面将会一直延续下去。
为了解决这个问题,TCP 为每个连接设有一个持续计时器。
(1)只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。
(2)若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
(3)如果窗口值仍然为零,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是零,那么死锁的僵局就可以打破了。
3、必须考虑效率传输
可以用同的机制来控制TCP报文段的发送时机。例如:
(1)第一种机制:TCP维持一个变量,它等于最大报文段长度 MMS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
(2)第二种机制:由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(PUSH)操作。
(3)第三种介质:发送方的一个计时器期限