tcp::no_delay 套接字选项
Admin·1/15/2025·0 views
C++网络编程
最近发现编写的程序在发送时,时间间隔特别小的时候,抓包会发现粘包,组包发送没问题。

排查之后发现,tcp发送数据会默认延迟。原因是tcp默认会遵循Nagle 算法
Nagle 算法
Nagle 算法是一种通过减少小数据包的发送来优化网络效率的机制。它的主要作用是:
- 减少小数据包:合并多个小数据块后再发送,减少网络上的数据包数量。
- 降低网络开销:适用于对吞吐量要求较高的应用。
但是,Nagle 算法会导致一定的延迟,特别是当应用频繁发送小数据包时,这种延迟可能对实时性要求高的场景(如在线游戏、金融交易或远程控制)造成负面影响。
tcp::no_delay 的作用
- 启用 tcp::no_delay(true):
- 禁用 Nagle 算法,数据包会立即发送,不会等待积累或合并
- 适用于需要低延迟的场景
tcp::no_delay(false)(默认值):
- 启用 Nagle 算法,会尝试合并小数据包以提高传输效率,适用于吞吐量优先的场景。
解决:创建完套接字后设置set_option
m_Socket.set_option(boost::asio::ip::tcp::no_delay(true));