据我所知,我们有一个套接字选项SO_TCP_NODELAY来禁用Nagle算法,我发现它是在https://elixir.bootlin.com/linux/v4.4.90/source/net/ipv4/tcp.c#L2401的TCP/IP堆栈中实现的。但是,我不知道在内核中实现Nagle算法的源代码在哪里。如果你知道,你能帮帮我吗?
发布于 2018-04-03 05:31:57
简单回答: tcp_nagle_check()在net_ipv4_tcp_output.c中
您可以在代码中看到避免Nagle的条件:
/* Return false, if packet can be sent now without violation Nagle's rules:
* 1. It is full sized. (provided by caller in %partial bool)
* 2. Or it contains FIN. (already checked by caller)
* 3. Or TCP_CORK is not set, and TCP_NODELAY is set.
* 4. Or TCP_CORK is not set, and all sent packets are ACKed.
* With Minshall's modification: all sent small packets are ACKed.
*/
static bool tcp_nagle_check(bool partial, const struct tcp_sock *tp,
int nonagle)
{
return partial &&
((nonagle & TCP_NAGLE_CORK) ||
(!nonagle && tp->packets_out && tcp_minshall_check(tp)));
}对此函数的调用堆栈可能是tcp_sendmsg_locked()->tcp_push()->__tcp_push_pending_frames()->tcp_write_xmit()->tcp_nagle_test()->tcp_nagle_check() tcp_sendmsg_locked() (在net/ipv4 4/tcp.c中)是发送数据的主要函数。在每次调用函数时,它都从套接字中获取一个数据段,并为传输做准备。Nagle算法是一种通过套接字聚合数据以优化传输流的优化算法。您还可能希望查看TCP软木和自动软木,因为它们的工作方式与Nagle类似,但可能优先于NO_DELAY选项。为了确保不延迟地发送数据包,请捕获它们(使用tcpdump),并验证发送的数据包大小仅略大于从应用程序发送的数据大小(由于添加了报头)。
https://unix.stackexchange.com/questions/434483
复制相似问题