网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?

在进行TCP高并发服务器开发时,有些规则仿佛是约定俗成的,不少朋友会依据这些规则去作,好比高并发TCP服务器中进行主动关闭的一方最好是客户端服务器端程序最好启用SO_REUSEADDR选项,可是不少人殊不知因此然,咱们为何要这么作呢?编程


先上图服务器

203639589.jpg

能够看到执行主动关闭端和被动关闭端的各个阶段的状态,今天咱的重点就是TIME_WAIT状态,能够看出TIME_WAIT状态是执行主动关闭的那一端产生的。网络

TIME_WAIT状态有两个存在的理由并发

  1. 可靠地实现TCP全双工链接的终止;ide

  2. 容许老的重复分节在网络中消逝;高并发

第一个理由参考上图。 假设主动关闭端最终发送的ACK丢失了。对端将从新发送FIN,主动关闭端只有在维护状态信息的状况下才能够从新发送最终的那个ACK。若是不维护这个状态信息,主动关闭端将会响应一个RST,对端会将此响应标记为错误,因此不能进行正常的关闭。blog

第二个理由假设咱们在ip A:端口B主机和ip C:端口D主机之间创建一个TCP链接。咱们关闭这个链接,过一段时间在相同的IP地址和端口之间创建另外一个链接。因为他们的IP地址和端口号都相同,因此若是上一个链接的老的重复分组再出现会影响新的链接。为了作到这一点,TCP将不会给处于TIME_WAIT状态的链接发起这个新的链接。这个持续时间若是大于MSL(IP数据报在因特网中的最大生存时间)ip

若是要知足以上实现,TIME_WAIT状态必需要有必定的持续时间,因此TIME_WAIT也被称为2MSL等待状态,通常持续时间在1分钟到4分钟之间。资源

高并发TCP服务器中进行主动关闭的一方最好是客户端:由于对于高并发服务器来讲文件描述符资源是很重要的资源,若是对于每个链接都要经历TIME_WAIT这个2MSL的时长,势必形成资源不能立马复用的浪费。虽然对于客户端来讲TIME_WAIT状态会占用端口和句柄资源,可是客户端通常不多有并发资源限制,因此客户端执行主动关闭是比较合适的。服务器开发

服务器端程序最好启用SO_REUSEADDR选项:咱们想这样作一种状况,若是生产环境中服务端程序因为某种错误操做关闭了,咱们确定是要立马重启服务程序,可是TIME_WAIT还在占用着这些地址端口资源让你的服务起不来,那你着不着急。SOREUSEADDR这个选项正是容许地址端口的重复绑定。

参考书籍:

《UNIX网络编程 卷1》《TCP/IP详解 卷1:协议》

相关文章
相关标签/搜索