Crab213's Blog.

TCP/IP详解阅读笔记3:TCP流量控制

2016/03/18

大块数据和交互数据

大块数据(bulk data)是指大包的数据,通常达到了TCP段数据传送的上限。交互数据(interactive data)是指交互程序产生的数据包,例如ssh,telnet,以及即时通讯软件,通常这样数据非常零碎,数目巨大。交互数据非常浪费网络带宽,因为其传输效率低下。比如如果一个TCP段只发送一字节的数据,那么此时TCP头至少20字节,IP头至少20字节,发生了严重的浪费,占用的大量的带宽,这就是所谓的小包问题。

ACK延迟

很多情况下TCP并不为每一个包发送一个ACK,因为ACK是累加性的,所以对多个包可以只发送一个ACK。因为减少了ACK的数量,所以这样做提高了网络传输效率。但是这样做提高了网络延时,会对一些实时性要求较高的应用造成影响,如网络游戏。TCP收到一个包后,会等待一阵子,希望能将ACK与自己想要发送的数据一起发出。

小包问题及Nagle算法

小包问题值某个应用程序连续不断的发送数据携带量很小的TCP包,导致网络阻塞的问题。Nagle算法的提出一定程度上解决了此问题。算法的工作机理是将这些小包整合为一个大包。在没有收到ACK的情况下,把所有小包囤积在缓冲区,收到ACK后,将小包整合,一次性发出。这个算法将TCP传输行为强制变成了“停止-等待-发送”。ACK收到的越快,那么包就发送的越快,也就是RTT控制着传输的速率。

延迟发送ACK与Nagle算法共存时造成的问题

如果延迟ACK与Nagle算法共存,就会产生一些问题。如果发送端给接受端发送了两个包,一个满的包跟着一个小包,那么如果接受端延迟发送ACK,那么发送段在没有收到ACK之前不会在发送小包数据,因此在接受端ACK延迟发送的时间内,双方都不会发送数据,而是互相等待对发发送ACK和数据,形成了一个死锁。所幸,在ACK延时超时之后,接收端会发送ACK,从而消除死锁,但是这样严重的影响的收发效率,因为在死锁期间TCP连接处于停滞状态。

TCP流量控制

TCP流浪控制(flow control),由窗口(window)实现。通信双方各自有各自的接受窗口及发送窗口。通过TCP头中的Window Size域通知对方自己剩余的缓冲区大小,亦即告诉对方自己还能接受多少字节数据。Window Size域长度为16位,与序列数(Sequence Number)一样,可以被Window Scale选项扩展其实际所带表的大小。当Window Size设置为零时,表示缓冲区已经满了,无法接受更多的数据,这时发送方停止发送数据。当接受端的缓冲区有足够的空间后,可以向发送方发送窗口更新消息,让发送方继续发送数据。但是这个窗口更新消息实际上是没有数据在内的,可以看作纯ACK信息,所以TCP不能保证这个消息一定能被对方收到。因此,发送方设置一个定时器,定时向接收方发送窗口检测信息,接收方收到这个信息后,返回一个ACK,连带窗口更新。

CATALOG
  1. 1. 大块数据和交互数据
  2. 2. ACK延迟
  3. 3. 小包问题及Nagle算法
  4. 4. 延迟发送ACK与Nagle算法共存时造成的问题
  5. 5. TCP流量控制