16.TCP协议-Nagle算法

客户端:unp/protocol/tools/winclient/echo_client.cpp,部署在 Windows 上。
服务器:unp/protocol/tools/tcpserver/echo_serv.cpp,部署在 Linux 上。


echo_serv 的功能是将接收到数据回射回去。echo_client 的功能是从键盘接收字符,每接收到一个字节就立即发送出去。

当 echo_client 连接到 echo_serv 的时候,在键盘上键入字符,echo_client 会将键入的字符立即发送到服务器,然后服务器将收到的字符回送回来。echo_client 接收到回送的字符后,将其打印到屏幕。

-----------------------------

 unp/protocol/tools/winclient/echo_client.cpp 程序的特别之处是它总会发送一个小分组(TCP 段,只有 41 字节)到服务器。这样的小分组在英文中称为 tinygram,在网络状态好的情况下,比如局域网中,通常不会引起什么麻烦。但是在广域网中,这样的小分组会增加网络拥塞的可能;

为了能够减少这样的 tinygram 在网络中的数量,在 TCP 协议栈中,默认使用了 Nagle 算法;

Nagle 算法要求:

  • 一个 TCP 连接上最多只能有一个未被确认的未完成的小分组,在它到达目的地前,不能发送其它分组。
  • 在上一个小分组未到达目的地前,即还未收到它的 ack 前,TCP 会收集后来的小分组。当上一个小分组的 ack 收到后,TCP 就将收集的小分组合并成一个大分组发送出去。

在广域网中,一般网络延时都比较大,小分组发送出去后,可能要等很久才会收到 ack,因此,在收到 ack 前,发送方可能会累积好多好多未发送的小分组。

16.TCP协议-Nagle算法 
图1 Nagle 算法如何处理小分组 

在图 1 中,客户端首先发送了一个字符 l 给服务器,在收到服务器的回应前,客户端又发送了三个分组,根据 Nagle 算法规则,在未收到 ack 前,这些小分组都不能发出去。收到 ack 后,tcp 将这三个小分组合并成一个,一次性发出去。