三次握手(建立连接)
- 第一次握手:客户端向服务器发送一个
SYN
包(包含客户端的初始序列号seq=x
),表示客户端请求建立连接。此时客户端进入SYN_SENT
状态。 - 第二次握手:服务器收到
SYN
包后,会发送一个SYN+ACK
包(包含服务器的初始序列号seq=y
和对客户端SYN
的确认号ack=x+1
),表示服务器同意建立连接。此时服务器进入SYN_RCVD
状态。 - 第三次握手:客户端收到
SYN+ACK
包后,会发送一个ACK
包(确认号ack=y+1
),表示客户端已收到服务器的响应。此时客户端和服务器都进入ESTABLISHED
状态,连接建立完成。
客户端 服务器
| |
| SYN (seq=x) |
| ---------------------------> |
| |
| SYN+ACK (seq=y, ack=x+1) |
| <--------------------------- |
| |
| ACK (ack=y+1) |
| ---------------------------> |
| |
| 连接建立 (ESTABLISHED) |
| |
四次挥手(断开连接)
- 第一次挥手:客户端向服务器发送一个
FIN
包(包含序列号seq=u
),表示客户端请求断开连接。此时客户端进入FIN_WAIT_1
状态。 - 第二次挥手:服务器收到
FIN
包后,会发送一个ACK
包(确认号ack=u+1
),表示服务器已收到断开请求。此时服务器进入CLOSE_WAIT
状态,客户端进入FIN_WAIT_2
状态。 - 第三次挥手:服务器完成数据发送后,会发送一个
FIN
包(包含序列号seq=v
),表示服务器也准备断开连接。此时服务器进入LAST_ACK
状态。 - 第四次挥手:客户端收到
FIN
包后,会发送一个ACK
包(确认号ack=v+1
),表示客户端已收到服务器的断开请求。此时客户端进入TIME_WAIT
状态,等待一段时间后关闭连接;服务器收到ACK
后立即关闭连接。
客户端 服务器
| |
| SYN (seq=x) |
| ---------------------------> |
| |
| SYN+ACK (seq=y, ack=x+1) |
| <--------------------------- |
| |
| ACK (ack=y+1) |
| ---------------------------> |
| |
| 连接建立 (ESTABLISHED) |
| |