
🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

文章目录
- 前言
- [一. 网段划分:IP 地址的 "身份证" 与 "家庭住址"](#一. 网段划分:IP 地址的 "身份证" 与 "家庭住址")
-
- [1.1 IP 地址的本质:网络号 + 主机号](#1.1 IP 地址的本质:网络号 + 主机号)
- [1.2 早期方案:分类划分法(A/B/C/D/E 类)](#1.2 早期方案:分类划分法(A/B/C/D/E 类))
- [1.3 进化版:CIDR 无类别域间路由与子网掩码](#1.3 进化版:CIDR 无类别域间路由与子网掩码)
- [1.4 懒人福音:DHCP 自动 IP 分配](#1.4 懒人福音:DHCP 自动 IP 分配)
- [二. 为什么要划分子网?从 "大海捞针" 到 "精准定位"](#二. 为什么要划分子网?从 "大海捞针" 到 "精准定位")
- [三. IP 协议的核心补充知识](#三. IP 协议的核心补充知识)
-
- [3.1 那些特殊的 IP 地址](#3.1 那些特殊的 IP 地址)
- [3.2 IPv4 地址危机与解决方案](#3.2 IPv4 地址危机与解决方案)
- [3.3 私有 IP 与公网 IP:内网与外网的边界](#3.3 私有 IP 与公网 IP:内网与外网的边界)
- [3.4 NAT 技术:拯救 IPv4 的 "幕后英雄"](#3.4 NAT 技术:拯救 IPv4 的 "幕后英雄")
- [四. IP 协议头格式与源码解读](#四. IP 协议头格式与源码解读)
-
- [4.1 IPv4 协议头完整解析](#4.1 IPv4 协议头完整解析)
- [4.2 Linux 内核中的 iphdr 结构体详解](#4.2 Linux 内核中的 iphdr 结构体详解)
- [五. 路由:数据包的 "导航系统"](#五. 路由:数据包的 "导航系统")
- 结尾
前言
每天我们打开浏览器刷网页、用微信发消息、打在线游戏,数据都在全球网络中飞速穿梭。而这一切的基础,就是网络层的核心协议 ------IP 协议。它就像互联网的 "邮政系统",为每一台设备分配唯一的 "地址",并负责将数据包准确送达目的地。本文将从最基础的网段划分讲起,深入拆解 IP 协议的工作原理、协议头格式、NAT 地址转换等核心知识点,并结合 Linux 内核源码进行实战解读,帮你彻底搞懂网络层的底层逻辑。

一. 网段划分:IP 地址的 "身份证" 与 "家庭住址"
1.1 IP 地址的本质:网络号 + 主机号
IP 地址是一个 32 位的正整数(IPv4),本质上是网络中的 "唯一标识符"。它被划分为两个部分:
- 网络号:标识设备所在的网段,保证不同网段有不同的标识
- 主机号:标识同一网段内的具体设备,同一网段内主机号必须唯一
公式:网络号 + 主机号 = 子网(局域网)
例如192.168.128.10/24中,/24表示前 24 位是网络号(192.168.128),后 8 位是主机号(10)。

1.2 早期方案:分类划分法(A/B/C/D/E 类)
为了满足不同规模网络的需求,早期将 IP 地址分为五类,类似 "分蛋糕":
| 类别 | 起始位 | 网络号长度 | 主机号长度 | 地址范围 | 适用场景 |
|---|---|---|---|---|---|
| A 类 | 0 | 7 位 | 24 位 | <0.0.0.0>~<127.255.255.255> | 大型网络(国家 / 运营商) |
| B 类 | 10 | 14 位 | 16 位 | <128.0.0.0>~<191.255.255.255> | 中型网络(企业 / 高校) |
| C 类 | 110 | 21 位 | 8 位 | <192.0.0.0>~<223.255.255.255> | 小型网络(家庭 / 办公室) |
| D 类 | 1110 | - | - | <224.0.0.0>~<239.255.255.255> | 多播地址 |
| E 类 | 1111 | - | - | <240.0.0.0>~<247.255.255.255> | 保留备用 |
局限性:粒度太粗,导致 IP 地址严重浪费。例如一个 B 类地址理论上支持 65534 台主机,但实际很少有这么大的子网,大量地址被闲置。
1.3 进化版:CIDR 无类别域间路由与子网掩码
为了解决分类划分法的浪费问题,引入了CIDR(无类别域间路由) ,核心是使用子网掩码灵活划分网络号和主机号。
- 子网掩码是 32 位正整数,左侧为连续的 1,右侧为连续的 0
- 将 IP 地址与子网掩码进行按位与运算,结果就是网络号
- 网络号划分与 IP 地址的原始类别无关
示例 1:/24 子网掩码
- IP 地址:<140.252.20.68>
- 子网掩码:<255.255.255.0>(/24)
- 按位与结果:<140.252.20.0>(网络号)
- 地址范围:<140.252.20.0>~<140.252.20.255>
- 可用主机数:254 台(主机号全 0 为网络号,全 1 为广播地址,不可分配)
示例 2:/28 子网掩码
- IP 地址:<140.252.20.68>
- 子网掩码:<255.255.255.240>(/28)
- 按位与结果:<140.252.20.64>(网络号)
- 地址范围:<140.252.20.64>~<140.252.20.79>
- 可用主机数:14 台




1.4 懒人福音:DHCP 自动 IP 分配
手动配置 IP 地址繁琐且容易冲突,DHCP(动态主机配置协议) 实现了 IP 地址的自动分配。
- 协议层级 :严格来说横跨应用层和传输层,通常归类为应用层协议
- 传输协议 :使用UDP 而非 TCP
- 无需三次握手,数据量小,效率高
- 客户端无 IP 时需广播发送请求(<255.255.255.255>),TCP 不支持广播
- 大多数路由器都内置 DHCP 服务器功能,我们连接 WiFi 时输入密码后,路由器就会通过 DHCP 为我们分配 IP 地址。
二. 为什么要划分子网?从 "大海捞针" 到 "精准定位"
我们用一个 "归还钱包" 的故事来理解子网划分的意义:
- 学校分为多个学院,学号 = 院号(网络号)+ 个人编号(主机号)
- 张三捡到李四的钱包,只看到学号
06321 - 张三首先判断院号
06不是自己学院的,直接找本院学生会主席(路由器) - 主席将消息转发到校群(公网),找到机械学院主席(目标网段路由器)
- 机械学院主席在本院群(目标子网)找到李四
核心结论 :划分子网的本质是提高路由查找效率。路由的本质是 "排除法",通过网络号可以一次性排除整个网段的设备,而不是逐个遍历所有主机。如果没有子网划分,全球几十亿设备在同一个网络中,路由查找将变成 "大海捞针",网络根本无法正常运行。



三. IP 协议的核心补充知识
3.1 那些特殊的 IP 地址
- 网络号 :主机号全为 0,代表整个局域网(如
192.168.1.0/24) - 广播地址 :主机号全为 1,向同一网段所有主机发送数据包(如
192.168.1.255/24) - 环回地址 :
127.*.*.*,用于本机测试,最常用的是127.0.0.1。发送到环回地址的数据包不会出现在网络中,直接由内核处理。
3.2 IPv4 地址危机与解决方案
IPv4 只有约 43 亿个地址,扣除特殊地址和浪费,实际可用的更少。目前主要有三种解决方案:
- 动态分配 IP:只给接入网络的设备分配 IP,同一设备每次接入可能获得不同 IP
- NAT 技术:网络地址转换,让多个内网设备共享一个公网 IP(目前主流方案)
- IPv6:使用 128 位地址,地址空间几乎无限,但目前尚未完全普及


3.3 私有 IP 与公网 IP:内网与外网的边界
RFC 1918 规定了三个私有 IP 地址段,仅用于局域网内部通信,不能出现在公网中:
10.*.*.*:前 8 位为网络号,共 1677 万个地址172.16.*.*~172.31.*.*:前 12 位为网络号,共 104 万个地址192.168.*.*:前 16 位为网络号,共 65536 个地址
关键区别:
- 公网 IP:全球唯一,可直接访问互联网
- 私有 IP:仅在局域网内唯一,不同局域网的私有 IP 可以重复



3.4 NAT 技术:拯救 IPv4 的 "幕后英雄"
NAT(网络地址转换)是目前解决 IPv4 地址不足的最核心技术。
- 路由器有两个 IP:LAN 口 IP (内网网关,如
192.168.1.1)和WAN 口 IP(运营商分配的公网 IP) - 内网设备访问外网时,路由器会将数据包的源 IP替换为自己的 WAN 口 IP
- 响应数据包返回时,路由器再将目的 IP替换为对应的内网设备 IP
- 多级 NAT:家用路由器→运营商路由器→公网,逐级替换 IP 地址
NAT 技术让一个公网 IP 可以被成百上千个内网设备共享,极大地延长了 IPv4 的使用寿命。


四. IP 协议头格式与源码解读
4.1 IPv4 协议头完整解析
IPv4 协议头默认长度为 20 字节,最长 60 字节(含选项字段),格式如下:
| 4 位版本 | 4 位首部长度 | 8 位服务类型 (TOS) | 16 位总长度 |
|---|---|---|---|
| 16 位标识 | 3 位标志 | 13 位片偏移 | |
| 8 位生存时间 (TTL) | 8 位协议 | 16 位首部校验和 | |
| 32 位源 IP 地址 | |||
| 32 位目的 IP 地址 | |||
| 选项 (最多 40 字节) | |||
| 数据 |
核心字段说明:
- 版本:IPv4 为 4,IPv6 为 6
- 首部长度:以 4 字节为单位,默认值 5(5×4=20 字节)
- TTL:数据包最大跳数,每经过一个路由器减 1,减到 0 则丢弃,防止路由循环
- 协议:标识上层协议,如 TCP (6)、UDP (17)、ICMP (1)
- 片偏移:IP 分片时,标识当前分片在原报文中的位置
4.2 Linux 内核中的 iphdr 结构体详解
Linux 内核中用struct iphdr表示 IPv4 协议头,定义在<linux/ip.h>中,源码如下:
c
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4, // 首部长度
version:4; // 版本号
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4, // 大端模式下先存版本号
ihl:4; // 再存首部长度
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos; // 服务类型
__be16 tot_len; // 总长度(网络字节序)
__be16 id; // 标识
__be16 frag_off; // 标志+片偏移
__u8 ttl; // 生存时间
__u8 protocol; // 上层协议
__be16 check; // 首部校验和
__be32 saddr; // 源IP地址(网络字节序)
__be32 daddr; // 目的IP地址(网络字节序)
/* 选项字段从这里开始 */
};
源码解读:
- 位域与大小端:由于 x86 是小端模式,PowerPC 是大端模式,内核通过条件编译处理协议头的位域顺序,保证兼容性。
- 网络字节序 :
__be16和__be32表示大端类型。网络字节序统一为大端,而主机字节序可能是小端,因此需要用htons()、ntohs()等函数进行转换。 - 校验和:仅校验 IP 首部,不校验数据部分。如果校验和错误,数据包直接被丢弃。
五. 路由:数据包的 "导航系统"
网络层的核心功能是路由选择,即为数据包找到一条通往目的地的路径。路由过程是 "一跳一跳" 完成的:
- 主机或路由器收到数据包后,查看目的 IP 地址
- 查询本地路由表,找到匹配的条目
- 将数据包转发到下一跳路由器或直接发送到目标主机
路由表示例:
Plain
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
192.168.56.0 * 255.255.255.0 U 0 0 0 eth1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
Destination:目的网络地址Gateway:下一跳地址,*表示直连网络Genmask:子网掩码Flags:U表示条目有效,G表示下一跳是路由器Iface:发送接口
转发示例:
- 目的 IP 为
192.168.56.3:与第二条路由匹配,从eth1接口直接发送到目标主机 - 目的 IP 为
202.10.1.2:无匹配条目,走默认路由(0.0.0.0),从eth0发送到网关192.168.10.1
结尾
html
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:IP 协议是整个互联网的基石,它定义了网络地址的格式、数据包的封装方式和路由选择的基本规则。从网段划分到 CIDR,从 DHCP 到 NAT,这些技术都是为了解决 IPv4 的地址不足和路由效率问题。虽然 IPv6 是未来的发展方向,但 IPv4 在很长一段时间内仍将是主流。掌握 IP 协议的底层原理,不仅能帮你排查网络故障,更是深入学习 TCP/UDP、网络编程、Linux 系统运维的必备基础。希望本文能帮你建立起清晰的网络层知识体系,为后续的学习打下坚实的基础。
✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど
