linux - TCP_NODELAY 参数对 MSS 和 CPU 利用率的影响
问题描述
当我尝试使用 netperf 编写测试套件时,我必须仔细阅读手册,在该手册中我遇到了以下行以供选择-D
如果使用 -D 设置 TCP_NODELAY 会影响发送大小 (-m) 大于 MSS 的测试的吞吐量和/或服务需求,则表明 TCP/IP 堆栈的 Nagle 算法实现可能被破坏,可能解释了 Nagle 算法一个段一个段的基础,而不是正确的用户发送一个用户发送的基础
我的问题是 - 设置 TCP_DELAY 及其对吞吐量的影响如何确定 nagle 实现被破坏?有人可以帮助我对此进行合乎逻辑的解释吗?
解决方案
从广义上讲,Nagle 类似于:
此发送中的数据量,添加到任何排队等待发送的数据中,是否大于此连接的最大分段大小 (MSS)?如果答案是肯定的,那么现在发送数据,只要发送没有其他限制,例如拥塞窗口或接收方的通告窗口。如果答案是否定的,那么考虑下一步:
连接是否“空闲”?换句话说,网络上是否没有未确认的数据。如果是这样,那么现在发送用户发送中的数据。如果连接不是空闲的,则将数据排队并等待。我们知道三件事中的一件或多件会导致数据被发送:
应用程序将继续进行发送调用,我们将获得一个 MSS 价值的数据来发送。
对于当前未确认的数据,将从远程收到确认,使连接再次“空闲”。
未确认数据的重传计时器将到期,我们可能会在重传中捎带这些数据。
Nagle 的要点应该是在逐个用户发送的基础上进行评估。如果禁用它会导致更高的吞吐量和大于 MSS 的发送大小,这意味着该堆栈的 Nagle 实现正在逐个 TCP 段地执行 TCP 段。
推荐阅读
- python - AI/深度学习方法来判断论文中的参考文献?
- javascript - 如何防止safari弹出密码保存框?
- python - 如何使用 Python 中的请求模块随机化 IP 地址?
- javascript - 无法创建许多模态
- ios - 在 2 个部分 Tableview 中分离 Realm Bool 数据
- java - 我们可以将父项目中定义的用户定义类用于子项目maven吗?
- rabbitmq - 如何使用 MassTransit 和 RabbitMQ 设置消费者优先级
- javascript - 为什么使用 mongoose 删除 mongodb 集合中的数据后集合模式的长度没有改变?
- haskell - Haskell Attoparsec 无限循环
- toolkit - 使用 Holotoolkit 滑块的值