1. 概述
TCP/IP协议是互联网的核心协议,其中TCP(传输控制协议)提供可靠的端到端连接。TCP握手是建立可靠连接的关键过程,结合以太网的物理连接过程,构成了完整的网络通信链路。
2. TCP/IP协议栈与以太网的关系
2.1 协议层次对应
| TCP/IP层次 | 以太网相关层次 | 主要协议 |
|------------|---------------|----------|
| 应用层 | - | HTTP、HTTPS、FTP |
| 传输层 | - | TCP、UDP |
| 网络层 | - | IP、ARP |
| 网络接口层 | 数据链路层 | 以太网帧 |
| - | 物理层 | 以太网信号 |
2.2 数据封装过程
```
应用层数据 → TCP段 → IP数据包 → 以太网帧 → 物理信号
```
3. TCP三次握手原理
3.1 握手目的
-
建立可靠连接
-
同步双方序列号
-
协商连接参数
-
验证双方通信能力
3.2 握手过程详解
第一次握手(SYN)
**客户端 → 服务器**
```
TCP段结构:
-
Source Port: 12345 (客户端随机端口)
-
Destination Port: 80 (HTTP服务端口)
-
Sequence Number: 1000 (客户端初始序列号)
-
Flags: SYN (同步标志位)
-
Window Size: 65535 (接收窗口大小)
```
**以太网帧封装:**
-
目标MAC: 服务器MAC地址或网关MAC
-
源MAC: 客户端MAC地址
-
EtherType: 0x0800 (IPv4)
-
数据: IP数据包
第二次握手(SYN+ACK)
**服务器 → 客户端**
```
TCP段结构:
-
Source Port: 80
-
Destination Port: 12345
-
Sequence Number: 2000 (服务器初始序列号)
-
Acknowledgment Number: 1001 (确认客户端序列号+1)
-
Flags: SYN+ACK (同步+确认)
-
Window Size: 65535
```
第三次握手(ACK)
**客户端 → 服务器**
```
TCP段结构:
-
Source Port: 12345
-
Destination Port: 80
-
Sequence Number: 1001
-
Acknowledgment Number: 2001 (确认服务器序列号+1)
-
Flags: ACK (确认标志位)
```
3.3 握手状态转换
```
客户端状态转换:
CLOSED → SYN_SENT → ESTABLISHED
服务器状态转换:
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED
```
3.4 序列号作用
-
确保数据有序传输
-
检测重复数据包
-
实现可靠重传
-
同步双方数据位置
4. TCP四次挥手原理
4.1 挥手目的
-
终止连接
-
释放资源
-
确保数据完整传输
4.2 挥手过程详解
第一次挥手(FIN)
**主动关闭方 → 被动关闭方**
```
TCP段结构:
-
Flags: FIN (结束标志位)
-
Sequence Number: 当前序列号
```
第二次挥手(ACK)
**被动关闭方 → 主动关闭方**
```
TCP段结构:
-
Flags: ACK
-
Acknowledgment Number: FIN序列号+1
```
第三次挥手(FIN)
**被动关闭方 → 主动关闭方**
```
TCP段结构:
-
Flags: FIN
-
Sequence Number: 当前序列号
```
第四次挥手(ACK)
**主动关闭方 → 被动关闭方**
```
TCP段结构:
-
Flags: ACK
-
Acknowledgment Number: FIN序列号+1
```
4.3 状态转换
```
主动关闭方:
ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
被动关闭方:
ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
```
4.4 TIME_WAIT状态
-
等待2倍最大报文段生存时间(MSL)
-
确保最后一个ACK被对方收到
-
防止旧连接的延迟报文干扰新连接
-
典型时间:60秒
5. 以太网连接过程与TCP握手的结合
5.1 完整连接流程
阶段1:物理连接建立
-
网卡检测物理介质
-
协商链路速率(10M/100M/1G/10G)
-
自动协商双工模式(半双工/全双工)
-
建立物理层连接
阶段2:数据链路层初始化
-
获取MAC地址
-
学习交换机MAC地址表
-
建立链路层通信能力
阶段3:网络层配置
-
获取IP地址(DHCP或静态配置)
-
设置子网掩码
-
配置默认网关
-
建立路由表
阶段4:TCP连接建立(三次握手)
-
客户端发送SYN
-
服务器回复SYN+ACK
-
客户端发送ACK
阶段5:数据传输
-
应用层数据发送
-
TCP分段和重组
-
流量控制和拥塞控制
-
数据确认和重传
阶段6:连接终止(四次挥手)
-
一方发送FIN
-
对方回复ACK
-
对方发送FIN
-
一方回复ACK
5.2 实际场景分析
**场景:浏览器访问网页**
-
**物理连接**:网线连接到交换机,协商1Gbps全双工
-
**链路层**:获取MAC地址,交换机学习端口映射
-
**网络层**:通过DHCP获取IP地址192.168.1.10
-
**TCP握手**:
-
客户端(192.168.1.10:12345) → 服务器(10.0.0.5:80) SYN
-
服务器 → 客户端 SYN+ACK
-
客户端 → 服务器 ACK
-
**数据传输**:HTTP GET请求和响应
-
**连接终止**:四次挥手关闭连接
6. ARP协议与TCP握手的配合
6.1 ARP地址解析
**过程**:
-
客户端需要发送数据包到目标IP
-
检查ARP缓存,查找对应MAC地址
-
如果未找到,发送ARP请求广播
-
目标设备回复ARP响应
-
更新ARP缓存
6.2 配合TCP握手
**实例**:
-
客户端准备发送SYN
-
查询ARP缓存获取网关MAC
-
如果未找到,发送ARP请求
-
获取网关MAC后封装以太网帧
-
发送SYN段
7. 常见问题与分析
7.1 SYN攻击
**原理**:攻击者发送大量SYN请求但不完成三次握手
**后果**:服务器资源耗尽,无法处理正常请求
**防御**:SYN cookies、防火墙限流
7.2 连接超时
**原因**:网络中断、目标不可达、防火墙阻止
**排查**:检查网络连通性、端口状态、防火墙规则
7.3 半开连接
**原因**:三次握手未完成
**处理**:TCP定时器超时后释放资源
7.4 重复ACK
**原因**:数据包丢失或乱序
**处理**:触发快速重传机制
8. 抓包分析实例
8.1 Wireshark抓包结果
```
No. Time Source Destination Protocol Length Info
1 0.000000 192.168.1.10 10.0.0.5 TCP 66 12345 → 80 [SYN] Seq=0 Win=65535
2 0.001234 10.0.0.5 192.168.1.10 TCP 66 80 → 12345 [SYN, ACK] Seq=0 Ack=1 Win=65535
3 0.001567 192.168.1.10 10.0.0.5 TCP 54 12345 → 80 [ACK] Seq=1 Ack=1 Win=65535
4 0.002345 192.168.1.10 10.0.0.5 HTTP 120 GET /index.html HTTP/1.1
5 0.003456 10.0.0.5 192.168.1.10 TCP 54 80 → 12345 [ACK] Seq=1 Ack=67 Win=65535
6 0.004567 10.0.0.5 192.168.1.10 HTTP 520 HTTP/1.1 200 OK
7 0.005678 192.168.1.10 10.0.0.5 TCP 54 12345 → 80 [FIN, ACK] Seq=67 Ack=467 Win=65535
8 0.006789 10.0.0.5 192.168.1.10 TCP 54 80 → 12345 [ACK] Seq=467 Ack=68 Win=65535
9 0.007890 10.0.0.5 192.168.1.10 TCP 54 80 → 12345 [FIN, ACK] Seq=467 Ack=68 Win=65535
10 0.008901 192.168.1.10 10.0.0.5 TCP 54 12345 → 80 [ACK] Seq=68 Ack=468 Win=65535
```
8.2 分析说明
-
帧1-3:TCP三次握手
-
帧4:HTTP GET请求
-
帧5:TCP确认
-
帧6:HTTP响应
-
帧7-10:TCP四次挥手
9. 总结
TCP握手是建立可靠网络连接的核心机制:
-
**三次握手**建立连接:同步序列号、协商参数
-
**四次挥手**终止连接:确保数据完整传输
-
**以太网配合**:提供物理层和数据链路层支持
-
**ARP协议**:完成IP到MAC的地址转换
理解TCP握手原理对于网络编程、故障排查和性能优化至关重要。在实际应用中,需要关注握手过程中的安全性和效率问题,采取适当的防护措施确保网络连接的可靠和安全。