引言
研究发现,如果按照分组数量计算,约有一半的TCP报文段包含成块数据(如电子邮件、FTP和Usenet新闻),另一半则包含交互数据(如Telnet和Rlogin)。如果按照字节计算,成块数据和交互数据的比例约为9:1。这是因为成块数据的报文段基本都是满长度的,而交互数据则小得多。
TCP要处理这两类数据,使用的处理算法有所不同。本篇笔记以Rlogin应用为例观察交互数据的传输过程。并揭示延迟确认是如何工作的以及Nagle算法怎样减少了通过广域网络传输的小分组数目。
交互式输入
首先来观察在一个Rlogin连接上键入一个交互命令时所产生的数据流。
产生了4个报文段:
(1) 来自客户的交互按键
(2) 来自服务器的按键确认
(3)来自服务器的按键回显
(4)来自客户的按键回显确认
延迟确认
通常TCP在接收到数据时并不立即发送ACK;相反,它延迟发送,以便将ACK与需要沿该方向发送的数据一起发送。绝大多数实现采用的时延为200ms。
Nagle算法
在广域网上,小分组会增加拥塞出现的可能,一种比较好的方法是采用Nagle算法。
该算法要求一个TCP连接上最多只能有一个未被确认的小分组,在该分组确认到达之前不能发送其他的分组。TCP收集这些少量分组,在确认到来时以一个分组的形式发出去。
该算法的优点在于它是自适应的:确认到达的越快,数据发送地越快。