在TCP进行数据传输时,可以分为成块数据流和交互数据流两种,如果按字节计算,成块数据与交互数据的比例约为90%和10%,TCP需要同时处理这两类数据,且处理的算法不同。
书籍本章中以Rlogin应用为例观察交互数据的传输过程。提示经受时延的确认是如何工作以及Nagle算法怎样减少了通过广域网络传输的小分组的数目。
交互式输入![](http://blog.chinaunix.net/photo/91603_100717121935.jpg)
上图为没有优化的字符输入回显的数据传输过程,一共需要四个报文段。
经受时延的确认
上图第二,三个报文段可以合并---按键确认和按键回显一起发送。这种技术叫做经受时延的确认。
通常TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时这种现象为数据捎带的ACK)。绝大数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。
ACK延时等待时间不大于TCP定时器的原因:
假如TCP使用200ms的定时器,该定时器将相对于内核引导的200ms固定时间溢出,由于将要确定的数据随机到达,TCP将在下一次内核的200ms定时器溢出时得到通知,所以ACK实际等待的时间为1~200ms中任一刻。
Nagle算法
Nagle算法要求TCP连接上最多只有一个未被确认的未完成小分组,在该分组确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到达时以一个大的分组发出去。
该算法的优点在于它是自适应的:确认到达得越快,数据也就发送得越快。可以减少网络上的微小分组数目,降低拥塞出现的可能(局域网这些小分组通常不会引起麻烦,但在较慢的广域网则存在拥塞的可能)。但相应的,因为不是立即ACK,也会增加更多的时延。
有时我们也需要关闭Nagle算法,例如鼠标移动必须无时延地发送,以便为用户的交互提供实时的反馈。
流程:(1)发送端TCP将从应用进程接收到的第一数据块立即发送,不管其大小,哪怕只有一个字节。
(2)发送端输出第一块数据后开始收集数据,并等待确认。
(3)确认未达到时,若收集数据达到窗口的一半或一个MSS段,立即发送。
(4)确认到达后,把缓冲区中的数据组成一个TCP段,然后发送。
窗口大小通知
在图19-4,客户端与服务器端的通告窗口分别为4096与8192。但报文5通告的窗口大小为4095个字节,这意味着在TCP缓冲区中仍然有一个字节等待应用程序读取。
作者原创,转载请标明原处:http://blog.csdn.net/xifeijian/article/details/44260601