发送端缓存结构

发送端缓存结构

Content #

发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分。

第一部分:发送了并且已经确认的。第二部分:发送了并且尚未确认的。第三部分:没有发送,但是已经等待发送的。第四部分:没有发送,并且暂时还不会发送的。

为什么要区分第三部分和第四部分呢?没交代的,一下子全交代了不就完了吗?

这是出于“流量控制,把握分寸”的需要。作为项目管理人员,你应该根据以往的工作情况和这个员工反馈的能力、抗压力等,先在心中估测一下,这个人一天能做多少工作。如果工作布置少了,就会不饱和;如果工作布置多了,他就会做不完;如果你使劲逼迫,人家可能就要辞职了。

到底一个员工能够同时处理多少事情呢?在 TCP 里,接收端会给发送端报一个窗口的大小,叫 Advertised window。这个窗口的大小应该等于上面的第二部分加上第三部分,就是已经交代了没做完的加上马上要交代的。超过这个窗口的,接收端做不过来,就不能发送了。

于是,发送端需要保持下面的数据结构。

  1. LastByteAcked:第一部分和第二部分的分界线
  2. LastByteSent:第二部分和第三部分的分界线
  3. LastByteAcked + AdvertisedWindow:第三部分和第四部分的分界线

Viewpoints #

From #

第12讲 | TCP协议(下):西行必定多妖孽,恒心智慧消磨难