IP协议报头格式

4位版本
- 作用:标识 IP 协议的版本,用于区分 IPv4 和 IPv6。
- 取值 :IPv4 固定为
0100(二进制),即十进制4;IPv6 为0110(十进制 6)。 - 核心逻辑:路由器 / 主机收到报文后,先读取该字段,确认按对应版本的协议规则解析。
4位首部长度
- 作用 :标识 IP 首部的总长度,单位是 4 字节(32 位)。
- 取值范围 :
- 最小值
5(二进制0101):对应5×4=20字节(无选项的标准首部) - 最大值
15(二进制1111):对应15×4=60字节(最大可选长度)
- 最小值
- 核心逻辑 :因为首部长度不固定(有选项时变长),该字段用于定位数据部分的起始位置(首部长度 + 数据 = 完整 IP 报文)
8位服务类型
作用 :用于QoS(服务质量)控制,让报文获得不同的转发优先级、延迟、吞吐量、可靠性。
| 位 | 字段 | 作用 |
|---|---|---|
| 0-2 | 优先级(Precedence) | 定义报文转发优先级(0-7,7 最高,如网络控制报文) |
| 3 | 延迟(D) | 1 = 要求低延迟,0 = 正常 |
| 4 | 吞吐量(T) | 1 = 要求高吞吐量,0 = 正常 |
| 5 | 可靠性(R) | 1 = 要求高可靠性,0 = 正常 |
| 6-7 | 保留 | 未使用 |
现代扩展 :现在更多被 DSCP(差分服务代码点,6 位)+ ECN(显式拥塞通知,2 位) 替代,用于更精细的流量分类和拥塞控制。
16位总长度
- 作用 :标识 ** 整个 IP 报文(首部 + 数据)** 的总长度,单位是 字节。
- 取值范围 :
0~65535(2¹⁶-1),因此 IPv4 单个报文最大长度为 65535 字节。 - 核心逻辑 :
- 数据部分长度 = 总长度 - 首部长度(IHL×4)
- 链路层(如以太网 MTU=1500 字节)会限制最大传输单元,超过则需要分片(后续标识 / 标志 / 片偏移字段用于分片重组)。
16位标识
- 作用 :唯一标识源主机发送的 IP 报文,用于分片后的重组。
- 核心逻辑 :
- 当报文被分片时,所有分片的标识值完全相同,接收方通过该字段将不同分片归属于同一个原始报文。
- 源主机每发送一个 IP 报文,标识值递增 1。
3位标志位
作用:控制报文的分片行为,仅 3 位有效,第 1 位保留(必须为 0)。
| 位 | 名称 | 作用 |
|---|---|---|
| 0 | 保留 | 必须为 0 |
| 1 | DF(Don't Fragment) | 1 = 禁止分片,0 = 允许分片;若 DF=1 且报文超过 MTU,路由器会丢弃报文并返回 ICMP 错误 |
| 2 | MF(More Fragment) | 1 = 后续还有分片,0 = 最后一个分片(或未分片) |
13位片偏移
- 作用 :标识当前分片在原始报文中的位置 ,单位是 8 字节。
- 核心逻辑 :
- 未分片的报文,片偏移 = 0。
- 分片时,除最后一个分片外,所有分片的数据长度必须是 8 的倍数(保证偏移量为整数)。
- 接收方通过「标识 + MF + 片偏移」完成分片重组:按片偏移顺序拼接数据,MF=0 时完成重组。
- 最大偏移 :
(2¹³-1)×8 = 8188×8 = 65504字节,配合总长度 65535 字节,满足最大报文分片需求。
8位生存时间
- 作用:限制 IP 报文在网络中的最大转发次数,防止报文无限循环(如路由环路)。
- 取值规则 :
- 源主机发送时设置初始值(常见为 64、128、255,不同操作系统默认值不同)。
- 每经过一个路由器,TTL 值减 1;当 TTL=0 时,路由器丢弃报文,并向源主机发送 ICMP「超时」错误。
- 补充:TTL 本质是「跳数限制」,而非时间,只是最初设计为每秒减 1,现在统一为每跳减 1。
8位协议
作用 :标识 IP 报文的数据部分承载的上层协议类型,让主机将数据交给对应协议处理。
| 十进制值 | 协议 | 说明 |
|---|---|---|
| 1 | ICMP | 互联网控制报文协议 |
| 6 | TCP | 传输控制协议 |
| 17 | UDP | 用户数据报协议 |
| 89 | OSPF | 开放最短路径优先(路由协议) |
核心逻辑:主机收到 IP 报文后,根据该字段将数据部分交给 TCP/UDP/ICMP 等上层协议处理。
16位首部校验和
- 作用 :校验 IP 首部的完整性,防止首部在传输中出错(仅校验首部,不校验数据)。
- 计算规则 :
- 源主机将首部分为 16 位的块,用二进制反码求和,结果取反后填入该字段。
- 路由器 / 主机收到报文后,重新计算首部校验和,若结果不为 0,说明首部出错,直接丢弃报文。
- 因为 TTL 等字段每跳会变化,路由器转发时必须重新计算并更新校验和。
源目的ip
1. 源 IP 地址(Source IP Address,32 位)
- 作用 :标识发送该 IP 报文的源主机的 IPv4 地址(4 字节,如
192.168.1.1)。 - 核心逻辑:用于接收方回复报文,以及网络中的路由溯源、访问控制等。
2. 目的 IP 地址(Destination IP Address,32 位)
- 作用:标识该 IP 报文的目标主机的 IPv4 地址。
- 核心逻辑:路由器根据该地址进行路由转发,最终将报文交付给目标主机。
首部核心字段速查表
| 字段 | 长度 | 核心作用 | 关键取值 |
|---|---|---|---|
| 版本 | 4 位 | 区分 IPv4/IPv6 | IPv4=4 |
| 首部长度 | 4 位 | 定位数据起始位置 | 5=20 字节(默认) |
| 服务类型 | 8 位 | QoS 优先级控制 | DSCP/ECN 现代替代 |
| 总长度 | 16 位 | 标识报文总大小 | 最大 65535 字节 |
| 标识 | 16 位 | 分片重组标识 | 源主机递增 |
| 标志 | 3 位 | 分片控制 | DF = 禁止分片,MF = 后续分片 |
| 片偏移 | 13 位 | 分片位置标识 | 单位 8 字节 |
| TTL | 8 位 | 防路由环路 | 每跳减 1,0 则丢弃 |
| 协议 | 8 位 | 上层协议标识 | TCP=6,UDP=17,ICMP=1 |
| 首部校验和 | 16 位 | 首部完整性校验 | 仅校验首部 |
| 源 IP / 目的 IP | 32 位 ×2 | 收发方地址标识 | 4 字节 IPv4 地址 |
| 选项 | 0-40 字节 | 扩展功能 | 可选,4 字节对齐 |
IPv4和IPv6首部核心差异
| 特性 | IPv4 首部 | IPv6 首部 |
|---|---|---|
| 长度 | 可变(20-60 字节) | 固定 40 字节 |
| 校验和 | 有(首部校验和) | 无(由链路层 / 上层保障) |
| 分片 | 路由器可分片 | 仅源主机分片,路由器不处理 |
| 选项 | 独立字段 | 扩展首部,更灵活 |
| 地址 | 32 位 IPv4 | 128 位 IPv6 |
IP地址的网段划分

IPv4 地址本质
32 位二进制,分成 4 段 8 位,点分十进制:
plaintext
11000000 . 10101000 . 00000001 . 00000001
192 . 168 . 1 . 1
一个 IP 永远由两部分组成:
- 网络位(Net ID):标识哪个网段
- 主机位(Host ID):标识网段内哪台设备
子网掩码(Subnet Mask) 的作用:规定哪部分是网络位,哪部分是主机位。
子网掩码的规则
- 子网掩码 必须是连续的 1 + 连续的 0
- 1 = 网络位
- 0 = 主机位
例:
255.255.255.0
→ 11111111 11111111 11111111 00000000
前 24 位网络位,后 8 位主机位 简写:/24
主机位能划分多少 IP?
公式:总 IP 数 = 2^ 主机位数 可用主机数 = 2^ 主机位数 - 2
减 2 是因为:
- 网络地址(主机位全 0)→ 网段标识
- 广播地址(主机位全 1)→ 不能给设备用
例:/24(8 位主机)总 IP = 2⁸ = 256 可用 = 254
把大网段,借主机位当网络位,切成多个小网段。
一句话:向主机位借位 = 划分子网
192.168.1.0/24 划分 4 个子网
步骤 1:原网段
192.168.1.0 /24网络位 24,主机位 8
步骤 2:要分 4 个子网,需要借几位?
2ⁿ ≥ 子网数2²=4 → 借 2 位
步骤 3:新掩码
原 24 + 借 2 = /26 子网掩码:255.255.255.192
二进制:11111111 11111111 11111111 11000000
步骤 4:每个子网大小
主机位剩下 6 位 → 每个子网 64 个 IP
步骤 5:4 个子网完整结果
-
192.168.1.0/26网络:0广播:63可用:1~62
-
192.168.1.64/26网络:64广播:127可用:65~126
-
192.168.1.128/26网络:128广播:191可用:129~190
-
192.168.1.192/26网络:192广播:255可用:193~254
| 掩码 | 前缀 | 子网大小 | 可用主机 |
|---|---|---|---|
| 255.255.255.0 | /24 | 256 | 254 |
| 255.255.255.128 | /25 | 128 | 126 |
| 255.255.255.192 | /26 | 64 | 62 |
| 255.255.255.224 | /27 | 32 | 30 |
| 255.255.255.240 | /28 | 16 | 14 |
| 255.255.255.248 | /29 | 8 | 6 |
| 255.255.255.252 | /30 | 4 | 2 |
ip地址的CIDR划分规则
抛弃 A/B/C 类固定划分,允许任意长度的网络位,用 / 前缀(如 /24)表示子网掩码。
CIDR 最核心 3 条铁律
- IPv4 总共 32 位
- 子网掩码 = 连续的 1 + 连续的 0(不能中间穿插)
- 前缀长度 /n = 前 n 位是网络位,剩下 32−n 位是主机位
CIDR 表示法:IP 地址 / 前缀 例:192.168.10.5/24
CIDR 与老式 A/B/C 类的区别
老式分类(Classful,已淘汰)
- A 类:
/8网络 8 位,主机 24 位 - B 类:
/16网络 16 位,主机 16 位 - C 类:
/24网络 24 位,主机 8 位
死板、浪费 IP 极大。
CIDR(现代)
前缀可以是 0~32 任意数字 /8、/12、/17、/22、/27、/30...... 都行自由划分子网,完全灵活。
CIDR 4 个万能公式
设前缀 = /n
- 主机位数 = 32 − n
- 网段总 IP 数 = 2^(32−n)
- 可用主机 IP = 2^(32−n) − 2(减网络地址 + 广播地址)
- 块大小(步长)= 256 − 掩码最后一段(快速算网段)
IP地址的数量限制的解决方法
动态分配IP地址
早期 IP 是静态分配:一台设备永久占用一个 IP,不用也占着。大量设备同时在线时,IP 很快不够。
原理
使用 DHCP 协议:
- 有一台 DHCP 服务器统一管理地址池
- 设备上线时临时申请 IP
- 设备下线、超时、关机后 IP 自动回收
- 给下一台设备重复使用
核心作用
提高 IPv4 地址利用率,让 "一批 IP 供多批设备轮流使用"。
优点
- 减少闲置 IP 浪费
- 自动配置,不用手动设置
- 同一网段可支持远多于 IP 数量的设备(不同时在线)
缺点
- 只是提高利用率 ,不增加总 IP 数量
- 只能缓解,不能根本解决
NAT网络地址转换
1. 出现原因
公网 IPv4 太少,不可能给每台设备一个公网 IP。
2. 原理
- 内部使用 私有 IP(RFC1918)
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- 路由器执行 NAT:网络地址转换
- 内网多台设备 共享同一个公网 IP
- 用端口号区分不同内网主机(NAPT 端口多路复用)
3. 核心作用
1 个公网 IP 可以支撑数百、数千台内网设备。 从根本上大幅减少公网 IP 需求。
4. 优点
- 极大节省公网 IPv4
- 隐藏内网结构,安全
- 几乎所有家庭、企业都在用
5. 缺点
- 破坏端到端透明
- 外部无法主动访问内网设备
- P2P、游戏、视频通话困难
- 多层 NAT 会导致卡顿
6. 关键结论
NAT 是 IPv4 能活到今天的最大功臣。
IPv6
1. 出现原因
动态分配 + NAT 都只是延缓枯竭 ,不能增加地址总量。必须扩大地址空间。
2. 原理
- IPv6 地址长度:128 位
- 总数量:2¹²⁸ ≈ 3.4×10³⁸ 个
- 为地球上每一粒沙子、每一个设备都分配公网 IP 都足够
3. 核心作用
从根本上消除 IP 地址数量限制。
4. 优点
- 地址近乎无限,永远不会不够
- 不需要 NAT,真正端到端通信
- 自动配置 SLAAC,即插即用
- 更快路由、支持移动设备、内置 IPSec
- 支持物联网、海量设备
5. 缺点
- 与 IPv4 不兼容
- 需要改造设备、路由器、服务器、运营商网络
- 过渡周期长
6. 关键结论
IPv6 是唯一能彻底解决 IP 地址不够的技术。
私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连接到internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定,用于组建局域网的私有IP地址
- 10.*:前8位是网络号,共16777216个地址
- 172.16.*到172.31.*:前12位是网络号,共1048576个地址
- 192.168.*,前16位是网络号,共65535个地址
包含在这个范围内的,都成为私有IP,其余的则为公网IP
主机A给主机B发送报文,报文路由的详细全过程!

大前提:
主机A想要和主机B聊天,必须有服务器在中间搭桥,我们使用的软件中默认包含服务器的IP和端口号,主机A连接服务器,主机B连接服务器,服务器把主机A的IP和端口号给主机B,服务器把主机B的IP和端口号给主机A,
注意这里给的IP是,主机A和主机B所处的运营商路由器的子网IP,通过端口号找到具体的家用路由器
同时这里的端口号不同于应用层的端口号
问题一:
图中主机A和主机B通信,以主机A给主机B发送报文为例,这个报文经过哪些路由器,经过了哪些网络,以及报文中的源主机IP和目的主机IP如何变化
先明确拓扑结构与关键设备
1. 核心设备与地址
| 设备 | 内网(LAN)子网 IP | WAN 口 IP | 公网 IP |
|---|---|---|---|
| 主机 A | 192.168.1.201/24(左侧家用路由器 LAN 侧) | - | - |
| 左侧家用路由器 | 192.168.1.1/24 | 10.1.1.2/24 | - |
| 左侧运营商路由器 | 10.1.1.1/24 | 122.77.241.4/24 | - |
| 核心公网路由器 | - | - | 122.77.241.3/24(广域网入口) |
| 右侧运营商路由器 | 10.1.1.1/24 | 122.77.241.5/24 | - |
| 右侧家用路由器 | 192.168.1.1/24 | 10.1.1.2/24 | - |
| 主机 B | 192.168.1.201/24(右侧家用路由器 LAN 侧) | - | - |
2. 网络分层
- 内网 1(主机 A 侧) :
192.168.1.0/24(私有网段,家用路由器 LAN) - 运营商内网 1 :
10.1.1.0/24(运营商私网,家用路由器 WAN→运营商路由器 LAN) - 广域网(公网) :
122.77.241.0/24(运营商公网,核心路由器→运营商路由器 WAN) - 运营商内网 2 :
10.1.1.0/24(右侧运营商私网,对称左侧) - 内网 2(主机 B 侧) :
192.168.1.0/24(右侧家用路由器 LAN,私有网段)
主机 A → 主机 B(全程 IP + 端口变化)
1. 主机 A 发送
源 IP:192.168.1.201 源端口:10001 目的 IP:122.77.241.5(B 的公网 IP) 目的端口:50001
2. 左侧家用路由器 NAT(仅改源)
源 IP:10.1.1.2 源端口:20001目的 IP:**122.77.241.5(不变)**目的端口:50001
3. 左侧运营商路由器 NAT(仅改源)
源 IP:122.77.241.4 源端口:50001目的 IP:**122.77.241.5(不变)**目的端口:50001
4. 公网传输(全程不变)
源:122.77.241.4:50001目的:122.77.241.5:50001
5. 右侧运营商路由器(第一次改目的 IP)
查表:目的端口 50001 → 家庭 10.1.1.2 目的 IP 改为:10.1.1.2
6. 右侧家用路由器(第二次改目的 IP)
查表:端口 → 主机 B 192.168.1.201 目的 IP 改为:192.168.1.201
7. 到达主机 B
问题二:
** 报文到达 B 所在运营商路由器后,
运营商怎么知道发给哪一个家用路由器?
如果有 1000 个家用路由器,怎么区分?**
超级关键知识点:
** 每个家用路由器,在运营商那边都有一个唯一的标识:
【运营商分配给它的私网 IP(10.x.x.x)】**
看你图:
- 左侧家用路由器 WAN 口:
10.1.1.2 - 右侧家用路由器 WAN 口:
10.1.1.2(图里画的,但真实中绝对不可能重复!)
真实世界规则:
运营商给每个家庭路由器分配的 10.x.x.x IP 绝对唯一!
- 家庭 1:
10.1.1.2 - 家庭 2:
10.1.1.3 - 家庭 3:
10.1.1.4 - ......
运营商路由器内部有一张表:
| 家庭私网 IP (WAN) | 对应出口公网 IP + 端口 |
|---|---|
| 10.1.1.2 | 122.77.241.5:50001 |
| 10.1.1.3 | 122.77.241.5:50002 |
| 10.1.1.4 | 122.77.241.5:50003 |
所以:
** 公网报文来到运营商路由器,
它看【目的公网 IP + 端口】,
立刻查表知道:要转发给哪个 10.x.x.x 的家庭路由器!**
第三个关键问题
** 如果报文目的 IP 只是运营商路由器的公网 IP,
它怎么知道发给哪个家用路由器?**
答案:
** 靠端口!!!
不是靠 IP!是靠【端口号】区分家庭!**
这就是 NAPT(端口多路复用),整个互联网赖以生存的技术。
举例(同一个公网 IP 带 1000 个家庭)
公网 IP:122.77.241.5
- 端口 50001 → 家庭 A(10.1.1.2)
- 端口 50002 → 家庭 B(10.1.1.3)
- 端口 50003 → 家庭 C(10.1.1.4)
- ......
报文到达运营商路由器:
目的 IP:122.77.241.5(运营商公网 IP) 目的端口:50001
路由器查表:
50001 → 10.1.1.2(某个家庭路由器)
然后:
把目的 IP 从 122.77.241.5 改成 10.1.1.2 转发给对应的家用路由器
第四个关键问题:
到达家用路由器后,怎么知道发给主机 B?
家用路由器也有 NAT 表:
表格
| 外部端口 | 内部主机 IP + 端口 |
|---|---|
| 10001 | 192.168.1.201:80 |
报文到达:目的端口 10001→ 转发给 192.168.1.201
** 主机 A 从服务器获取的,不是主机 B 的私有 IP,
而是 B 的【公网 IP + 端口号】,两者缺一不可。
服务器必须同时把 IP 和端口都发给 A,A 才能正确发送报文。**
问题五:这里的端口号和应用侧的端口号的区别
NAT 里用的端口号 ≠ 应用层端口号(TCP/UDP 端口)!
虽然名字都叫 "端口",但作用、层级、意义完全不同!
第一层:应用层端口(TCP/UDP 端口)
位置:传输层(TCP/UDP 头部)
作用:区分同一台主机里的不同应用(进程)
- 80 = HTTP
- 443 = HTTPS
- 22 = SSH
- 游戏端口、QQ 端口、浏览器端口...
作用: 一台主机同时开浏览器、游戏、QQ→ 靠端口号区分不同软件
特点:
- 端到端(主机到主机)
- 内网私有 IP 上使用
- 不会直接暴露到公网
第二层:NAT 端口(NAT 映射端口)
位置:NAT 设备(路由器 / 网关)内部使用
作用:区分同一个公网 IP 后面的不同内网主机 / 连接
这是路由器自己临时分配、自己维护的端口 不是应用层的端口!
路由器的逻辑:
- 内网主机 1: 192.168.1.201:1000 → 映射为 公网端口 50001
- 内网主机 2: 192.168.1.202:2000 → 映射为 公网端口 50002
作用:
让公网区分:这个端口对应哪台内网设备
特点:
- 只在NAT 设备内部有效
- 公网只认识这个NAT 端口
- 对应用层完全透明(应用根本不知道)
最核心区别
- 应用层端口(TCP/UDP)
区分:同一台主机的不同应用
- NAT 映射端口(路由器分配)
区分:同一公网 IP 后的不同内网主机 / 连接
