图是参照TCP/IP详解自己画的分解图
正常打开关闭
三次握手
- 第一次握手(SYN=1,seq=x)
- 客户端发送SYN包到服务器
- 客户端进入
SYN_SEND
状态,等待服务器确认
- 第二次握手(SYN=1,ACK=1,seq=y,ack=x+1)
- 服务器收到SYN包,确认客户的SYN
- 服务器发送SYN+ACK包
- 服务器进入
SYN_RECV
状态
- 第三次握手(ACK=1,ack=y+1)
- 客户端收到SYN+ACK包
- 客户端发送ACK包
- 客户端进入
ESTABLISHED
状态,服务器收到ACK包后也进入ESTABLISHED
状态
四次挥手
因为TCP是全双工的,因此在关闭连接的时候,必须关闭两个方向上的连接。
- 第一次挥手(FIN=1,seq=x)
- 假设是客户端想要关闭连接,客户端发送一个FIN包,表示自己没有数据可以发送了,但是可以接收数据
- 发送完毕,客户端进入
FIN_WAIT_1
状态
- 第二次挥手(ACK=1,ack=x+1)
- 服务器收到客户端的FIN包,表明自己接受到了客户端关闭连接的请求,但服务器没有做好准备关闭连接
- 服务器进入
CLOSE_WAIT
状态 - 客户端收到ACK包,进入
FIN_WAIT_2
状态,等待服务器关闭连接
- 第三次挥手(FIN=1,seq=y)
- 服务器准备好关闭连接,发送FIN包
- 服务器进入
LASK_ACK
状态
- 第四次挥手(ACK=1,ack=y+1)
- 客户端收到FIN包,发送ACK包
- 客户端进入
TIME_WAIT
状态 - 服务器进入收到ACK包,进入
CLOSED
状态 - 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入
CLOSED
状态。
状态转换图
同时打开/同时关闭
同时打开
同时关闭
状态转换图
在三次握手/四次分手的基础上加入同时打开同时关闭的情况
传送数据
来源:CSDN
作者:Dufre_WC
链接:https://blog.csdn.net/u011391629/article/details/103985051