什么是tcp_autocorking(tcp自动软木塞)

Jae*_*Nam 12 c linux networking tcp network-protocols

从内核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

Tgi*_*gul 6

简短的答案: TCP_CORK是一个套接字选项,在setsockopt()函数中用于强制执行TCP插入。tcp_autocorking是内核的一个标志,用于检查特定条件并在满足这些条件时执行连接。

底线:当启用TCP_CORK时,将对每个数据包执行连接;可能在启用tcp_autocorking和TCP_CORK时,对数据包执行连接;如果两个选项都被禁用,则不会对任何数据包执行连接。即使启用了Nagle的算法,即使同时禁用了这两个选项,数据聚合仍可能会发生。

更多详细信息: 这篇文章在TCP_CORK上描述(并批评了)TCP软木塞。

另外,请参阅Appleman1234 关于TCP_CORK和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),以检查是否应发送当前缓冲区:

static bool tcp_should_autocork(struct sock *sk, struct sk_buff *skb,
                                int size_goal)
{
        return skb->len < size_goal &&
               sysctl_tcp_autocorking &&
               skb != tcp_write_queue_head(sk) &&
               refcount_read(&sk->sk_wmem_alloc) > skb->truesize;
}
Run Code Online (Sandbox Code Playgroud)

用英语-如果(缓冲区未满)和(启用了自动求塞)并且(Qdisc或NIC队列中至少有一个数据包)和(不是Qdisc / NIC队列中的所有数据包都是ACK),应该软木塞

tcp_push()函数检查其他条件,即使tcp_should_autocork()返回“ true”,这些条件也可能中止软木塞化。

希望这可以帮助。