1 交互数据流与成块数据流
按照分组数量计算,约有一半的TCP报文段包含成块数据(如FTP、电子邮件和Usenet新闻),另一半则包含交互数据(如telnet和rlogin) 。如果按字节计算,则成块数据与交互数据的比例约为90%和10%。因此TCP处理两种数据的方式也不一样。
2 交互式输入
rlogin的交互式输入是每敲一个字符便进行四次交互,客户端发送键入的字符,服务端响应一个ACK,服务端响应一个回显的字符,客户端再发送一个ACK。telnet则可以在整行的数据键入之后做一次交互。
如图数据字节的确认与数据字节的回显完全可以一起发送。为了合并请求则延迟发送,这种的算法称为Nagle算法。T C P将以最大200 ms 的时延等待是否有数据一起发送。
3 Nagle算法
在局域网上,这些小分组(被称为微小分组(tinygram))通常不会引起麻烦,因为局域网一般不会出现拥塞。但在广域网上,这些小分组则会增加拥塞出现的可能。一种简单和好的方法就是采用建议的 N a g l e算法(默认开启)。
该算法要求一个 T C P连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组。
4 关闭Nagle算法
在一些特殊场景下需要实时得到响应,因此需要关闭Nagle算法。
SOCKET API用户可以使用TCP_NODELAY选项来关闭Nagle算法