linux – 什么是tcp_autocorking(tcp自动软木塞)
从内核3.14开始,我看到有另一个名为tcp_autocorking的TCP优化. tcp_cork和tcp_autocorking之间的实际区别是什么? 它只是tcp_cork的自动化版本吗?除了这个链接,我找不到任何有价值的信息: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f54b311142a92ea2e42598e347b84e1655caf8e3 最佳答案 简短回答:TCP_CORK是一个套接字选项,在setsockopt()函数中用于强制TCP软件. tcp_autocorking是内核的标志,用于检查特定条件并在满足这些条件时执行软木塞. 结论:当启用TCP_CORK时,将对每个数据包执行Corking,当启用tcp_autocorking且禁用TCP_CORK时,可能会对数据包执行Corking,如果禁用这两个选项,则不会对任何数据包执行. 更多细节: 另外,请参阅Appleman1234的这个detailed explanation about TCP_CORK and TCP_NODELAY 通过强制TCP_CORK,数据将聚合到同一缓冲区(SKB),直到填充缓冲区.此选项比TCP_NODELAY强(即禁用Nagle算法),因此即使设置了TCP_NODELAY选项,它仍然可以工作.聚合到同一缓冲区后面的含义是调用tcp_push()函数(net / include / tcp.c)不会导致调用__tcp_push_pending_frames()函数(net / include / tcp_output.c),结果(最终)在调用NIC的驱动程序xmit函数时.相反,从应用程序到达的下一条消息的有效负载将被复制到与最后一条消息相同的缓冲区中.有关消息处理,请参阅tcp_sendmsg()函数(net / include / tcp.c). 另一方面,tcp_autocorking在缓冲区已满之前不会强制聚合,而是检查在当前缓冲区上继续聚合的特定条件. tcp_push()函数调用tcp_should_autocork()函数(net / include / tcp.c)以检查是否应该发送当前缓冲区:
英文 – 应该软件if(缓冲区未满)和(启用自动启动)和(Qdisc或NIC队列中至少有一个数据包)和(并非Qdisc / NIC队列中的所有数据包都是ACK) tcp_push()函数检查可能中止软木塞的其他条件,即使tcp_should_autocork()返回“true”也是如此. 希望这可以帮助. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |