TCP流量控制

TCP流量控制

目录

  • 概述
  • 利用滑动窗口实现流量控制
  • 零窗口
  • 传输效率

概述

一般来说,我们总希望数据传输得快一点, 但是如果发送方把数据发送得太快, 接收方就可能来不及接收,这就会造成数据的丢失.流量控制其实就是让发送方的发送速率不要太快, 要让接收方来得及接收.

利用TCP滑动窗口实现流量控制

其实TCP流量控制本质上是利用滑动窗口机制来实现的.接下来,结合例子来解释TCP的流量控制.

如图:

现在假设A向B发送数据. 在连接建立时, B告诉A:我的接收窗口为400.因此A的发送窗口不能超过B的发送窗口不能超过接收方窗口的数值.现在假设每个报文段的字节为100, 而报文段的初始值为1.

仔细观察上图, 接收方B进行了3次的流量控制. 第一次吧窗口值缩小到了300.第二次又减到100.最后减到0.即不允许对方再发送数据了.

零窗口

现在考虑一种情况. B向A发送了0窗口报文段不久后, B的接收缓存又有了一些空间.于是B向A发送了rwnd = 400的报文段. 然而这个报文在传送的过程中丢失了. 于是A只能一直等待B发送非零窗口的通知,而B一直等待A发送数据.此时如果没有其他措施,这种相互等待的局面会一直持续下去.

为了解决这个问题, TCP为每个连接设有一个持续计时器.只要TCP连接接收到零窗口,就启动持续计时器.若持续计时器时间一到,就发送一个零窗口探测报文段.而对方就在确认这个探测报文段时给出现在的窗口值.如果窗口值不是零的话,那么死索界面将会被打破,否则就重新启动持续计时器.

传输效率

发送效率

应用程序把数据传送给TCP的发送缓存后, 剩下的任务就由TCP来控制了.此时,TCP可以采用不同的机制来控制发送的时机.例如:

  • TCP维护一个变量,它等于最大报文长度MSS.只要缓存中存放的数据达到MSS字节时,就组装成一个报文发送出去.
  • 由发送方的应用程序指明要求发送报文段,也就是TCP的PSH操作.
  • 第三种机制是发送方的计时器期限到了,就把当前已缓存的数据组装成报文发送出去.

    在TCP的实现中, 广泛是使用Nagle算法.该算法如下:若发送应用程序把要发送的数据逐个字节都送到TCP缓存中, 则发送方会把第一个字节先发送出去,把后面到达的字节缓存起来.当发送方收到对第一个数据的确认时,再把缓存的字节组装成报文段发送出去,同时继续对后来到达的数据进行缓存.这样做,可以有效的提高网络的吞吐量.

接收效率

现在假设TCP接收方的缓存已经满了,而应用进程一次只从接收缓存中读取1个字节,然后向发送方发送确认, 并把窗口值设置为1.如此循环下去, 会使网络的效率很低.

要解决上面的问题,可以有下面两种方法:

  1. 让接收方等待一段时间,使得接收缓存有足够空间容纳一个MSS再发送确认.
  2. 让接收方等待一段时间,使得接收缓存已有一半的空闲的空间.

上面的两种方法可以交替使用.

参考资料

计算机网络

分享到