IP 基础:IPv4 报文与地址结构

前面几篇里,链路层和 ARP 反复在解决同一件事:这一跳怎么发。但你一定隐约感觉到一个更大的问题没回答——从你家的电脑到大洋彼岸的某台服务器,中间隔着十几个你完全不认识的网络,链路层只管一跳,那"全程到底怎么走、最终怎么找到那台机器"是谁在管?答案是 IP。

IP 是整个互联网的骨架协议:它定义了一套跨越所有网络的统一寻址方式,让无数个彼此独立、技术各异的局域网,能被路由器拼接成一张全球网。这一篇我们把 IP 的机制讲清楚——一个 IP 数据报头里到底有哪些字段、每个字段在解决什么问题、IP 地址的结构是什么、为什么它"只尽力而为"。先把报文和地址这两套结构看明白,再回答 IP 为什么要这样设计。

理解 IPv4,关键不是背下地址格式,而是理解互联网为什么可以由无数个独立网络拼起来——而这个能力的核心,就藏在 IP 的寻址和转发模型里。

一、IP 解决的根本问题:把异构网络拼成一张大网

先定位 IP 的职责。链路层只能保证"本地一段链路"内的传输,而且每段链路技术可能完全不同(以太网、WiFi、光纤……)。两台不在同一局域网的主机要通信,中间要穿过很多段这样的异构链路和很多个路由器。

IP 的价值就在于:它在这些异构链路之上,架了一层统一的"网络层地址 + 转发规则"。 不管底下是什么链路技术,只要每个接口有一个 IP 地址、每个路由器都懂怎么按 IP 转发,数据就能跨越任意多个网络送达。

IP 是互联网的"普通话":底层链路各说各的方言(以太网、WiFi、5G),但只要都把数据交给 IP,IP 就能用一套统一的地址和转发规则,让它们互联互通。这是"网络的网络"(inter-net)这个词的真正含义。

二、IPv4 地址的结构:它标识的不是机器,是接口

IPv4 地址是 32 位,习惯写成点分十进制,比如 192.168.1.10——四段,每段 8 位(0~255)。但要纠正一个根深蒂固的误解:

IP 地址标识的不是"一台机器",而是"某台机器的某个网络接口在某个网络中的身份"。一台有多块网卡的服务器(或多归属主机)会有多个 IP;一台机器换了网络,IP 也会变。IP 是"接口在网络中的身份证",不是"机器的灵魂"。

更关键的是,32 位地址里隐含着两部分

  • 网络部分(network):标识"这个接口属于哪个网络";
  • 主机部分(host):标识"在那个网络里,它是哪一个接口"。

这个"网络位 + 主机位"的切分,是 IP 能做路由的根基——路由器正是靠网络部分来决定往哪转发的(它不关心也记不下每一台主机,只记网络)。这条边界具体在哪、怎么算,是下一篇子网掩码和 CIDR 的核心,这里先建立"地址是分两段的"这个认知。

三、IPv4 报文头:每个字段在解决什么问题

现在拆 IP 数据报的头部。一个 IPv4 头通常 20 字节(不含选项),字段不少,但你不必背位数,要抓住每个字段为什么存在。挑最关键的几个:

字段 作用(解决什么问题)
版本 Version 标明是 IPv4 还是 IPv6
首部长度 IHL 头有多长,好知道数据从哪开始
总长度 Total Length 整个数据报多大(最大 65535 字节)
标识/标志/片偏移 分片与重组用(见第五节)
生存时间 TTL 每过一个路由器减 1,减到 0 就丢弃,防止包在路由环路里无限打转
协议 Protocol 上层是什么,6=TCP,17=UDP,1=ICMP,接收端靠它决定把负载交给谁
首部校验和 只校验头部有没有出错(不校验数据)
源 IP / 目的 IP 谁发的、发给哪个网络的哪个接口,全程寻址的依据

几个字段值得专门说清机制:

  • TTL:这是 IP 防环的兜底机制。上一篇讲过二层没有 TTL 所以会广播风暴;IP 层允许复杂的多路径拓扑、路由可能临时成环,所以必须有 TTL:每经过一个路由器减 1,归零即丢弃并回一个 ICMP 超时报文。traceroute 正是巧妙利用 TTL——故意发 TTL=1、2、3……的包,让沿途每一跳路由器依次"报名",从而探出完整路径。
  • 协议字段:它就是上一篇说的"多路分解"依据。接收端 IP 层拆掉 IP 头后,看这个字段是 6 还是 17,决定把里面的负载交给 TCP 模块还是 UDP 模块。
  • 首部校验和:注意它只保护头部,不保护数据。数据的完整性留给链路层 CRC 和传输层 TCP 校验和去管——又是一个"每层只管自己那部分"的分层体现。

IP 头里的字段,本质上是 IP 完成"跨网寻址与转发"这一职责所必需的全部控制信息:源/目的 IP 解决"往哪送",TTL 解决"防无限循环",协议字段解决"到了交给谁",分片字段解决"链路装不下怎么办"。

四、IP 为什么是"尽力而为"

IP 有一个常被强调却容易误解的特性:尽力而为(best-effort)。它的含义很具体:

  • IP 不保证数据报一定送达(路上可能被丢);
  • IP 不保证顺序(先发的可能后到);
  • IP 不保证不重复(同一个包可能到达两次);
  • IP 不做重传、不做拥塞控制、不做流量控制。

它只承诺一件事:"只要有路可走,我就尽量帮你往前送一跳。"至于送没送到、顺不顺序,IP 一概不负责。

这听起来很不靠谱,但恰恰是它的高明之处——这是一个深思熟虑的设计取舍:

IP 故意保持简单,把可靠性"推"给了端系统(TCP)。网络中间的路由器只需高速转发、无需维护每条连接的状态,这让网络核心可以做到极简、极快、极易扩展。需要可靠就上 TCP,不需要可靠(要低延迟)就用 UDP——上层按需选择。这就是著名的"端到端原则":复杂性应该放在网络边缘,而不是网络核心。

理解了这点,你就明白第三篇那个问题的完整答案了:IP 不保证送达,但你下载文件不缺字节,因为可靠性是 TCP 在端上补的,IP 层故意不管。

五、分片:链路装不下大包怎么办

不同链路能承载的最大帧大小不同,这个上限叫 MTU(最大传输单元),以太网典型值是 1500 字节。如果一个 IP 数据报比某段链路的 MTU 还大,这段链路就装不下——于是出现**分片(fragmentation)**机制。

机制是这样:路由器(或源主机)把大数据报切成几个小片,每片都是一个独立的 IP 包,靠头里的标识、标志、片偏移三个字段记录"它们本属于同一个原始数据报、各自在原报文里的位置"。最终在目的主机重新按这些字段拼回完整数据报。

但分片在工程上是个"不受欢迎"的机制,原因很现实:

分片的最大问题是"全损式丢失"——只要任何一个分片丢了,整个原始数据报都得重传,因为缺一片就拼不全。 这等于放大了丢包的代价。所以现代系统普遍倾向用**路径 MTU 发现(PMTUD)**提前探出全程最小 MTU,让源主机一开始就发不超过这个大小的包,从根上避免中途分片。

你只要记住一句工程准则:能不分片,就尽量不分片。 这也是为什么很多场景会关注 MTU 配置(比如 VXLAN 隧道会额外占用字节,导致有效 MTU 变小,配不对就会出现"小包通、大包不通"的诡异现象)。

六、和后端 / SRE 实践的联系

IP 是应用之下你最常直接打交道的一层,排障里无处不在:

  • 日志里的客户端 IP:你看到的访问来源、要做的 IP 白名单/黑名单、限流维度,都建立在 IP 之上。注意经过代理/CDN 后,真实客户端 IP 要看 X-Forwarded-For,因为 IP 头里的源 IP 已被代理换成它自己的了。
  • “服务起来了却访问不到”:很多最后都落到 IP 层——监听地址配成了 127.0.0.1 而非 0.0.0.0、路由表缺一条、源地址不对称(进来走一条路、回去走另一条被防火墙拦)、安全组没放行。
  • MTU 引发的诡异故障:上面说的"小包通、大包不通、TLS 握手卡住",经典根因就是 MTU/分片问题,尤其在 VPN、VXLAN、隧道环境。
  • TTL 与 traceroute:排查"路径在哪一跳断了"“是不是路由环路”,traceroute/mtr 靠的就是 TTL 机制。

"服务正常但访问不通"是后端最常见的一类问题,而它的答案极高频地落在 IP 层:地址、路由、源/目的对称性、MTU。把 IP 报文字段和这些排障点对上,IP 就从考试名词变成了你手里的诊断工具。

七、学习这一部分最容易踩的坑

1. 把 IP 地址当成"机器的永久标识"

IP 标识的是"接口在某个网络中的身份",不是机器本身。多网卡多 IP、换网络换 IP,都说明这一点。这是理解多归属、NAT、云网络的前提。

2. 以为 IP 保证可靠送达

IP 是尽力而为:不保证送达、不保证顺序、不保证不重复。可靠性是 TCP 补的。这个分工是"端到端原则"的核心,混了就理解不了为什么还需要 TCP。

3. 以为首部校验和保护整个包

IPv4 首部校验和只保护头部,不保护数据。数据完整性由链路层 CRC 和 TCP 校验和负责。

4. 忽视分片的代价

分片不是免费的——丢一片就要重传整个数据报。能不分就不分,优先用路径 MTU 发现。很多隧道环境的"大包不通"都源于此。

总结

这一篇我们把 IP 的机制拆开了:

  • IP 的根本职责是在异构链路之上架一层统一的寻址和转发规则,把无数独立网络拼成一张全球网;
  • IPv4 地址 32 位,标识的是接口在某网络中的身份,且隐含"网络部分 + 主机部分"的切分,这是路由的根基;
  • IP 头的每个字段都为"跨网寻址转发"服务:源/目的 IP 定全程方向、TTL 防无限循环、协议字段决定交给上层谁、首部校验和只保护头部;
  • IP 是尽力而为的——不保证送达/顺序/不重复,把可靠性推给端上的 TCP,这就是"端到端原则";
  • 分片解决"链路装不下大包",但丢一片要重传整个报文,工程上靠 PMTUD 尽量避免;
  • 排障中 IP 层极高频:监听地址、路由、源地址对称、MTU 都是"服务起来了却不通"的常见根因。

把"地址分两段、头里每个字段各司其职、尽力而为靠 TCP 补、能不分片就不分片"这几条记牢,IP 的骨架就立起来了。但还有个悬念:地址里"网络部分和主机部分"的边界到底怎么定、一主机怎么判断目标是不是同网段?下一篇的子网掩码与 CIDR,就来把这条边界算清楚。

参考资源