2025-03-20 08:03:42 +08:00

45 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 三次握手的具体流程
TCP三次握手的流程如下
1. **第一次握手**
客户端发送SYN同步序列号报文SYN=1seq=x到服务器请求建立连接并进入`SYN_SENT`状态。
2. **第二次握手**
服务器收到SYN报文后回复SYN+ACK报文SYN=1ACK=1seq=yack=x+1确认客户端的请求并进入`SYN_RCVD`状态。
3. **第三次握手**
客户端收到SYN+ACK后发送ACK报文ACK=1seq=x+1ack=y+1给服务器双方进入`ESTABLISHED`状态,连接建立完成。
**核心作用**通过三次交互双方同步初始序列号ISN并验证双向通信能力确保数据可靠传输。
![三次握手](https://cdn.xiaolincoding.com/gh/xiaolincoder/ImageHost4/%E7%BD%91%E7%BB%9C/TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B.drawio.png)
## TCP为什么要三次握手 两次不行吗 四次不行吗
TCP 三次握手的设计是为了在可靠性和效率之间取得平衡。以下详细解释为什么两次握手不行,四次握手也没必要:
### 1. **为什么两次握手不行?**
两次握手无法确保双方的通信能力都被验证,可能导致历史连接或无效连接的问题:
- **无法防止历史连接的建立**:如果只有两次握手,客户端发送 SYN 请求后,服务器直接返回 ACK 确认并进入连接状态。但如果这个 SYN 是一个延迟的历史请求,客户端可能已经不再需要这个连接,导致服务器浪费资源。
- **无法可靠同步双方序列号**TCP 需要通过握手过程同步双方的初始序列号ISN。两次握手只能保证一方的序列号被确认而另一方的序列号可能未被正确接收和确认这会影响数据传输的可靠性。
### 2. **为什么四次握手没必要?**
四次握手虽然也能完成连接建立,但它是冗余的:
- 在 TCP 握手过程中,服务器收到客户端的 SYN 请求后,会同时发送自己的 SYN 和对客户端 SYN 的 ACK 确认。这两个动作可以合并为一次操作SYN+ACK从而将四次握手优化为三次握手。
- 四次握手增加了不必要的网络开销,降低了连接建立的效率。
### 3. **三次握手的优点**
三次握手是理论上最少且最高效的连接建立方式,能够满足以下需求:
- **双向通信能力验证**:通过三次握手,客户端和服务端都能确认对方的发送和接收能力正常。
- **序列号同步**三次握手确保双方的初始序列号ISN都被正确接收和确认从而支持后续可靠的数据传输。
- **避免无效连接**:第三次握手(客户端发送 ACK可以确保客户端也认可了连接的建立避免了因历史请求或网络异常导致的无效连接。
### 总结
- **两次握手不可靠**:无法验证双方的通信能力和同步序列号,可能导致资源浪费和数据传输问题。
- **四次握手不高效**:可以通过优化将 SYN 和 ACK 合并,减少一次交互。
- **三次握手最佳**:既能保证可靠性,又能提高效率,是最优的设计选择。
# 嫑biao