影响Netty客户端IO性能的若干TCP参数

本文探讨了Netty中影响客户端IO性能的几个关键TCP参数,包括SO_KEEPALIVE的心跳机制、SO_TIMEOUT的读超时设置、CONNECT_TIMEOUT_MILLIS的连接超时、SO_SNDBUF和SO_RCVBUF的缓冲区大小,以及SO_REUSEADDR和TCP_NODELAY的使用场景和潜在风险。正确调整这些参数对于实现高效、低延迟的网络通信至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Netty对外提供的TCP参数
  • SO_KEEPALIVE:是否启用TCP层keepalive机制。keepalive心跳包的发送与操作系统3个系统参数有关,可修改它们进行验证:

linux (/proc/sys/net/ipv4/)
tcp_keepalive_time:心跳包间隔,秒
tcp_keepalive_intvl:心跳包重试间隔,秒
tcp_keepalive_probes:最大重试次数,重发n次后仍未收到对端回复,则认定连接已经失效。TCP的读取操作,将返回0
win下(注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\):
KeepAliveTime:REG_DWORD,ms
KeepAliveInterval:REG_DWORD,s
TcpMaxDataRetransmissions:REG_DWORD
  • SO_TIMEOUT:socket读超时时长,单位毫秒ms。SO_TIMEOUT=0,表示一直阻塞直到有数据到来

  • CONNECT_TIMEOUT_MILLIS:客户端连接超时时长。TCP连接过程超时则程序抛异常

  • SO_SNDBUF:socket发送缓冲区大小

  • SO_RCVBUF:socket接收缓冲区大小

  • SO_REUSEADDR:是否允许socket重用。若服务程序停止后想立即重启,而新socket依旧使用相同IP端口(创建客户端socket时绑定了本地IP端口),此时 SO_REUSEADDR选项非常有用。

此套接字选项通知内核,如果端口忙,但TCP状态位于TIME_WAIT ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已被使用"。

一个socket套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口。SO_REUSEADDR 仅仅表示可以重用本地地址、本地端口,整个相关五元组还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。

必须慎重使用 SO_REUSEADDR 选项

  • TCP_NODELAY:no_delay,禁止延迟的意思。激活或禁止TCP_NODELAY套接字选项,它将决定是否使用Nagle算法。

Nagle算法是TCP协议中一种将多个小包组装成大包发送的算法机制,以减少网络环境中小包数量,但在“聚小”的过程中也引入了一定的数据收发延迟。

时延敏感型应用,建议关闭Nagle算法,即:设置TCP_NODELAY = true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值