1. TIME_WAIT(时间等待计时器)状态是什么?

    简单来说,TIME_WAIT状态是四次挥手中服务器向客户端发送FIN终止连接后进入的状态。

    四次挥手的过程:

    TCP四次挥手时TIME_WAIT状态以及端口号的分类_TIME

    可以看到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位并在以太网层广播。