在前面的4次挥手里面说过,主动断开连接的那一端需要等待 2 个 MSL 才能最终释放这个连接。那么如果服务端挂掉了,需要断开连接,那么服务端在重启以后,再重新绑定端口时,就会出现端口被占用的情况,因为要过2msl这个端口的才会被释放。
1. SO_REUSEADDR 参数
像上面说的那样,如果服务器断开连接以后,必须等待2MSL才能重新绑定端口。这样的代价太大了。而在操作系统中,端口是不能被重用的,只要还有连接在占用这个端口,都不能进行绑定。
而启用 SO_REUSEADDR 套接字选项,就可以解除这个限制了
2. 端口复用只存在于TIME-WAIT的时候吗?
不一定是要处于 TIME_WAIT 才允许端口复用的,只是大都是情况下,主动关闭连接的服务端都会处于 TIME_WAIT。如果不把 SO_REUSEADDR 设置为 1,服务器将等待 2 个 MSL 才可以重新绑定原端口
3.为什么客户端不需要呢?
因为客户端的端口使用的都是临时端口,端开连接后重新分配一个就是了。