从内核3.14开始,我看到有另一个名为tcp_autocorking的TCP优化.
tcp_cork和tcp_autocorking之间的实际区别是什么?
结论:当启用TCP_CORK时,将对每个数据包执行Corking,当启用tcp_autocorking且禁用TCP_CORK时,可能会对数据包执行Corking,如果禁用这两个选项,则不会对任何数据包执行.
如果启用Nagle算法,即使禁用这两个选项,数据聚合仍可能发生.
更多细节:
在这篇文章中描述(和批评)TCP软木塞:on TCP_CORK.
另外,请参阅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)以检查是否应该发送当前缓冲区:
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;
}
英文 – 应该软件if(缓冲区未满)和(启用自动启动)和(Qdisc或NIC队列中至少有一个数据包)和(并非Qdisc / NIC队列中的所有数据包都是ACK)
tcp_push()函数检查可能中止软木塞的其他条件,即使tcp_should_autocork()返回“true”也是如此.
希望这可以帮助.