setsockopt系统调用的具体作用是什么?设置SO_REUSEADDR等参数有何好处?
setsockopt 核心作用
setsockopt 是类Unix系统中用于修改套接字文件描述符底层运行参数的系统调用,本质是给套接字配置各类自定义网络特性开关,不同参数组合对应不同的网络行为调整,不需要修改内核配置就能针对单个套接字做特性定制。
你代码中使用的两个配置项是TCP服务端开发最常用的特性,当前没观察到差异是因为测试场景没有触发对应的生效条件:
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)))
SO_REUSEADDR 作用
默认情况下,TCP服务端主动关闭连接或者异常崩溃退出后,曾经监听的端口会进入 TIME_WAIT 状态,时长通常为2MSL(最长报文寿命的2倍,一般为1~2分钟),这个阶段你重启服务端会直接报错「Address already in use」,端口绑定失败。
开启SO_REUSEADDR后,系统允许服务端在端口处于TIME_WAIT状态时直接复用该端口重启,不需要等待冷却时间:
- 开发调试阶段,改完代码重启服务不需要等几十秒到几分钟的端口释放时间
- 生产环境服务异常崩溃后,可以秒级拉起服务,不会因为端口被占用导致服务长时间不可用
SO_REUSEPORT 作用
这是Linux 3.9版本之后内核才支持的特性,作用是允许多个完全独立的进程/线程绑定同一个端口,内核会自动将进来的TCP连接请求做负载均衡,分发到所有绑定了该端口的套接字上:
- 开发多进程/多线程高性能服务端时,不需要主进程accept连接再分发给工作进程,每个工作进程可以独立创建套接字、开启
SO_REUSEPORT、绑定同一个端口,内核自动完成负载均衡 - 天然避免了多进程监听同一端口的「惊群」问题,提升高并发场景下的服务性能
其他常见setsockopt使用场景
setsockopt的可配置参数非常多,除了上面两个,常用的还有:
SO_SNDBUF/SO_RCVBUF:调整套接字的发送/接收缓冲区大小,大流量传输场景下可以提升吞吐量SO_KEEPALIVE:开启TCP层自带的心跳检测,自动清理长时间无数据传输的死连接,不需要业务层自己实现心跳逻辑SO_RCVTIMEO/SO_SNDTIMEO:设置套接字接收/发送数据的超时时间,调用recv/send时超过设置时长会直接返回错误,避免进程永久阻塞
内容的提问来源于stack exchange,提问作者Adit
相关产品推荐
相关产品推荐

