TCP 三次握手
TCP 三次握手(Three-Way Handshake)是用来建立可靠的 TCP 连接的过程。其目的是为了确保双方都有能力发送和接收数据,并且初始化双方的序列号和确认号。以下是三次握手的具体步骤:
-
第一次握手:客户端发送一个 SYN(同步序列编号)包到服务器,表明客户端希望建立连接。
- 客户端发送一个 SYN 包,包含一个初始序列号(Sequence Number)。
- 标志位:SYN=1,ACK=0
-
第二次握手:服务器收到 SYN 包后,回应一个 SYN-ACK 包,表示同意连接,并给出自己的初始序列号。
- 服务器发送一个 SYN-ACK 包,包含服务器的初始序列号和对客户端初始序列号的确认号(客户端的序列号加一)。
- 标志位:SYN=1,ACK=1
-
第三次握手:客户端收到 SYN-ACK 包后,发送一个 ACK 包以确认连接。
- 客户端发送一个 ACK 包,确认服务器的序列号。
- 标志位:SYN=0,ACK=1
连接建立后,客户端和服务器可以开始数据传输。
TCP 四次挥手
TCP 四次挥手(Four-Way Handshake)是用来关闭一个 TCP 连接的过程。其目的是确保双方都有机会完整地关闭连接并释放资源。以下是四次挥手的具体步骤:
-
第一次挥手:主动关闭连接的一方(通常是客户端)发送一个 FIN(结束)包,表示数据传输结束,准备关闭连接。
- 客户端发送一个 FIN 包,包含当前序列号。
- 标志位:FIN=1,ACK=0
-
第二次挥手:被动关闭连接的一方(通常是服务器)收到 FIN 包后,发送一个 ACK 包,确认收到关闭请求。
- 服务器发送一个 ACK 包,确认客户端的序列号(序列号加一)。
- 标志位:FIN=0,ACK=1
-
第三次挥手:服务器发送一个 FIN 包,表示服务器的数据传输也结束,准备关闭连接。
- 服务器发送一个 FIN 包,包含当前序列号。
- 标志位:FIN=1,ACK=0
-
第四次挥手:客户端收到 FIN 包后,发送一个 ACK 包,确认收到关闭请求,并进入 TIME-WAIT 状态,确保服务器收到 ACK 包。
- 客户端发送一个 ACK 包,确认服务器的序列号(序列号加一)。
- 标志位:FIN=0,ACK=1
客户端在 TIME-WAIT 状态下会等待一段时间(通常是 2MSL,最大报文段生存时间)以确保 ACK 包被服务器收到,然后正式关闭连接。
图示
TCP 三次握手
Client Server
| SYN |
|------------------->|
| SYN-ACK |
|<-------------------|
| ACK |
|------------------->|
| |
TCP 四次挥手
Client Server
| FIN |
|------------------->|
| ACK |
|<-------------------|
| |
| FIN |
|<-------------------|
| ACK |
|------------------->|
| |
三次握手确保连接的建立是可靠的,四次挥手则确保连接的关闭是完整的。