TCP流量控制--滑动窗口

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

发送发的发送窗口不能超过接收方给出的接收窗口的数值。TCP的窗口单位是字节,不是报文段。

通过下图可以说明如何利用滑动窗口机制进行流量控制。

TCP流量控制--滑动窗口

注意: 

  • 当窗口数为 0 时,发送者不能正常发送数据段,除非:

    • Urgent数据。比如,用户想杀掉远端机器上的进程的时候,可以发送数据

    • 发送者可以发送一个字节的数据段,以便让接收者再次发送期待接收的字节号和窗口数(避免死锁

  • 持续定时器--用来避免死锁

    • 死锁的产生

      • 接收方发送了一个窗口数为零的确认(窗口更新),告诉发送方等待。

      • 稍后,接收方空出了缓冲,发送更新窗口的数据段,但是,很不幸,该分组丢失啦!

      • 现在,收发双方都在等待对方发送数据段过来,但永远等不到!死锁产生

    • 死锁解决方案:发送方在收到win=0时,启动一个持续定时器,如果定时器超时没有收到更新窗口,则发送一个探测数据段,引发对方重新发出更新窗口。

  • 优化传输效率

    • 优化发送端

      • 尽量不发送数据含量小的数据段

      • 缓存应用层的数据,达到一定量再发送

    • 优化接收端(糊涂窗口综合征)

      • 让接收方等待一段时间

      • 或者,等到接收缓存已有一半空闲的空间