什么是tcp_autocorking(tcp自动开塞)

2024-01-09

从内核 3.14 开始,我发现还有另一个 TCP 优化,称为 tcp_autocorking。

tcp_cork 和 tcp_autocorking 之间的实际区别是什么?

它只是 tcp_cork 的自动化版本吗?除了这个链接我找不到任何有价值的信息:

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f54b311142a92ea2e42598e347b84e1655caf8e3 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f54b311142a92ea2e42598e347b84e1655caf8e3


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

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

更多细节:TCP Corking 在这篇文章中进行了描述(和批评):在 TCP_CORK 上 http://baus.net/on-tcp_cork.

另外,请参阅此关于TCP_CORK和TCP_NODELAY的详细解释 https://stackoverflow.com/questions/22124098/is-there-any-significant-difference-between-tcp-cork-and-tcp-nodelay-in-this-use通过 Appleman1234

通过强制 TCP_CORK,数据将聚合到同一缓冲区 (SKB),直到缓冲区被填满。此选项比 TCP_NODELAY 更强(即禁用 Nagle 算法),因此即使设置了 TCP_NODELAY 选项,它仍然可以工作。聚合到同一缓冲区的含义是调用 tcp_push() 函数 (net/include/tcp.c) 将not导致调用 __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;
}

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

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

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是tcp_autocorking(tcp自动开塞) 的相关文章

随机推荐