TIME_WAIT(时间等待计时器)状态是什么?
简单来说,TIME_WAIT状态是四次挥手中服务器向客户端发送FIN终止连接后进入的状态。
四次挥手的过程:
可以看到TIME_WAIT状态存在于客户端收到服务器FIN并返回ACK时的状态。
当处于TIME_WAIT状态时,我们无法创建新的连接,因为端口被占用。
2. 为什么会有TIME_WAIT状态?
原因如下两点:
<1> 可靠的终止TCP连接
若处于TIME_WAIT的客户端发送给服务器确认报文段丢失的话,服务器将在此重新发送FIN报文 段,那么客户端必须处于一个可接收的状态就是TIME_WAIT而不是close状态。
<2> 保证迟来的TCP报文段有足够的时间被识别并丢弃
Linux中有一个TCP端口不能打开两次或者两次以上,当客户端处于TIME_WAIT状态时,我们将无 法使用此端口建立新连接,如果不存在TIME_WAIT状态,新连接可能会收到旧连接的数据。 TIME_WAIT持续时间是2MSL(MSL最长报文寿命),保证旧的数据可以丢弃,因为网络中数据最大存 在MSL。
3. 如何避免TIME_WAIT状态占用资源?
处于TIME_WAIT状态的连接占用的资源不会被内核释放。
当TCP处于TIME_WAIT时,必须等待2个MSL超时才能收回端口,一旦TCP的连接服务器异常退出,没有释放端口号,就会出现bind error:Address already in use。如何解决?
通过socksetopt设置socket描述符的选项SO_REUSEADDR为1,即使sock处于time_wait状态,与之绑定的socket地址也可以立即被重用。
4. 端口号的分类
按端口号可分为3大类:
(1)公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。
(2)注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
(3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
0 通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用一种通常的闭合端口连接它时将产生不同的结果。一种典型的扫描:使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。
本文出自 “一起去看星星” 博客,转载请与作者联系!
原文地址:http://10810429.blog.51cto.com/10800429/1835123