【Linux网络】深入理解网络层 IP 协议:从网段划分到 NAT 地址转换


🔥草莓熊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 亿个地址,扣除特殊地址和浪费,实际可用的更少。目前主要有三种解决方案:

  1. 动态分配 IP:只给接入网络的设备分配 IP,同一设备每次接入可能获得不同 IP
  2. NAT 技术:网络地址转换,让多个内网设备共享一个公网 IP(目前主流方案)
  3. 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地址(网络字节序)
    /* 选项字段从这里开始 */
};

源码解读

  1. 位域与大小端:由于 x86 是小端模式,PowerPC 是大端模式,内核通过条件编译处理协议头的位域顺序,保证兼容性。
  2. 网络字节序__be16__be32表示大端类型。网络字节序统一为大端,而主机字节序可能是小端,因此需要用htons()ntohs()等函数进行转换。
  3. 校验和:仅校验 IP 首部,不校验数据部分。如果校验和错误,数据包直接被丢弃。

五. 路由:数据包的 "导航系统"

网络层的核心功能是路由选择,即为数据包找到一条通往目的地的路径。路由过程是 "一跳一跳" 完成的:

  1. 主机或路由器收到数据包后,查看目的 IP 地址
  2. 查询本地路由表,找到匹配的条目
  3. 将数据包转发到下一跳路由器或直接发送到目标主机

路由表示例

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:子网掩码
  • FlagsU表示条目有效,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 系统运维的必备基础。希望本文能帮你建立起清晰的网络层知识体系,为后续的学习打下坚实的基础。

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど