一、TCP与UDP的核心区别
特性 | TCP | UDP |
---|---|---|
连接特性 | 面向连接(三次握手建立连接) | 无连接,直接传输数据 |
可靠性 | 通过确认重传、排序、流控保证可靠 | 尽力交付,不保证数据到达 |
流量控制 | 支持滑动窗口机制调节发送速率 | 不支持 |
数据分段 | 支持大数据分段传输 | 以完整报文传输(最大65507字节) |
资源与效率 | 头部大(20-60字节)、效率较低 | 头部小(8字节)、传输速度快 |
二、适用场景对比
1. TCP典型场景
- 文件传输(FTP/HTTP)
- 邮件协议(SMTP/POP3)
- 网页浏览(HTTPS)
核心需求:数据完整性与准确性优先,容忍一定延迟。
2. UDP典型场景
- 实时视频/直播(RTP)
- 在线游戏(MOBA/FPS)
- DNS查询
核心需求:低延迟优先,允许少量数据丢失。
三、协议头部结构详解
TCP头部(20-60字节)
1. 基础标识字段
- 源端口(Source Port):16位,标识发送方应用程序进程
- 目的端口(Destination Port):16位,标识接收方应用程序进程
- 序列号(Sequence Number):32位,标识发送数据流中第一个字节的序号
- 确认号(Acknowledgment Number):32位,期望接收的下一个字节序号(仅当ACK=1时有效)
2. 控制字段
- 头部长度(HL):4位,以32位字为单位计算头部长度(最小值为5,对应20字节)
- 保留位(Reserved):6位,必须置0,为未来协议扩展保留
- 控制标志(Control Flags):6位,按顺序表示:
URG
:紧急指针有效(置1时优先处理数据)ACK
:确认字段有效(建立连接后必须置1)PSH
:推送功能请求(要求立即提交数据到应用层)RST
:连接重置(强制中止异常连接)SYN
:同步序列号(连接建立阶段使用)FIN
:数据传输结束(正常关闭连接)
3. 流量控制字段
- 窗口大小(Window Size):16位,声明接收窗口剩余容量(最大65535字节)
- 紧急指针(Urgent Pointer):16位,配合URG标志定位紧急数据末尾位置
4. 校验与扩展
- 校验和(Checksum):16位,覆盖伪头部+TCP头部+数据的CRC校验值
- 选项(Options):可变长度,支持:
- 最大报文段大小(MSS)协商
- 窗口缩放因子(Window Scaling)
- 时间戳(Timestamp)
- 选择性确认(SACK)
伪头部校验机制
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source IP Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination IP Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Zero | Proto | TCP Length (包括头部和数据) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 组成要素:源/目的IP地址(各32位)、协议类型(8位)、TCP报文总长度(16位)
- 验证范围:IP层关键信息参与校验,防止路由篡改
2. UDP头部(固定8字节)
四、TCP连接管理机制
1. 三次握手建立连接
关键步骤:
- 客户端发送SYN包(随机初始化序列号x)
- 服务端返回SYN-ACK包(确认号x+1,随机序列号y)
- 客户端发送ACK包(确认号y+1),连接建立
2. 四次挥手释放连接
关键状态迁移:
- 客户端:FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT(等待2MSL)
- 服务端:CLOSE_WAIT → LAST_ACK → CLOSED
为什么需要四次挥手?
TCP是全双工协议,需分别关闭两个方向的数据流:
- 客户端关闭发送通道(FIN)
- 服务端确认并关闭接收通道(ACK)
- 服务端关闭发送通道(FIN)
- 客户端确认并关闭接收通道(ACK)
五,实验复现
一、实验环境搭建
拓扑设计
二、TCP三次握手复现(HTTP通信)
启动抓包
- 右键点击与路由器之间的链路 → 启动Wireshark抓包
- 设置过滤器:
tcp.port == 80
发起HTTP请求
数据包分析报告:TCP连接与HTTP通信全流程
1. TCP三次握手建立连接
数据包 | 源地址:端口 | 目标地址:端口 | 协议 | 标志位 | 序列号(Seq) | 确认号(Ack) | 说明 |
---|---|---|---|---|---|---|---|
1 | 192.168.1.10:2050 | 192.168.2.20:80 | TCP | SYN | 0 | - | 客户端发起连接请求 |
2 | 192.168.2.20:80 | 192.168.1.10:2050 | TCP | SYN+ACK | 0 | 1 | 服务端确认连接请求 |
3 | 192.168.1.10:2050 | 192.168.2.20:80 | TCP | ACK | 1 | 1 | 客户端确认连接建立 |
关键点:
- 序列号递增规则:SYN包占1个序号(
Seq=0
→ 下一包Seq=1
)。 - MSS协商:双方声明最大报文段长度(1460字节),基于MTU 1500字节(扣除IP和TCP头部)。
2. HTTP请求与响应
数据包 | 源地址:端口 | 目标地址:端口 | 协议 | 内容 | 说明 |
---|---|---|---|---|---|
4 | 192.168.1.10:2050 | 192.168.2.20:80 | HTTP | GET / HTTP/1.1 | 客户端请求根路径资源 |
5 | 192.168.2.20:80 | 192.168.1.10:2050 | HTTP | HTTP/1.1 200 OK | 服务端返回HTML内容 |
6 | 192.168.1.10:2050 | 192.168.2.20:80 | TCP | ACK | 客户端确认收到HTTP响应 |
关键点:
- HTTP协议特征:GET请求与200响应均通过TCP连接传输。
- 数据长度:HTTP响应包长度361字节(含头部和HTML内容)。
3. TCP四次挥手断开连接
数据包 | 源地址:端口 | 目标地址:端口 | 协议 | 标志位 | 序列号(Seq) | 确认号(Ack) | 说明 |
---|---|---|---|---|---|---|---|
7 | 192.168.1.10:2050 | 192.168.2.20:80 | TCP | FIN+ACK | 159 | 308 | 客户端发起断开请求 |
8 | 192.168.2.20:80 | 192.168.1.10:2050 | TCP | ACK | 308 | 160 | 服务端确认客户端的FIN |
9 | 192.168.2.20:80 | 192.168.1.10:2050 | TCP | FIN+ACK | 308 | 160 | 服务端发起断开请求 |
10 | 192.168.1.10:2050 | 192.168.2.20:80 | TCP | ACK | 160 | 309 | 客户端确认服务端的FIN |
关键点: 。
- 序列号与确认号规则:
- 客户端发送FIN后,序列号递增至159(假设之前数据长度为158字节)。
- 服务端确认号为160(159+1),符合
Ack=Seq+1
的规则。
4. 网络性能与延迟分析
阶段 | 时间差 | 说明 |
---|---|---|
SYN → SYN-ACK | 15ms | 网络往返时间(RTT)约15ms |
HTTP请求→响应 | 78ms | 服务端处理请求耗时 |
FIN → FIN-ACK | 843ms | 客户端等待应用层释放资源后断开连接 |
三、UDP协议验证(模拟DNS查询)
配置DNS服务
抓包设置
- 过滤器:
udp.port == 53
- 过滤器:
执行DNS查询
DNS查询与响应抓包分析报告
1. 数据包概览
数据包 | 时间戳 | 源地址:端口 | 目标地址:端口 | 协议 | 长度 | 信息 |
---|---|---|---|---|---|---|
21 | 1092.078000 | 192.168.1.10:49153 | 192.168.2.20:53 | DNS | 71字节 | 查询 www.aaa.com 的A记录 |
23 | 1092.156000 | 192.168.2.20:53 | 192.168.1.10:49153 | DNS | 87字节 | 响应 www.aaa.com → 192.168.2.20 |
2. 分层解析
2.1 数据包21(DNS查询)
以太网层
- 源MAC:
54:89:98:53:50:b4
(客户端) - 目的MAC:
00:e0:fc:90:09:b9
(DNS服务器/路由器) - 关键点:若跨子网通信,目的MAC可能为路由器接口MAC。
- 源MAC:
IP层
- 源IP:
192.168.1.10
(客户端) - 目的IP:
192.168.2.20
(DNS服务器) - 关键点:客户端与DNS服务器位于不同子网(
192.168.1.0/24
vs192.168.2.0/24
),需通过路由器转发。
- 源IP:
UDP层
- 源端口:
49153
(客户端临时端口) - 目的端口:
53
(DNS服务端口) - 关键点:DNS默认使用UDP,仅当响应过大时切换TCP。
- 源端口:
DNS层
- 事务ID:
0x0000
- 查询类型:
A
记录(IPv4地址) - 查询域名:
www.aaa.com
- 关键点:
- 事务ID应为随机值(此处为
0x0000
,需检查是否为抓包工具显示问题或配置异常)。 - 查询长度71字节,符合简单DNS查询的典型大小。
- 事务ID应为随机值(此处为
- 事务ID:
2.2 数据包23(DNS响应)
以太网层
- 源MAC:
00:e0:fc:90:09:b9
(DNS服务器/路由器) - 目的MAC:
54:89:98:53:50:b4
(客户端)
- 源MAC:
IP层
- 源IP:
192.168.2.20
(DNS服务器) - 目的IP:
192.168.1.10
(客户端)
- 源IP:
UDP层
- 源端口:
53
(DNS服务端口) - 目的端口:
49153
(客户端临时端口)
- 源端口:
DNS层
- 事务ID:
0x0000
(与查询匹配) - 响应类型:
A
记录 - 解析结果:
www.aaa.com
→192.168.2.20
- 关键点:
- 响应长度87字节,包含查询结果和资源记录头部。
- 若
192.168.2.20
为DNS服务器自身IP,可能是本地测试配置(如hosts文件或本地DNS记录)。
- 事务ID: