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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。