tcp三次握手及其状态变化
TCP 的三次握手(Three-Way Handshake)是建立可靠 TCP 连接的重要过程。在这个过程中,客户端和服务器通过一系列的状态变化互相确认对方的可用性,以确保连接的可靠性。以下是 TCP 三次握手的详细过程及连接状态变化。
# 三次握手过程
# 阶段 1:连接请求
- 客户端准备建立连接,发送一个
SYN
(Sync)报文段到服务器。这个报文中包含客户端生成的初始序列号(seq
)。- 状态变化:
- 客户端状态:
CLOSED
→SYN_SENT
- 服务器状态:
CLOSED
- 客户端状态:
- 状态变化:
# 阶段 2:连接确认
- 服务器接收到客户的
SYN
报文段,回应一个SYN-ACK
(Sync-Acknowledgment)报文段。这个报文中包含服务器生成的初始序列号(seq
),并确认客户端的SYN
报文(确认号ack
为客户端的初始序列号 + 1)。- 状态变化:
- 客户端状态:
SYN_SENT
(继续保持) - 服务器状态:
CLOSED
→SYN_RECEIVED
- 客户端状态:
- 状态变化:
# 阶段 3:连接确认
- 客户端接收到服务器的
SYN-ACK
报文段后,发送一个ACK
(确认)报文段给服务器,确认号为ack
+= 1,表示连接建立完成。- 状态变化:
- 客户端状态:
SYN_SENT
→ESTABLISHED
- 服务器状态:
SYN_RECEIVED
→ESTABLISHED
- 客户端状态:
- 状态变化:
# 总结连接状态变化
操作 | 客户端状态 | 服务器状态 |
---|---|---|
Start Connection | CLOSED → SYN_SENT | CLOSED |
Recieve SYN | SYN_SENT | CLOSED → SYN_RECEIVED |
Send SYN-ACK | SYN_SENT | SYN_RECEIVED |
Recieve ACK | SYN_SENT → ESTABLISHED | SYN_RECEIVED → ESTABLISHED |
# 握手示意图
以下是 TCP 三次握手的示意图:
Client Server
| SYN(seq=x) ----------------------------------> |
| |
| <----------------- SYN-ACK(seq=y, ack=x+1) ---|
| |
| ACK(ack=y+1) --------------------------------> |
| |
| Connection Established |
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 可能的异常情况
在 TCP 三次握手过程中,虽然通常情况下连接的建立是顺利的,但在网络环境中,可能会出现各种异常场景。以下是一些可能的异常情况及其相应的描述:
# 1. 重复的 SYN 请求
- 场景:客户端由于网络延迟或者重试机制,可能会重复发送同一个 SYN 报文。
- 影响:服务器可能会将其视为正常的连接请求,并返回多次 SYN-ACK。这种情况不会影响最终的连接建立,因为服务器最终会等待客户端的有效 ACK。
# 2. 丢失的 SYN-ACK 响应
- 场景:在第一步中,客户端发送 SYN 请求后,服务器发送 SYN-ACK 报文段,但这个 ACK 报文在传输过程中丢失。
- 影响:客户端因未收到 SYN-ACK,会在超时后重新发送 SYN 请求,导致连接重试。服务器会响应新的 SYN 请求。
# 3. 没有确认的连接(ACK 丢失)
- 场景:客户端的 ACK 报文段可能在传输中丢失,导致服务器未收到确认。
- 影响:此时,服务器会在超时后认为连接没有建立,并可能关闭等待状态,或重新发送 SYN-ACK 报文。
# 4. 伪装的 SYN 攻击
- 场景:网络攻击者产生大量伪造的 SYN 请求,攻击的目标是耗尽服务器的资源。
- 影响:服务器会因接收到大量的 SYN 请求而处于半连接状态,最终可能导致拒绝服务(DoS)。这会造成正常用户无法建立连接。
# 5. TCP 连接请求到错误的端口
- 场景:客户端尝试连接到服务器的一个不存在的端口。
- 影响:服务器将返回一个 RST(重置)报文段。客户端会立即感知连接失败。
# 6. 序列号冲突
- 场景:如果客户端重启并重新发送先前的连接请求,而一个新的 SYN 报文段的序列号与之前的连接请求重复。
- 影响:服务器可能无法正确识别这个请求,因为它可能误认为这是个重发的连接请求,从而导致旧连接的状态混淆。
# 7. MTU(最大传输单元)问题
- 场景:网络中的 MTU 设置不一致,导致 SYN 或 SYN-ACK 报文过大被损坏或丢失。
- 影响:连接建立失败,客户端无法收到其请求的确认。
# 8. 主动端的网络分区
- 场景:客户端在发送 SYN 且等待 SYN-ACK 期间失去与服务器的网络连接。
- 影响:相同的情形会使连接无法建立,导致重试和超时。
# 9. 拒绝连接
- 场景:服务器由于负载过重、策略限制或防火墙阻挡拒绝新的连接请求。
- 影响:服务器可能返回一个 RST 报文,客户端会知道连接请求被拒绝。
# 总结
TCP 三次握手过程中可能出现的异常情况主要都与网络不稳定、丢包、攻击以及服务器的资源管理有关。在设计和实施 TCP 连接时,因此要考虑这些潜在的问题,并根据实际应用的需求进行合理的异常处理和保障措施,以确保网络连接的可靠性和安全性。
编辑 (opens new window)
上次更新: 2024/09/13, 11:59:12