TCP/UDP协议笔记
一、 TCP协议 (Transmission Control Protocol)
TCP 是面向连接的、可靠的传输协议。为了保证可靠性,它的头部结构相对复杂。
1. TCP 协议的组成(头部结构)
标准的 TCP 头部通常是 20 字节(不含选项 Options),主要包含以下部分:
-
源端口 (Source Port) & 目的端口 (Destination Port): 标识源应用和目标应用。
-
序列号 (Sequence Number, Seq): 用于给数据包排序,解决乱序问题。
-
确认号 (Acknowledgment Number, Ack): 期望收到对方下一个报文段的第一个数据字节的序号,用于确认收到数据。
-
数据偏移 (Data Offset): 指示 TCP 头部的长度。
-
保留位 (Reserved): 保留未来使用。
-
标志位 (Flags) - 最核心部分:
-
SYN: 发起连接。
-
ACK: 确认收到。
-
FIN: 结束连接。
-
RST: 重置连接(通常表示异常断开)。
-
PSH: 提示接收端立即将数据推送给应用层。
-
URG: 紧急指针有效。
-
-
窗口大小 (Window Size): 用于流量控制,告诉对方自己还能接收多少数据。
-
校验和 (Checksum): 校验头部和数据的完整性(防止物理线路误码)。
-
紧急指针 (Urgent Pointer): 只有 URG 标志置位时才有效。
-
选项 (Options): 可变长,如 MSS(最大报文段长度)、SACK(选择性确认)、时间戳等。
2. TCP 抓包重点看什么?
在 Wireshark 或 Tcpdump 中排查问题时,重点关注以下字段:
-
Flags (标志位):
-
看连接状态: 是否有完整的 3次握手 (SYN, SYN-ACK, ACK) 和 4次挥手。
-
看异常: 如果出现大量的 RST,说明连接被强制切断(防火墙拦截、端口未监听、服务崩溃)。
-
看重传: 结合 Seq/Ack,如果看到同样的 Seq 重复出现,说明发生了重传,网络质量差或拥塞。
-
-
Window Size (窗口大小):
-
Zero Window (零窗口): 如果接收端窗口变为 0,说明接收端处理不过来了,发送端会暂停发送。这是排查应用层性能瓶颈的关键。
-
-
Stream Analysis (流分析):
-
关注 RTT (往返时间),判断网络延迟。
-
关注 Out-of-Order (乱序),判断链路是否不稳定。
-
二、 UDP协议 (User Datagram Protocol)
UDP 是无连接的、不可靠的传输协议,追求传输效率。
1. UDP 协议的组成(头部结构)
UDP 头部非常简单,固定为 8 字节:
-
源端口 (Source Port): 发送方的端口。
-
目的端口 (Destination Port): 接收方的端口。
-
长度 (Length): UDP 头部 + 数据载荷的总长度。
-
校验和 (Checksum): 校验头部和数据的完整性(在 IPv4 中可选,IPv6 中强制)。
2. UDP 抓包重点看什么?
因为 UDP 很简单,没有握手和重传机制,抓包主要看:
-
数据载荷 (Payload):
-
因为 UDP 头部信息少,分析重点通常在应用层数据本身(如 DNS 查询内容、RTP 音视频流数据)。
-
-
分片 (Fragmentation):
-
如果 UDP 包过大(超过 MTU,通常 1500 字节),会在 IP 层被分片。抓包时需关注是否有IP分片 (IP Fragments),过多的分片会降低性能且容易被丢弃。
-
-
丢包:
-
UDP 自身不反馈丢包。你需要通过应用层表现(如视频卡顿、语音断续)结合抓包中的序列号(如果应用层协议有设计)来推断。
-
-
ICMP Port Unreachable:
-
如果发送 UDP 包后收到 ICMP 端口不可达报错,说明目标端口未开启。
-
三、 是否可以篡改?
答案是肯定的:TCP 和 UDP 都可以被篡改。
网络协议栈的设计初衷(上世纪80年代)主要解决的是连通性和物理误码,而不是对抗恶意攻击。
1. 为什么可以篡改?
-
明文传输: 标准的 TCP/UDP 头部和载荷(Payload)在默认情况下都是明文的。中间人(Man-in-the-Middle, MitM)可以拦截、修改数据包,然后重新计算校验和并发给接收端。
-
校验和 (Checksum) 脆弱: TCP/UDP 的 Checksum 算法(16位反码求和)只能检测物理传输中的随机错误(如比特翻转),无法防御恶意篡改。攻击者修改数据后,只需简单计算一个新的 Checksum 填进去,接收端就会认为数据是合法的。
2. 常见的篡改与攻击方式
-
TCP 注入/劫持: 攻击者监听到当前的 Seq 和 Ack 号后,可以伪造一个合法的数据包插入到连接中(例如插入一个 RST 包断开连接,或者插入恶意的 HTTP 重定向)。
-
NAT (网络地址转换): 实际上路由器做 NAT 就是合法的“篡改”,它修改了 TCP/UDP 头部的源 IP 和端口,并重新计算校验和。
-
UDP 欺骗: 由于 UDP 无连接,攻击者可以极其容易地伪造源 IP 地址发送 UDP 包(常用于 DDoS 反射攻击)。
3. 如何防止篡改?
既然 TCP/UDP 自身无法防篡改,必须依靠上层加密协议:
-
应用层加密 (最常用):
-
TCP -> TLS/SSL (即 HTTPS): 在 TCP 之上加一层 TLS,对数据进行加密和完整性校验(MAC)。即使中间人修改了 TCP 包,解密后的校验也会失败,连接会被丢弃。
-
UDP -> DTLS / QUIC: 类似于 TLS,专门用于 UDP 的加密传输。
-
-
网络层加密:
-
IPsec (VPN): 在 IP 层对整个数据包(包括 TCP/UDP 头部和载荷)进行加密封装。
-
总结
| 特性 | TCP | UDP |
| 头部关键 | 序列号、确认号、标志位(SYN/FIN/RST)、窗口大小 | 源端口、目的端口、长度 |
| 抓包重点 | 握手/挥手状态、重传率、零窗口、时延 | 内容本身、IP分片、ICMP不可达错误 |
| 篡改 | 极易篡改(需重新计算 Checksum) | 极易篡改(且极易伪造源地址) |
| 防篡改方案 | 使用 TLS/SSL (HTTPS) | 使用 DTLS 或 QUIC |
更多推荐


所有评论(0)