深入理解TCP协议之流量控制

885 阅读4分钟

深入理解TCP协议之流量控制

本文正在参与 “网络协议必知必会”征文活动

TCP流量控制

在网络通讯中,由于双方的 发送/接收效率的不可控性(指网速与内存写入速度大概率不对等),如果发送方一直发送文件但接收方并没有空间存储,接收方会直接丢弃掉这部分内容。想象一下,如果要下载1GB内容但硬盘只有10M,在下载的过程中会造成大量的数据包被抛弃。所以需要在数据传输前,接收方应该提前告知存储空间的最大值,控制发送方的发送速率,把传输的效率控制在接收方的可控范围内,我们把对发送方的传输效率控制,称为流量控制。

流量控制的概念

在介绍流量控制之前,需要先引入几个流量控制的概念,方便理解,也可以更好的代入到具体案例中去。

  • 滑动窗口 滑动窗口分为两部分:发送窗口及接收窗口(rwnd);分别代表了发送方及接收方的数据流。滑动窗口中存储着一次数据请求中的数据内容。

  • 数据状态 由于传输过程是动态改变的,所以滑动窗口中的数据也会跟随传输状态的改变而分为:

    1. 已被接收内容
    2. 正在传输内容
    3. 等待传输内容
    4. 超出接收方最大值的内容(这部分内容要等待接收方从缓存中接收已发送数据,等待应用处理,释放空间后才能继续发送。)

TCP 发送窗口.png

TCP的本质是从发送方把数据放入自己的缓存区,通过包的形式发送到接收方的缓存中,接收方会在收到数据包后做存储并处理;流量控制在其中做的事情就是:当接收方缓存区已满的情况下,发送端就应该停止发送数据,防止大量的数据无法接收最后被丢弃的风险。所以当接收方请求数据时,会提前告知发送端自己的缓存区的剩余空间,发送方会在每次发送数据后计算接收方的剩余空间。当剩余空间为0时就可以停止发送进入等待状态,等待接收方重新连接携带来最新的剩余控制值后,再次根据窗口值计算,发送未完成的内容。

流量控制中的特殊情况

在流量控制中,一般情况是发送端的发送窗口内存占用与接收方的接收窗口是在同步处理并更新窗口大小的,不过也有极端情况。

  • TCP window full(窗口耗尽) 通过wireshark对网络进行抓包时,当发送方的 已发送数据 = 接收方的 缓存区剩余空间时,会将最后一次的发送状态标记为 window full,表示发送内容已经达到了接收方剩余空间的极限,需要等待接收方处理后,将新的缓存剩余空间更新后才能继续存储。但如果接收方一直处于繁忙状态或者发送的包在传输中丢失了,发送方可能就要一直等待下去,所以为了避免长时间等待,TCP中设计了 Zero Window(0窗口探测)这个功能。

  • TCP Zero Window(0窗口) 功能的具体逻辑是 发送方在 触发 接收方存储空间最大值后,为了提高传输效率,会隔一段时间(上次发送时间*2)发送一个len=0,win=0,Seq=接收方ACK-1,最多会发送16次探测包提醒接收端反馈,提醒接收方发送包过来更新它最新的剩余缓存空间。

以上就是TCP流量控制的全部内容了,个人理解,如果有错误或偏差,也希望大家多多指出斧正,感谢大家花时间读到这里。