TCP/IP 协议详解
约 1920 字大约 6 分钟
TCP/IP网络协议TCPUDP
2026-04-16
TCP/IP 模型分层
TCP/IP 协议栈采用四层架构,与 OSI 七层模型有着对应关系:
| TCP/IP 四层 | OSI 七层 | 典型协议 |
|---|---|---|
| 应用层 | 应用层、表示层、会话层 | HTTP, FTP, DNS, SMTP |
| 传输层 | 传输层 | TCP, UDP |
| 网络层 | 网络层 | IP, ICMP, ARP |
| 网络接口层 | 数据链路层、物理层 | Ethernet, PPP |
与 OSI 模型对比
┌─────────────────────────────────────┐
│ 应用层 (HTTP) │ ←→ 应用层 + 表示层 + 会话层
├─────────────────────────────────────┤
│ 传输层 (TCP/UDP) │ ←→ 传输层
├─────────────────────────────────────┤
│ 网络层 (IP) │ ←→ 网络层
├─────────────────────────────────────┤
│ 网络接口层 (Ethernet) │ ←→ 数据链路层 + 物理层
└─────────────────────────────────────┘IP 协议
IP(Internet Protocol)是网络层的核心协议,负责将数据包从源地址传送到目标地址。
IPv4 地址分类
IPv4 地址由 32 位二进制组成,通常用点分十进制表示(如 192.168.1.1)。
| 类别 | 地址范围 | 网络数 | 主机数 | 私有地址范围 |
|---|---|---|---|---|
| A 类 | 1.0.0.0 - 126.255.255.255 | 126 | 16,777,214 | 10.0.0.0 - 10.255.255.255 |
| B 类 | 128.0.0.0 - 191.255.255.255 | 16,384 | 65,534 | 172.16.0.0 - 172.31.255.255 |
| C 类 | 192.0.0.0 - 223.255.255.255 | 2,097,152 | 254 | 192.168.0.0 - 192.168.255.255 |
| D 类 | 224.0.0.0 - 239.255.255.255 | - | 多播地址 | - |
| E 类 | 240.0.0.0 - 255.255.255.255 | - | 保留 | - |
子网掩码与 CIDR
子网掩码用于区分 IP 地址中的网络 ID 和主机 ID:
# 传统子网掩码
192.168.1.100 子网掩码: 255.255.255.0
# 表示网络号: 192.168.1.0,主机号: 100
# CIDR 表示法 (无类别域间路由)
192.168.1.0/24 等价于 192.168.1.0 子网掩码 255.255.255.0
10.0.0.0/8 等价于 10.0.0.0 子网掩码 255.0.0.0
172.16.0.0/12 等价于 172.16.0.0 子网掩码 255.240.0.0CIDR 的优势:
- 减少路由表条目数量
- 提高 IP 地址分配效率
- 支持路由聚合(路由汇总)
IPv6 简介
IPv6 采用 128 位地址,格式为冒号分隔的十六进制:
# IPv6 地址示例
2001:0db8:85a3:0000:0000:8a2e:0370:7334
2001:db8:85a3::8a2e:370:7334 # 简化写法
# 本地链路地址
fe80::1
# IPv6 主要优势
- 地址空间巨大 (2^128)
- 简化的报文头部
- 内置安全支持 (IPsec)
- 更好的移动性支持
- 取消 NAT,减少地址冲突TCP 协议核心机制
TCP(Transmission Control Protocol)是一种面向连接、可靠的传输协议。
三次握手(连接建立)
客户端 服务端
│ │
│ ─────────── SYN (seq=x) ───────▶ │
│ │
│ ◀──────── SYN+ACK (seq=y,ack=x+1) │ │
│ │
│ ─────────── ACK (ack=y+1) ─────▶ │
│ │
│ 连接建立完成 │握手过程解析:
- 第一次握手:客户端发送 SYN 包(SYN=x),进入 SYN_SENT 状态
- 第二次握手:服务端收到 SYN,发送 SYN+ACK 包(SYN=y, ACK=x+1),进入 SYN_RCVD 状态
- 第三次握手:客户端收到 SYN+ACK,发送 ACK 包(ACK=y+1),双方进入 ESTABLISHED 状态
# 使用 tcpdump 观察三次握手
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'四次挥手(连接释放)
客户端 服务端
│ │
│ ─────────── FIN (seq=u) ───────▶ │ 客户端发送 FIN,进入 FIN_WAIT_1
│ │
│ ◀─────────── ACK (ack=u+1) ──── │ 服务端发送 ACK,进入 CLOSE_WAIT
│ │
│ 客户端进入 FIN_WAIT_2 │
│ │
│ ◀─────────── FIN (seq=w) ────── │ 服务端发送 FIN,进入 LAST_ACK
│ │
│ ──────────── ACK (ack=w+1) ───▶ │ 客户端发送 ACK,进入 TIME_WAIT
│ │
│ 等待 2MSL 后关闭 │挥手过程解析:
- 主动关闭方发送 FIN,进入 FIN_WAIT_1
- 被动关闭方发送 ACK,进入 CLOSE_WAIT
- 主动关闭方收到 ACK,进入 FIN_WAIT_2
- 被动关闭方处理完数据后发送 FIN,进入 LAST_ACK
- 主动关闭方发送 ACK,进入 TIME_WAIT
- 等待 2MSL(最大报文生存时间)后关闭
可靠传输机制
序列号与确认应答
# 序列号作用
- 数据字节的唯一标识
- 支持乱序重组
- 支持重复检测
# 确认应答 (ACK)
- 确认已收到的数据字节数
- ACK 携带的值为下一个期望接收的序列号超时重传
发送方 接收方
│ │
│ ──────────── 数据 ───────────── ▶ │
│ │
│ (超时未收到 ACK) │
│ │
│ ──────────── 重传 ───────────── ▶ │超时重传策略:
- RTT(往返时间)动态计算
- 超时时间 = RTT × 2(带偏差加权)
- 指数退避:重传间隔逐次加倍
流量控制
TCP 通过滑动窗口机制实现流量控制:
发送方窗口
┌─────────────────────────────────────────────┐
│ 已发送并确认 │ 已发送未确认 │ 可发送未发 │ 不允许发送 │
│ (1-500) │ (501-800) │ (801-1000) │ (1001+) │
└─────────────────────────────────────────────┘
↑ ↑
窗口左沿 窗口右沿流量控制流程:
# 接收方通过 TCP 头部 Window 字段通告接收窗口大小
# 发送方根据接收窗口调整发送速率
# 窗口为 0 时的处理
- 发送方停止发送数据
- 发送探测报文探测接收方窗口恢复情况
- 避免死锁拥塞控制
拥塞控制旨在避免网络拥塞,主要算法包括:
慢启动(Slow Start)
拥塞窗口 (cwnd) 增长曲线:
cwnd
│ exponential growth
│ /
│ /
│ /
│ /
│───/───────────────────────────────▶ 传输轮次- 初始 cwnd = 1 MSS(最大报文段)
- 每收到一个 ACK,cwnd 加 1
- 呈指数增长,直到达慢启动阈值(ssthresh)
拥塞避免(Congestion Avoidance)
- cwnd 达到 ssthresh 后进入
- 每收到一个 ACK,cwnd 加 1/cwnd
- 呈线性增长
快重传(Fast Retransmit)
当接收方收到失序报文时,立即发送重复 ACK:
# 快重传触发条件
收到 3 个相同的确认 ACK快恢复(Fast Recovery)
- 收到 3 个重复 ACK 后,ssthresh = cwnd/2,cwnd = ssthresh + 3
- 进入拥塞避免阶段,而非重新慢启动
拥塞控制算法演进:
| 算法 | 特点 |
|---|---|
| Tahoe | 1988 年,提出慢启动、拥塞避免、快重传 |
| Reno | 1990 年,增加快恢复 |
| NewReno | 改进快恢复,处理多个丢包 |
| CUBIC | Linux 默认算法,高速网络友好 |
UDP 协议
UDP(User Datagram Protocol)是一种无连接的传输协议。
UDP 特点
# UDP 头部结构(8 字节)
┌──────────────────────────────────────┐
│ 源端口 (16) │ 目标端口 (16) │
├──────────────────────────────────────┤
│ 长度 (16) │ 校验和 (16) │
├──────────────────────────────────────┤
│ 数据 │
└──────────────────────────────────────┘- 无连接:无需握手,直接发送数据
- 不可靠:不保证交付、不排序、不去重
- 高效:头部仅 8 字节,开销小
UDP vs TCP
| 特性 | UDP | TCP |
|---|---|---|
| 连接方式 | 无连接 | 面向连接 |
| 可靠性 | 不可靠 | 可靠 |
| 顺序性 | 无顺序保证 | 有序交付 |
| 流量控制 | 无 | 有 |
| 拥塞控制 | 无 | 有 |
| 头部大小 | 8 字节 | 20-60 字节 |
| 传输速度 | 快 | 慢 |
| 适用场景 | 实时性要求高 | 可靠性要求高 |
UDP 适用场景
- DNS 查询
# DNS 通常使用 UDP 53 端口
dig @8.8.8.8 example.com- QUIC 协议
- 基于 UDP 的可靠传输协议
- Google 开发,被 HTTP/3 采用
- 0-RTT 握手,减少延迟
- 实时视频/音频
# RTP/RTCP 协议基于 UDP
# 视频通话、直播等场景- 物联网 (IoT)
- 设备资源受限
- 数据量小,允许一定丢包
常用端口
| 端口 | 协议 | 服务 | 说明 |
|---|---|---|---|
| 20 | TCP | FTP Data | FTP 数据传输 |
| 21 | TCP | FTP Control | FTP 控制命令 |
| 22 | TCP | SSH | 安全远程登录 |
| 23 | TCP | Telnet | 明文远程登录(已废弃) |
| 25 | TCP | SMTP | 邮件发送 |
| 53 | UDP/TCP | DNS | 域名解析 |
| 67/68 | UDP | DHCP | 动态主机配置 |
| 80 | TCP | HTTP | Web 服务 |
| 110 | TCP | POP3 | 邮件接收 |
| 143 | TCP | IMAP | 邮件访问 |
| 443 | TCP | HTTPS | 安全 Web |
| 465 | TCP | SMTPS | SMTP 安全 |
| 587 | TCP | SMTP | 邮件提交 |
| 993 | TCP | IMAPS | IMAP 安全 |
| 995 | TCP | POP3S | POP3 安全 |
| 3306 | TCP | MySQL | 数据库 |
| 5432 | TCP | PostgreSQL | 数据库 |
| 6379 | TCP | Redis | 缓存 |
| 8080 | TCP | HTTP Alt | 代理/开发服务器 |
# 查看常用端口占用
netstat -an | grep LISTEN
# 检查特定端口
lsof -i :443
ss -tlnp | grep :80总结
TCP/IP 协议栈是互联网的基础,掌握各层协议的工作原理对于网络故障排查和系统设计至关重要:
- IP 层:负责寻址和路由,关注地址规划和子网划分
- TCP 层:提供可靠传输,关注连接管理、流量控制和拥塞控制
- UDP 层:追求效率,适用于实时性要求高的场景
- 应用层:HTTP、DNS 等协议基于传输层协议构建
理解协议的工作机制有助于编写高效、可靠的网络应用。
