tcp-ip-状态详解(转)

TCP正常创建和关闭的状态变化

 
 
TCP链接的创建能够简单的称为三次握手,而链接的停止则能够叫作 四次握手。
 

创建链接

 
在TCP/IP协议中,TCP协议提供可靠的链接服务,采用三次握手创建一个链接。
第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。 

 

结束链接

    TCP有一个特别的概念叫作half-close,这个概念是说,TCP的链接是全双工(能够同时发送和接收)链接,所以在关闭链接的时候,必须关闭传和送两个方向上的链接。客户机给服务器一个FIN为1 的TCP报文,而后服务器返回给客户端一个确认ACK报文,而且发送一个FIN报文,当客户机回复ACK报文后(四次握手),链接就结束了。服务器

 

 


TCP状态变迁图

 

这是一个看起来比较复杂的状态迁移图,由于它包含了两个部分---服务器的状态迁移和客户端的状态迁移,若是从某一个 角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。

 

客户端的状态能够用以下的流程来表示:socket

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSEDspa

以上流程是在程序正常的状况下应该有的流程,从书中的图中能够看到,在创建链接时,当客户端收到SYN报文的ACK之后,客户端就打开了数据交互地 链接。而结束链接则一般是客户端主动结束的,客户端结束应用程序之后,须要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前 面提到的结束链接的四次握手。blog

 

服务器的状态能够用以下的流程来表示:class

CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED服务器端

在创建链接的时候,服务器端是在第三次握手以后才进入数据交互状态,而关闭链接则是在关闭链接的第二次握手之后(注意不是第四次)。而关闭之后还要 等待客户端给出最后的ACK包才能进入初始的状态。程序

 

其余状态迁移im

书中的图还有一些其余的状态迁移,这些状态迁移针对服务器和客户端两方面的总结以下总结

1. LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开链接的嘛。
2. SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下若是收到SYN数据报,则都须要发送SYN的ACK数据报并把本身的状态 调整到SYN收到状态,准备进入ESTABLISHED
3. SYN_SENT->CLOSED,在发送超时的状况下,会返回到CLOSED状态。
4. SYN_收到->LISTEN,若是受到RST包,会返回到LISTEN状态。
5. SYN_收到->FIN_WAIT_1,这个迁移是说,能够不用到ESTABLISHED状态,而能够直接跳转到FIN_WAIT_1状态并等待关 闭。数据

 

2MSL等待状态

书中给的图里面,有一个TIME_WAIT等待状态,这个状态又叫作2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报之后, 要进入 TIME_WAIT状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)。这个状态在 很大程度上保证了双方均可以正常结束,可是,问题也来了。

因为插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是没法再次使用同一个插口的,对于客户程序还好 一些,可是对于服务程序,例如httpd,它老是要使用同一个端口来进行服务,而在 2MSL时间内,启动httpd就会出现错误(插口被使用)。为了不这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然能够从新 启动服务器,可是这个服务器仍是要平静的等待2MSL时间的过去才能进行下一次链接。

 

 

FIN_WAIT_2状态

这就是著名的半关闭的状态了,这是在关闭链接时,客户端和服务器两次握手以后的状态。在这个状态下,应用程序还有接受数据的能力,可是已经没法发送 数据,可是也有一种多是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。

 

RST,同时打开和同时关闭

RST是另外一种关闭链接的方式,应用程序应该能够判断RST包的真实性,便是否为异常停止。而同时打开和同时关闭则是两种特殊的TCP状态,发生的 几率很小。

相关文章
相关标签/搜索