1. SO_REUSEADDR
假如服务端出现故障,主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,而服务重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑定到这个端口上。启用 SO_REUSEADDR 套接字选项可以解除这个限制。
2. SO_REUSEPORT
默认情况下,一个 IP、端口组合只能被一个套接字绑定,Linux 内核从 3.9 版本开始引入一个新的 socket 选项 SO_REUSEPORT,又称为 port sharding,允许多个套接字监听同一个IP 和端口组合。
2.1 多进程网络模型
- 主进程 + 多个 worker 子进程监听相同的端口(导致惊群问题)
- 多进程 + REUSEPORT
2.2 惊群问题
多进程/多线程同时监听同一个套接字,当有网络事件发生时,所有等待的进程/线程同时被唤醒,但是只有其中一个进程/线程可以处理该网络事件,其它的进程/线程获取失败重新进入休眠。
2.3 accept系统调用的惊群问题
在Linux 2.6之前,会出现惊群问题。而在后面的版本中,引入了WQ_FLAG_EXCLUSIVE 选项解决了 accept 调用的惊群问题。