tcp的状态转换
http://blog.sina.com.cn/s/blog_8e5d24890102w9yi.html
tcp连接的步骤
- 三次握手建立连接
(1) 客户端给服务器发送一个报文,发起一个访问的请求,“我想访问你”
(2) 服务器接收到请求,给客户端一个响应的报文,“我准备好了,你好了吗”
(3) 客户端收到响应,发送一个确认的报文,“我也准备好了,咱们开始吧”
然后就开始数据传输。
- 四次握手断开连接
Tcp连接是全双工的,即同一时间,连接双方都可以发送/接收数据。这就意味着需要两条数据传输通道,一条用来发送数据,一条用来接收数据,两条通道相对独立。
现在假设 甲,乙 之间建立了tcp连接:
(1)甲把自己的数据都传送完了,给乙发一个报文信息,“我弄好了,我先断了啊”
(2)乙收到了甲发过来的报文,赶紧回复一个报文,“我知道了,你断吧”
(3)乙也结束了数据传输,给甲发报文,“我也弄好了,回见”
(4)甲收到报文,给乙一个回复,“恩,我知道了,回见”
连接结束。
下图就是三次握手建立连接,四次握手断开连接的示意图。

下图是tcp连接状态转换图:

(1) CLOSED
连接没有建立的初始状态。
(2) LISTEN
监听端口,接收访问,常见于服务器。
(3) SYN_RCVD:服务器已经准备好连接了,只要收到客户端的ACK报文后,它会进入到ESTABLISHED状态,即建立好连接了。
(4)SYN_SENT:主动发起连接的一方,在发出连接请求后进入此状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
(5)ESTABLISHED:连接已经建立了,可以数据传输了。
下面是断开连接的部分:
(6)FIN_WAIT_1: 连接的一方主动断开连接之后进入此状态。
另一方一旦收到FIN报文,就会马上做出相应,所以此状态的时间较短。
(7)FIN_WAIT_2:FIN_WAIT_1状态下收到另一端的回复后进入此状态,此状态下tcp连接 半双工,即只有一端还在发送数据。
(8)TIME_WAIT: 双方都发完数据了,等待2MSL时间后就会回到初始状态。
注:MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟.
(9)CLOSING: 连接双方同时断开连接的话,就会进入此状态。
(10)CLOSE_WAIT: 被动关闭连接的一方进入此状态,在此状态完成最后需要传送的数据,
就可以发送FIN报文,断开连接了。
(11)LAST_ACK: 被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

浙公网安备 33010602011771号