TCP/IP 四层模型与封装过程
OSI 是 ISO 制定的参考模型,TCP/IP 才是互联网实际运行的协议栈。理解 TCP 三次握手、UDP 无连接特性、IP 包头字段——这些是读懂任何抓包结果的前提。
TCP/IP 四层与 OSI 对应关系
OSI 七层 TCP/IP 四层 协议示例
────────────────────────────────────────────────────────
7 应用层 ┐
6 表示层 ├─────────────→ 应用层 HTTP/S, DNS, SMTP, FTP,
5 会话层 ┘ SSH, SNMP, NTP
────────────────────────────────────────────────────────
4 传输层 ──────────────→ 传输层 TCP, UDP
────────────────────────────────────────────────────────
3 网络层 ──────────────→ 网络层/互联网层 IP (v4/v6), ICMP, IGMP
────────────────────────────────────────────────────────
2 数据链路层 ┐
1 物理层 ├───────────→ 网络接口层 Ethernet, Wi-Fi(802.11),
┘ ARP, PPP
TCP:可靠传输协议
三次握手(Three-Way Handshake)
客户端 服务器
│ │
│──── SYN (seq=100) ───────────→│ 第1步:我想连接你
│ │
│←─── SYN-ACK (seq=200,ack=101)─│ 第2步:好的,我也想连你
│ │
│──── ACK (ack=201) ───────────→│ 第3步:确认收到
│ │
│═══════ 数据传输 ══════════════│
│ │
│──── FIN ────────────────────→│ 四次挥手断开连接
│←─── ACK ──────────────────── │
│←─── FIN ──────────────────── │
│──── ACK ────────────────────→│
为什么是三次? 两次握手无法确认双向通信都正常;四次握手多余。三次握手确保: - 客户端的发送和接收都正常 - 服务器的发送和接收都正常
TCP 包头关键字段
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
├─────────────────────┬─────────────────────────────────────────────┤
│ 源端口 (16bit) │ 目标端口 (16bit) │
├─────────────────────────────────────────────────────────────────┤
│ 序列号 Sequence Number (32bit) │
├─────────────────────────────────────────────────────────────────┤
│ 确认号 Acknowledgment Number (32bit) │
├─────────┬───────────┬─────────────────────────────────────────┤
│ 数据偏移 │ 保留位 │ URG ACK PSH RST SYN FIN │ 窗口大小 │
├─────────────────────────────────────────────────────────────────┤
│ 校验和 Checksum │ 紧急指针 │
└─────────────────────────────────────────────────────────────────┘
关键标志位:
SYN = 同步,建立连接
ACK = 确认
FIN = 终止,结束连接
RST = 复位,强制断开
PSH = 推送,立即传递数据给应用层
TCP 可靠性机制
机制 作用
─────────────────────────────────────────────────────
序号/确认号 确保数据按序接收,检测丢失
滑动窗口 流量控制,避免接收方被淹没
重传机制 超时或收到3个重复ACK触发重传
拥塞控制 慢启动/拥塞避免/快重传/快恢复
UDP:无连接协议
特性 TCP UDP
──────────────────────────────────────────────────────
连接方式 面向连接 无连接
可靠性 保证送达 不保证
顺序保证 有序 无序
速度 慢 快
头部大小 20-60 字节 8 字节
适用场景 HTTP, SSH, 文件 DNS, 视频流, 游戏, DHCP
UDP 头部(仅 8 字节):
源端口 (16bit) | 目标端口 (16bit) | 长度 (16bit) | 校验和 (16bit)
IP 包头解析
IPv4 包头(最小 20 字节):
版本(4) | 头长度(4) | 服务类型(8) | 总长度(16)
─────────────────────────────────────────────────────
标识(16) | 标志(3) | 片偏移(13)
─────────────────────────────────────────────────────
TTL(8) | 协议(8) | 头部校验和(16)
─────────────────────────────────────────────────────
源IP地址 (32bit)
─────────────────────────────────────────────────────
目标IP地址 (32bit)
─────────────────────────────────────────────────────
重要字段:
TTL (Time To Live):每经过一个路由器减1,到0丢弃,防止包无限循环
协议字段:6=TCP, 17=UDP, 1=ICMP
标志位:DF(Don't Fragment)=1 不允许分片
ICMP:网络诊断协议
# ping 使用 ICMP Echo Request/Reply(类型 8/0)
ping -c 4 8.8.8.8
# traceroute/tracert 利用 TTL 递增 + ICMP Time Exceeded(类型 11)
traceroute 8.8.8.8
# 查看 ICMP 类型含义:
# Type 0 = Echo Reply(ping 回应)
# Type 3 = Destination Unreachable(目标不可达,含多种 Code)
# Type 8 = Echo Request(ping 请求)
# Type 11 = Time Exceeded(TTL 超时,traceroute 利用此原理)
用 ss / netstat 查看传输层状态
# 查看所有 TCP 监听端口
ss -tlnp
# 查看已建立的 TCP 连接
ss -tnp state established
# 查看特定端口的连接状态
ss -tnp | grep :443
# TCP 连接状态机:
# LISTEN → 等待连接(服务器)
# SYN_SENT → 已发 SYN,等待服务器 SYN-ACK
# SYN_RECV → 收到 SYN,等待最终 ACK
# ESTABLISHED → 连接建立,正常通信
# TIME_WAIT → 连接关闭中(等待 2*MSL 确保最后 ACK 送达)
# CLOSE_WAIT → 对方已发 FIN,本端等待应用层关闭
CCNA 对应考点
考纲位置:Domain 1.5 — Compare TCP to UDP
高频考题: - TCP vs UDP 的差异(可靠性、速度、适用场景) - 三次握手各步骤的 Flag(SYN / SYN-ACK / ACK) - TTL 字段的作用 - 常见协议的端口号(HTTP:80, HTTPS:443, DNS:53, SSH:22, FTP:21/20)
下一节:常见协议在哪一层——快速建立"协议→层级"的映射,让你看到任何协议名都能立即判断它工作在哪一层。