计算机网络之 TCP 三次握手详解
一、TCP 简介
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠的传输层协议。
TCP 的主要特点:
- 面向连接
- 可靠传输
- 字节流传输
- 全双工通信
- 拥塞控制
TCP 通信过程主要包括:
- 建立连接(三次握手)
- 数据传输
- 断开连接(四次挥手)
二、为什么需要三次握手?
TCP 是可靠通信协议,通信双方在传输数据之前,需要确认:
- 双方的发送能力是否正常
- 双方的接收能力是否正常
- 初始序列号是否同步
因此 TCP 在正式传输数据前,需要通过三次握手建立连接。
三、TCP 三次握手过程
TCP 三次握手过程如下:
第一次握手
客户端发送 SYN
客户端向服务器发送 SYN 报文:
SYN = 1 Seq = x表示:
客户端请求建立连接,并告诉服务器自己的初始序列号。
状态变化:
客户端:
CLOSED -> SYN_SENT服务器:
LISTEN第二次握手
服务器回复 SYN + ACK
服务器收到客户端 SYN 后:
- 回复确认 ACK
- 同时发送自己的 SYN
报文:
SYN = 1 ACK = 1 Seq = y Ack = x + 1含义:
Ack = x + 1表示已经收到客户端 SYNSeq = y表示服务器自己的初始序列号
状态变化:
服务器:
LISTEN -> SYN_RCVD第三次握手
客户端发送 ACK
客户端收到服务器 SYN+ACK 后:
发送确认报文:
ACK = 1 Seq = x + 1 Ack = y + 1表示:
已经收到服务器的 SYN,可以开始通信。
状态变化:
客户端:
SYN_SENT -> ESTABLISHED服务器收到 ACK 后:
SYN_RCVD -> ESTABLISHED此时 TCP 连接建立完成。
四、为什么是三次握手?两次可以吗?
两次握手的问题
假设只有两次:
服务器收到 SYN 后认为连接建立。
但是:
如果客户端发送的 SYN 因网络延迟没有到达,而之后重新发送旧 SYN:
服务器可能误认为:
客户端又发起了一次新的连接。
导致资源浪费。
三次握手可以让双方确认:
- 防止历史连接
- 客户端发送能力正常
- 服务端发送能力正常
- 服务端接收能力正常
- 客户端接收能力正常
保证双方状态同步。
五、三次握手过程中可能出现的问题
SYN 洪泛攻击(SYN Flood)
攻击者发送大量 SYN 请求:
客户端 ---- SYN ----> 服务器服务器回复 SYN+ACK 后等待 ACK。
但是攻击者不发送 ACK。
导致:
- 半连接队列占满
- 正常用户无法连接
解决方法:
- 增大TCP半连接队列
- 开启SYN Cookie
- 限制连接数量
- 调大netdev_max_backlog
六、TCP 三次握手状态变化
客户端:
CLOSED -> SYN_SENT -> ESTABLISHED服务器:
LISTEN -> SYN_RCVD -> ESTABLISHED七、面试常见问题
1. 为什么需要三次握手?
答案:
TCP 三次握手主要用于确认双方的发送和接收能力,同时同步双方的初始序列号,保证后续数据可靠传输。
2. 第三次握手可以携带数据吗?
可以。
客户端发送 ACK 时可以携带数据。
但是通常不会立即发送业务数据,而是连接建立后再传输。
3. 服务端收到 SYN 后处于什么状态?
收到第一次握手:
LISTEN -> SYN_RCVD4. SYN 和 ACK 分别表示什么?
| 标志位 | 含义 |
|---|---|
| SYN | 请求建立连接 |
| ACK | 确认收到数据 |
总结
TCP 三次握手是 TCP 建立可靠连接的重要机制。
整个过程:
第一次: 客户端发送 SYN 第二次: 服务器发送 SYN+ACK 第三次: 客户端发送 ACK通过三次握手,TCP 完成:
- 连接建立
- 序列号同步
- 双方状态确认
这是计算机网络中非常重要的基础知识,也是 C/C++ 后端、网络编程岗位面试中的高频考点。