TCP交互数据流

1:概念:TCP的数据交流有两种,第一种是成块的数据交互,第二种是成块的数据交流,在交互数据流中,常用的算法有经受时延的ACK确认,还有Nagle算法

2:TCP交互数据运用的算法一,经受时延的确认

列如在上发,这是没有经过优化的数据传输,总共需要传送4个报文,但是实际上2,3报文可以合并为一个报文传输,此时就总共需要三个报文。

通常TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时这种现象为数据捎带的ACK)。绝大数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。

报文3,6,9,叫做经受时延的ACK,经受时延的ACK通常定时器被设计位200ms,所有6报文的发生时间-3报文的发生时间,大约是200ms,这是bsdi端的,另一端的数据,为什么没有经受时延的ACK,因为在定时器到时的之前,正好有发送的数据需要发送,因此没有单独的经受时延的ACK发送

3:Nagle算法

Nagle算法要求TCP连接上最多只有一个未被确认的未完成小分组,在该分组确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到达时以一个大的分组发出去。

该算法的优点在于它是自适应的:确认到达得越快,数据也就发送得越快。可以减少网络上的微小分组数目,降低拥塞出现的可能(局域网这些小分组通常不会引起麻烦,但在较慢的广域网则存在拥塞的可能)。但相应的,因为不是立即ACK,也会增加更多的时延。

有时我们也需要关闭Nagle算法,例如鼠标移动必须无时延地发送,以便为用户的交互提供实时的反馈。

流程:
(1)发送端TCP将从应用进程接收到的第一数据块立即发送,不管其大小,哪怕只有一个字节。
(2)发送端输出第一块数据后开始收集数据,并等待确认。
(3)确认未达到时,若收集数据达到窗口的一半或一个MSS段,立即发送。
(4)确认到达后,把缓冲区中的数据组成一个TCP段,然后发送。


记住Nagle算法是当收到一个ACK时候就应该应答一次,报文段12可以认为是一个经受时延的ACK,报文段14是对12报文段进行的确认,报文段13的回答是15,所以客户端是遵守Nagle算法的

4:关于Nagle算法的使用条件

虽然在交互的情况下,大部分因该开启Nagle算法,但是在比如说Xwindows的条件下,如果开启Nagle算法,则会有明显的时延,不应该开启





原文地址:https://www.cnblogs.com/SmileLion/p/5863559.html