ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【2018-06-29】TCP之Nagle算法延迟ACK

【2018-06-29】TCP之Nagle算法延迟ACK [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-06-29 标题TCP之Nagle算法延迟ACK分类编程 标签TCPUDP·delayack·disable-nagleTCP延迟确认和禁用Nagle算法1. Nagle算法2. 延迟ACK3. 当Nagle遇上延迟ACK4. 关闭Nagle算法5. 禁止Nagle和开启Nagle算法发送数据与确认示意图参考链接《 https://www.cnblogs.com/wanpengcoder/p/5366156.html 》《 https://blog.csdn.net/wdscq1234/article/details/52432095 》1. Nagle算法Nagle算法的基本定义是任意时刻最多只能有一个未被确认的小段。 所谓“小段”指的是小于MSS尺寸的数据块所谓“未被确认”是指一个数据块发送出去后没有收到对方发送的ACK确认该数据已收到。Nagle算法的规则可参考tcp_output.c文件里tcp_nagle_check函数注释1如果包长度达到MSS则允许发送2如果该包含有FIN则允许发送3设置了TCP_NODELAY选项则允许发送4未设置TCP_CORK选项时若所有发出去的小数据包包长度小于MSS均被确认则允许发送5上述条件都未满足但发生了超时一般为200ms则立即发送。Nagle算法只允许一个未被ACK的包存在于网络它并不管包的大小因此它事实上就是一个扩展的停-等协议只不过它是基于包停-等的而不是基于字节停-等的。是为了减少广域网的小分组数目从而减小网络拥塞的出现该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组在该分组ack到达之前不能发送其他的小分组tcp需要收集这些少量的分组并在ack到来时以一个分组的方式发送出去其中小分组的定义是小于MSS的任何分组该算法的优越之处在于它是自适应的确认到达的越快数据也就发哦送的越快而在希望减少微小分组数目的低速广域网上则会发送更少的分组2. 延迟ACK如果tcp对每个数据包都发送一个ack确认那么只是一个单独的数据包为了发送一个ack代价比较高所以tcp会延迟一段时间如果这段时间内有数据发送到对端则捎带发送ack如果在延迟ack定时器触发时候发现ack尚未发送则立即单独发送延迟ACK好处(1) 避免糊涂窗口综合症(2) 发送数据的时候将ack捎带发送不必单独发送ack(3) 如果延迟时间内有多个数据段到达那么允许协议栈发送一个ack确认多个报文段3. 当Nagle遇上延迟ACK试想如下典型操作写-写-读即通过多个写小片数据向对端发送单个逻辑的操作两次写数据长度小于MSS当第一次写数据到达对端后对端延迟ack不发送ack而本端因为要发送的数据长度小于MSS所以nagle算法起作用数据并不会立即发送而是等待对端发送的第一次数据确认ack这样的情况下需要等待对端超时发送ack然后本段才能发送第二次写的数据从而造成延迟4. 关闭Nagle算法使用TCP套接字选项TCP_NODELAY可以关闭套接字选项;如下场景考虑关闭Nagle算法(1) 对端不向本端发送数据并且对延时比较敏感的操作这种操作没法捎带ack(2) 如上写-写-读操作对于此种情况优先使用其他方式而不是关闭Nagle算法–使用writev而不是两次调用write单个writev调用会使tcp输出一次而不是两次只产生一个tcp分节这是首选方法–把两次写操作的数据复制到单个缓冲区然后对缓冲区调用一次write–关闭Nagle算法调用write两次有损于网络通常不考虑5. 禁止Nagle和开启Nagle算法发送数据与确认示意图
返回列表