首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置SO_TCP_NODELAY (禁用Nagle算法)

设置SO_TCP_NODELAY (禁用Nagle算法)
EN

Unix & Linux用户
提问于 2018-03-30 11:00:47
回答 1查看 2.5K关注 0票数 0

据我所知,我们有一个套接字选项SO_TCP_NODELAY来禁用Nagle算法,我发现它是在https://elixir.bootlin.com/linux/v4.4.90/source/net/ipv4/tcp.c#L2401的TCP/IP堆栈中实现的。但是,我不知道在内核中实现Nagle算法的源代码在哪里。如果你知道,你能帮帮我吗?

EN

回答 1

Unix & Linux用户

发布于 2018-04-03 05:31:57

简单回答: tcp_nagle_check()在net_ipv4_tcp_output.c中

您可以在代码中看到避免Nagle的条件:

代码语言:javascript
复制
/* 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),并验证发送的数据包大小仅略大于从应用程序发送的数据大小(由于添加了报头)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/434483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档