TCP协议选项详解
TCP头部的选项部分是为了TCP适应复杂的网络环境和更好地为应用层服务而进行设计的。
SO_REUSEADDR
通常一个端口释放后会等待两分钟(TIME_WAIT时间)之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。在TCP连接中,主动关闭方会进入TIME_WAIT状态,因此这个功能也就是主动方收到被动方发送的FIN后,发送ACK后就可以断开连接,不再去处理该ACK丢失等情况。
也就是说,这个套接字选项向内核传达了该消息:如果这个端口被占用但是TCP状态位于 TIME_WAIT ,则可以重用端口。而如果端口忙,而TCP状态位于其他状态,那么重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果想要让服务程序停止后就可以立即重用,并且使用的端口还是这个端口,那么设置SO_REUSEADDR 选项将非常有必要。总体来说,对于需要维持大量TCP连接的服务器可以设置这个选项,因为可能会存在大量的TIME_WAIT状态(尤其是HTTP服务通常是服务器充当主动断开一方),设置该选项就很有必要,毕竟最糟糕的情况下基本是客户端的断开慢一些,影响也不是非常大(客户机通常不需要大量的TCP连接需要)
SO_REUSEPORT则与之类似,主要是该选项允许TCP完全重复绑定,只要这些socket都开启了SO_REUSEPORT即可。