TCP状态转换图

如图

1 主动发起连接

1.1 理论

主动发起连接请求的状态变化如下图。

最开始的时候,主动请求端和被动端都处于CLOSED状态。

第一阶段:当主动请求端发送SYN标志位后,其状态变化为SYN_SENT;

第二阶段:此时被动方收到主动方的请求后,会向主动方发送SYN标志位以及去确认信息ACK,主动方收到信息后,向被动方发送

ACK确认信息,此时主动方的状态变化为ESTABLISHED,完成TCP连接的三次握手

SYN_SEND一般不容易见到

状态变化:
CLOSE -- 发送SYN -- SEND_SYN -- 接收 ACK、SYN -- SENT_SYN -- 发送 ACK -- ESTABLISHED(数据通信态)

1.2 测试

使用命令查看状态

查看客户端

netstat -apn | grep client

查看服务端

netstat -apn | grep server

这里是多进程通信,一个server处于监听状态,另一个server处于ESTABLISHED状态

查看端口号

netstat -apn | grep 9527

2 主动关闭连接

2.1 理论

主动关闭连接请求的状态变化如下图。

在主动发发起关闭请求前,两方都处于ESTABLISHED状态。

第一阶段:主动方发起关闭连接请求,发送FIN,此时其状态变化为FIN_WAIT_1,当其收到被动方的ACK确认之后,其状态变化为FIN_WAIT_2,这也就是半关闭状态。

第二阶段:主动方收到被动方的关闭连接请求(FIN),其向被动方发送ACK确认,状态变化为TIME_WAIT。

第三阶段:要真正进入到CLOSED状态,需要等待2MSL时长,不同的系统时间不一样。

状态变化:
ESTABLISHED(数据通信态) -- 发送 FIN -- FIN_WAIT_1 -- 接收ACK -- FIN_WAIT_2(半关闭)-- 接收对端发送 FIN -- FIN_WAIT_2(半关闭)-- 回发ACK -- TIME_WAIT(只有主动关闭连接方,会经历该状态) -- 等 2MSL时长 -- CLOSE

2.2 测试

使用命令查看状态

查看主动关闭方的状态

netstat -apn | grep 9527

查看客户端的TIME_WAIT

 先关客户端,再关服务器,此时客户端处于TIME_WAIT状态,并且再次启动程序没有问题。

先关服务器,再关客户端,两端都处于TIME_WAIT状态,并且此时服务器因有2MSL时长,端口复用,无法启动。

3  被动方接受连接

3.1 理论

被动连接连接请求的状态变化如下图

第一阶段:被动接受连接一般都是服务器,因此一开始就处于LISTEN监听状态,的当其收到主动方的SYN标志位后,再向主动方发送SYN标志位和ACK确认信息后,其状态变化为SYN_RCVD。

第二阶段:当被动方收到主动方发送的ACK确认信息后,其状态变化为ESTABLISHED。

状态变化:

CLOSE -- LISTEN -- 接收 SYN -- LISTEN -- 发送 ACK、SYN(发送成功) -- SYN_RCVD -- 接收ACK -- ESTABLISHED(数据通信态)

 如果被动方没有收到主动方的ACK确认信息,在被动方一直向主动方发送SYN和ACK。

4  被动关闭连接

4.1 理论

被动关闭连接请求的状态变化如下图。

第一阶段:主动方和被动方都处于数据通信阶段,当被动方收到主动方发送的FIN结束标志,并且被动方向主动方发送ACK确认信息后,

被动方状态变化为CLOSE_WAIT,其与主动方的半关闭状态对应。

第二阶段:被动方向主动方发送FIN结束标志后,其状态变化为LAST_ACK。

第三阶段:当被动方收到主动方的ACK确认后,其状态变化为CLOSE。

状态变化:

STABLISHED(数据通信态) -- 接收 FIN -- ESTABLISHED(数据通信态) -- 发送ACK 
-- CLOSE_WAIT (说明对端【主动关闭连接端】处于半关闭状态) -- 发送FIN -- LAST_ACK -- 接收ACK -- CLOSE

2MSAL保证最后一个 ACK 能成功被对端接收。(等待期间,对端没收到我发的ACK,对端会再次发送FIN请求。)

一定出现在【主动关闭连接请求端】。 --- 对应 TIME_WAIT 状态。

5 名词解释

CLOSED:表示初始状态。

LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。

SYN_SEN:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

SYN_RCVD: 该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。

ESTABLISHED:表示连接已经建立。

FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是:FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。

FIN_WAIT_2主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接。

LAST_ACK: 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,即可以进入到CLOSED可用状态。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值