【Linux之旅】Linux 网络层协议详解:从 IP 报文到路由转发的底层逻辑

请君浏览

    • 前言
    • 一、网络层的定位------传输层之下,链路层之上
      • [1.1 网络层解决什么问题](#1.1 网络层解决什么问题)
      • [1.2 网络层与上下层的关系](#1.2 网络层与上下层的关系)
    • [二、IP 协议头格式------20 字节的路由通行证](#二、IP 协议头格式——20 字节的路由通行证)
      • [2.1 协议头全景](#2.1 协议头全景)
      • [2.2 TTL------防止数据报在网络中"鬼打墙"](#2.2 TTL——防止数据报在网络中"鬼打墙")
      • [2.3 IP 分片------当数据报超过 MTU](#2.3 IP 分片——当数据报超过 MTU)
    • [三、IP 地址与子网划分------网络层如何组织世界](#三、IP 地址与子网划分——网络层如何组织世界)
      • [3.1 网络号与主机号](#3.1 网络号与主机号)
      • [3.2 历史上的 A/B/C/D/E 类地址](#3.2 历史上的 A/B/C/D/E 类地址)
      • [3.3 CIDR------引入子网掩码](#3.3 CIDR——引入子网掩码)
      • [3.4 CIDR 的实际应用------划分子网的动手练习](#3.4 CIDR 的实际应用——划分子网的动手练习)
      • [3.5 特殊的 IP 地址](#3.5 特殊的 IP 地址)
    • [四、IP 地址不够用------三大解决方案](#四、IP 地址不够用——三大解决方案)
      • [4.1 动态分配------DHCP](#4.1 动态分配——DHCP)
      • [4.2 NAT------私有地址的魔法](#4.2 NAT——私有地址的魔法)
      • [4.3 IPv6------终极方案](#4.3 IPv6——终极方案)
      • [4.4 IPv4 到 IPv6 的过渡------双栈、隧道和翻译](#4.4 IPv4 到 IPv6 的过渡——双栈、隧道和翻译)
      • [4.5 NAT 的四种类型------为什么 P2P 有时候连不上](#4.5 NAT 的四种类型——为什么 P2P 有时候连不上)
    • 五、路由------逐跳问路,直到终点
      • [5.1 路由的本质:Hop by Hop](#5.1 路由的本质:Hop by Hop)
      • [5.2 路由表的结构](#5.2 路由表的结构)
      • [5.3 路由表匹配过程------最长前缀匹配](#5.3 路由表匹配过程——最长前缀匹配)
    • 六、路由表生成------谁来告诉路由器该往哪走
      • [6.1 距离向量 vs 链路状态------两种分布式计算的哲学](#6.1 距离向量 vs 链路状态——两种分布式计算的哲学)
      • [6.2 BGP------互联网的路由"脊椎骨"](#6.2 BGP——互联网的路由"脊椎骨")
    • 七、ICMP------路由器的"回复消息"
    • 八、常见问题与避坑指南
      • [8.1 为什么 ping 127.0.0.1 能通但 ping 本机 IP 不通](#8.1 为什么 ping 127.0.0.1 能通但 ping 本机 IP 不通)
      • [8.2 子网掩码配错导致"同网段却 ping 不通"](#8.2 子网掩码配错导致"同网段却 ping 不通")
      • [8.3 TTL 耗尽导致的"网络不可达"](#8.3 TTL 耗尽导致的"网络不可达")
    • 总结
    • 尾声

前言

前几篇我们自顶向下走了 TCP/UDP(传输层)和 HTTP(应用层),理解了数据如何在端到端之间可靠或不可靠地送达。但如果只有传输层和应用层,数据依然无法到达目的地------因为互联网不是一条直连的线缆,而是一张由数千万台路由器织成的巨型网状网络。数据从北京发往纽约,中间经过十几个路由器,每个路由器都要做一个关键决策:"这个数据包下一步应该发给谁?"这个决策属于网络层的职责。

网络层的核心协议是 IP(Internet Protocol) 。它的职责可以概括为两个词------寻址路由 。寻址是给每台主机一个逻辑地址(IP 地址),路由是让数据包在网络中找到从源到目标的最佳路径。本文将从 IP 协议头格式出发,逐步展开子网划分、CIDR、NAT、路由表等核心概念。读完本文,你将理解数据包在网络层的完整旅程,以及路由器如何改变世界。

一、网络层的定位------传输层之下,链路层之上

1.1 网络层解决什么问题

在 TCP/IP 四层模型中,网络层夹在传输层和数据链路层之间。它的职责可以理解为两层翻译:对上传送层说"你不用关心数据走哪条路,给我一个目标 IP 就行",对下对链路层说"你不用知道最终目的地,只需要把帧发给下一跳的 MAC 地址"。

网络层的核心挑战在于:互联网不是一棵树,而是一张网。 如果全世界的主机都直连在同一个交换机上,链路层的 MAC 地址就足够通信了------但现实中主机之间间隔着多个自治网络、多个 ISP、多个国家的骨干网,路径不是唯一的,也不是固定的。网络层存在的全部意义,就是在这样一张动态变化的巨网中,为每个数据包找到一条"当下最优"的路径。

网络层有三个基础概念需要先区分清楚:

概念 定义 举例
主机 配有 IP 地址但不进行路由控制的设备 你的笔记本电脑、云服务器
路由器 配有 IP 地址且能进行路由控制的设备 家里的无线路由器、ISP 的骨干路由器
节点 主机和路由器的统称 数据包路径上的每一个设备

路由器与交换机的本质区别在于工作层次------交换机在链路层根据 MAC 地址转发帧,路由器在网络层根据 IP 地址转发数据报。一台设备可以同时具备两种功能(三层交换机),但逻辑上它们是两个不同的角色。

1.2 网络层与上下层的关系

复制代码
应用层:     HTTP、DNS、自定义协议          ← "我要访问 www.example.com"
传输层:     TCP、UDP                       ← "我把数据拆成段,加上端口号"
网络层:     IP、ICMP、ARP                  ← "我给每个段加上目标IP,决定走哪条路"
链路层:     以太网、Wi-Fi                   ← "我把 IP 数据报封装成帧,发给下一跳的 MAC"
物理层:     双绞线、光纤、无线电            ← "我把帧变成电/光/电磁信号发出去"

为什么传输层不能直接替代网络层? 因为传输层的职责是"端到端"------它只关心发送方和接收方这两个端点之间的数据完整性和顺序,不关心中间经过了什么设备。网络层的职责是"逐跳"------每个路由器独立决定下一跳,路径可能随网络状况动态变化。这种分层让传输层可以用一套逻辑(TCP 的确认应答、UDP 的直发直收)在不同的网络拓扑上运行,完全不需要知道底下是局域网还是跨国专线。


二、IP 协议头格式------20 字节的路由通行证

2.1 协议头全景

IP 协议头的固定部分为 20 字节,加上最多 40 字节的选项字段,总长可达 60 字节。与 TCP 类似,头部长度字段(4 位)以 4 字节为单位计数------最小值 5(5×4 = 20 字节),最大值 15(15×4 = 60 字节)。

复制代码
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┤
│ 版本号(4) │头部长度(4)│   服务类型(8)    │       总长度(16)        │
├───────────┴───────────┴─────────────────┼─────────────────────────┤
│           标识(16)                   │ 标志(3) │  分片偏移(13)   │
├───────────────────────────────────────┼──────────┴─────────────────┤
│       TTL(8)    │     协议(8)        │       头部校验和(16)        │
├─────────────────┴────────────────────┴─────────────────────────────┤
│                        源 IP 地址(32)                              │
├───────────────────────────────────────────────────────────────────┤
│                       目的 IP 地址(32)                             │
├───────────────────────────────────────────────────────────────────┤
│                   选项字段(不定长,最多 40 字节)                     │
└───────────────────────────────────────────────────────────────────┘
字段 位宽 含义 关键理解
版本号 4 位 IP 协议版本 IPv4=4, IPv6=6。这是路由器判断如何处理此数据报的第一个字段
头部长度 4 位 IP 头部长度(以 4 字节为单位) 最小值 5(20 字节),最大值 15(60 字节),差值 40 字节是选项区
服务类型 8 位 QoS 服务质量标记 3 位优先级(已弃用)+4 位 TOS(最小延时/最大吞吐/最高可靠/最小成本)+1 保留位。四者只能选其一
总长度 16 位 IP 头 + 数据的总字节数 最大值 65535(64KB)。超过 MTU 需要IP 分片
标识 16 位 主机发送的每个数据报的唯一 ID 分片后所有片共享同一个 ID,接收端以此判断哪些片属于同一个原始数据报
标志 3 位 分片控制 bit1=禁止分片(DF), bit2=更多分片(MF)。MF=1 表示后面还有分片
分片偏移 13 位 当前分片在原始数据报中的位置 8 字节为单位------除了最后一个分片,其他分片的数据长度必须是 8 的倍数
TTL 8 位 最大生存跳数 每经过一个路由器减 1,减到 0 丢弃。默认 64/128/255。防止数据报在网络中无限循环
协议 8 位 上层协议类型 TCP=6, UDP=17, ICMP=1。路由器靠这个字段决定把数据交给哪个传输层协议
头部校验和 16 位 CRC 校验 IP 头部完整性 只校验头部,不校验数据。每跳都要重新计算(因为 TTL 变了)
源 IP 地址 32 位 发送方 IP 全程不变
目的 IP 地址 32 位 接收方 IP 全程不变,路由器逐跳查询此字段决定转发方向

2.2 TTL------防止数据报在网络中"鬼打墙"

TTL 可能是 IP 协议头中最容易被低估的字段。它只有 8 位,值通常在 64 到 255 之间,每经过一个路由器减 1。TTL 减到 0 时,路由器丢弃该数据报并向源地址发回一个 ICMP "Time Exceeded" 消息。

TTL 存在的唯一目的:防止路由环路导致的数据报无限循环。 在复杂的网络拓扑中,路由表配置错误可能导致路由器 A 把包发给路由器 B,B 又发给 C,C 又发给 A------如果没有 TTL 兜底,这个包会永远占用网络带宽。TTL 给每一个数据报设置了一个"死刑缓期"------即使路由配置错了,兜兜转转几十跳后数据报也会自动消亡,不会永远在网络中流浪。

traceroute 命令正是利用 TTL 的原理工作的------它依次发送 TTL=1, TTL=2, TTL=3...的数据报,每个路由器在 TTL 减到 0 时返回 ICMP 消息,从而揭示出路径上的每一跳。

2.3 IP 分片------当数据报超过 MTU

IP 数据报的总长度上限是 65535 字节,但链路层的 MTU 通常只有 1500 字节。如果 IP 数据报超过 MTU,IP 层必须将其拆分为多个分片(fragment),每个分片携带相同的标识(id)、各自的分片偏移(offset)和"更多分片"标志(MF)。

接收方的 IP 层收集所有同 id 的分片,按 offset 排序重组,恢复出完整的原始数据报后交给上层协议。但如果有任意一个分片丢失,整个原始数据报都被丢弃------IP 层不会重传分片,重传是传输层(TCP)的职责。

分片是 IP 协议中最影响性能的机制之一。一个丢失的分片导致整个数据报的 TCP 段被丢弃,触发 TCP 层的超时重传。因此实践中应尽可能避免 IP 分片------TCP 通过在三次握手时协商 MSS(最大报文段长度)来避免,应用层通过控制发送数据大小来避免。这就是为什么"MTU 友好"的 UDP 载荷建议不超过 1472 字节(1500 - 20 IP头 - 8 UDP头)。


三、IP 地址与子网划分------网络层如何组织世界

3.1 网络号与主机号

IP 地址由两部分组成:网络号 (标识所属网络)和主机号(标识网络内的主机)。

复制代码
IP 地址 = 网络号 + 主机号

同一子网内:
  - 所有主机的网络号相同
  - 每台主机的主机号唯一
  - 不同子网的主机网络号不同

这种两级结构的设计有一个深刻的动机:路由器不需要知道互联网上每一台主机的精确位置,只需要知道每个"网络"在哪。 就像邮局不需要知道每个城市的每条街道------只要知道"北京的邮件先发到北京邮政枢纽,上海的邮件先发到上海"就够了。网络号就是"城市名",路由表只需要为每个城市规划方向,不需要把每家每户的地址都记录下来。

3.2 历史上的 A/B/C/D/E 类地址

早期互联网用分类法划分网络号和主机号:

类别 范围 网络号位数 主机号位数 可容纳主机数 默认掩码
A 类 1.0.0.0 ~ 126.255.255.255 8 位 24 位 1677 万 255.0.0.0
B 类 128.0.0.0 ~ 191.255.255.255 16 位 16 位 65534 255.255.0.0
C 类 192.0.0.0 ~ 223.255.255.255 24 位 8 位 254 255.255.255.0
D 类 224.0.0.0 ~ 239.255.255.255 --- --- 组播地址 ---
E 类 240.0.0.0 ~ 247.255.255.255 --- --- 保留 ---

这个方案很快失败------一个组织申请一个 B 类地址,理论上能容纳 65534 台主机,但实际可能只用了 200 台。大量 IP 地址被浪费在"从未填满"的地址空间里,而外面需要的组织却分不到地址。这是互联网历史上最昂贵的"固定粒度"设计错误------预定义的类别无法匹配真实世界的需求分布。

3.3 CIDR------引入子网掩码

CIDR(Classless Interdomain Routing,无类别域间路由)不再用 A/B/C 类别来区分网络号长度,而是引入子网掩码------一个 32 位整数,网络号部分全部为 1,主机号部分全部为 0。

复制代码
IP 地址: 192.168.1.100
子网掩码: 255.255.255.0

网络号 = IP & 子网掩码 = 192.168.1.0
主机号 = IP & ~子网掩码 = 0.0.0.100

CIDR 记法: 192.168.1.100/24
          /24 表示子网掩码中前 24 位是 1

理解 CIDR 的几个关键点:

概念 说明 示例
网络号 IP & 子网掩码 192.168.1.0
广播地址 主机号全为 1 192.168.1.255
可用主机范围 主机号 1 ~ (全1-1) 192.168.1.1 ~ 192.168.1.254
本网络地址 主机号全为 0 用于标识网络本身,不分配给主机
环回地址 127.0.0.0/8 数据报不同过网卡发送,直接在本地协议栈内部环回

CIDR 的核心思想:把地址划分的粒度从"三类"变成"任意值"。 /24 给你 254 个地址,/28 给你 14 个地址,/16 给你 65534 个地址------网络管理员可以根据实际需要精确选择子网大小,不再被 A/B/C 类的固定粒度束缚。这个思想后来影响了无数资源划分方案------从 Kubernetes 的 Pod CIDR 到 AWS 的 VPC 子网划分,本质都是 CIDR 的延续。

3.4 CIDR 的实际应用------划分子网的动手练习

CIDR 学起来简单(就是按位与),但在实际网络规划中很容易出错。一个典型的场景:公司有一个 192.168.0.0/16 的私有地址空间,需要划分为行政部、研发部、服务器区三个子网。行政部需要 100 个地址,研发部需要 500 个地址,服务器区需要 50 个地址。如何规划?

划分子网的核心原则:网络号位数决定了主机容量。 /N 的子网有 2^(32-N) 个地址,去掉全 0(网络号)和全 1(广播地址),实际可用地址为 2^(32-N) - 2。因此需要多少地址,就用 2 的幂次向上取整来确定子网掩码。500 个地址需要 /23(512-2=510 个),100 个需要 /25(128-2=126 个),50 个需要 /26(64-2=62 个)。但熟练的网络工程师不会用这种"一个部门一个子网"的静态划分------他们用 VLAN + DHCP 将逻辑子网和物理位置分离,某天研发部扩展到两层楼,只需在交换机上修改 VLAN 配置,IP 地址段无需任何改动。这种灵活性正是 CIDR + VLAN 组合带来的。

3.5 特殊的 IP 地址

地址 含义 使用场景
主机号全 0 网络号本身(代表整个网络) 路由表中表示"这个网络"
主机号全 1 广播地址(发给本网络所有主机) UDP 广播通信
127.0.0.0/8 本地环回 127.0.0.1 通常用于本机测试
0.0.0.0 在服务器端表示"本机所有 IP" INADDR_ANY 绑定所有网卡
255.255.255.255 受限广播 只在本网络内广播,不转发

四、IP 地址不够用------三大解决方案

IPv4 只有 2³² ≈ 43 亿个地址。2026 年的互联网连接设备数量远超此数。网络工程师用了三招来解决:

4.1 动态分配------DHCP

不是每台设备永远在线------手机、笔记本电脑通常是"上网上来分配一个 IP,断网了回收"。DHCP 服务器自动为子网内新增设备分配 IP 地址,离开时回收。这使得一个 /24 子网(254 个地址)可以服务于远超过 254 个设备------只要它们不同时在线。

4.2 NAT------私有地址的魔法

这是至今为止让 IPv4 活到 2026 年的最关键技术。 RFC 1918 定义了三个私有地址段:

私有地址段 CIDR 地址数
10.0.0.0 ~ 10.255.255.255 10.0.0.0/8 1677 万
172.16.0.0 ~ 172.31.255.255 172.16.0.0/12 104 万
192.168.0.0 ~ 192.168.255.255 192.168.0.0/16 65536

私有地址的神奇之处在于:全世界无数家庭和企业都可以使用相同的私有地址段,只要它们不直接暴露在公网上。 你的路由器 WAN 口有一个公网 IP(如 123.45.67.89),LAN 口下所有设备都使用 192.168.1.x 私有地址。当内部设备访问公网时,路由器执行NAT(网络地址转换)------将数据报中的私有源 IP 替换为路由器的公网 IP,并记住这个映射关系。外部返回的数据报到达路由器时,路由器根据映射表将公网 IP 替换回私有 IP,转发给正确的内部设备。

NAT 解决的不仅是用一个公网 IP 让整个家庭上网的问题------它还提供了一层天然的安全防护:公网上的设备无法直接向私有 IP 发起连接(因为路由器不知道该数据报应该转发给哪个私有地址,除非预先配置了端口映射)。这也是为什么你的家庭网络内的设备默认不会被公网上的攻击者直接访问到。

4.3 IPv6------终极方案

IPv6 用 128 位(16 字节)表示一个 IP 地址,地址空间为 2¹²⁸------约为 340 万亿亿亿亿个,地球上每一粒沙子都可以分配一个 IP 地址还有剩余。但 IPv6 和 IPv4 是互不兼容的两个协议------IPv4 数据报不能直接在 IPv6 网络上传输,反之亦然。部署 IPv6 意味着全网升级,这也是它推广缓慢的根本原因。

IPv6 的主要改进远不止地址空间的扩大。IPv6 取消了 IP 层的分片功能------分片只由发送端处理,中间路由器不再分片(如果数据包超过路径 MTU,路由器直接丢弃并返回 ICMPv6 "Packet Too Big"消息,让发送方重新以更小的 MTU 发送)。这个设计决策消除了 IPv4 中路由器分片带来的性能开销和分片丢失的重组负担。IPv6 还取消了头部校验和------因为链路层和传输层已经各自有校验,IP 层的校验和是冗余的。去掉后每个路由器不再需要每跳重新计算校验和(因为 TTL 变了),转发性能提升。同时 IPv6 引入了流标签(Flow Label)字段------同一个"流"的数据包(如同一视频通话的数据流)打上相同标签,路由器可以基于流标签做 QoS 和负载均衡,而不需要深入解析传输层头部。

4.4 IPv4 到 IPv6 的过渡------双栈、隧道和翻译

因为 IPv4 和 IPv6 不兼容,过渡不可能一夜之间完成。目前主流的三种过渡策略:

策略 原理 适用阶段 现状
双栈 主机同时配置 IPv4 和 IPv6 地址,优先用 IPv6 通信 过渡期 主流方案------手机 4G/5G 网络已普遍双栈
隧道 将 IPv6 数据报封装在 IPv4 数据报中传输(或反过来) IPv6 孤岛穿越 IPv4 网络 如 6to4、Teredo、6in4 隧道
翻译 在 IPv4 和 IPv6 网络边界做协议翻译(类似 NAT64) IPv6-only 主机访问 IPv4-only 服务 NAT64 + DNS64 组合

目前中国的移动网络已大规模部署 IPv6(手机打开 test-ipv6.com 可以验证),但家庭宽带和许多网站仍然以 IPv4 为主。一个尴尬的局面是:有些内容提供商(如部分 CDN)仅在 IPv4 上提供服务,有些新的物联网设备仅支持 IPv6------两边的"孤岛"都需要隧道或翻译来桥接。IPv6 从 1998 年 RFC 2460 发布至今已近三十年,但 2026 年 IPv4 流量仍占互联网的 60% 以上------这个时间尺度应该让你对所有"新协议替代旧协议"的预测持谨慎态度。协议替代不是技术问题,是网络效应问题。
NAT 延长了 IPv4 的寿命,但也造成了 IP 层的"不透明"------私有地址被隐藏在路由器之后,端到端的通信模型被打破。 这也是为什么很多 P2P 应用需要 STUN/TURN 等协议来"穿透" NAT------因为双方都躲在私有地址后面,谁也无法直接向对方发起连接。

4.5 NAT 的四种类型------为什么 P2P 有时候连不上

NAT 不仅替换 IP 地址,还替换端口号。不同路由器对端口映射的处理方式不同,产生了四种 NAT 类型,这直接决定了 P2P 能否成功"打洞":

NAT 类型 映射规则 P2P 穿透难度 常见设备
完全圆锥型 内部(IP:Port)→外部(IP':Port')后,任何外部主机都可借此端口发数据 最易 少数老式路由器
受限圆锥型 只接受内部主机曾发过数据的外部 IP 中等 常见家用路由器
端口受限圆锥型 在受限圆锥基础上,还要求匹配源端口 较难 大多数现役家用路由
对称型 内部主机发给不同外部目标时,映射到不同的外部端口 最难,经常需要中继 企业防火墙、移动蜂窝网络

对称型 NAT 是 P2P 最棘手的敌人。原因是 STUN 协议的工作方式:内部主机先向 STUN 服务器发一个探测包获取自己的外部映射地址(IP':Port1),然后告诉对端"我的地址是 IP':Port1"。但对端用这个地址发送数据时,路由器发现这个外部端口只能接收来自 STUN 服务器的流量(因为内部只向 STUN 服务器发过),拒绝转发。这就是"P2P 打洞失败"的技术原因------端口映射在对称型 NAT 下是双向锁定的。WebRTC 等现代 P2P 框架的解决方案是 TURN 中继服务器------当打洞失败时,数据通过公共中继转发(牺牲延迟换取连通性)。了解这些不是为了背四种类型,而是当你的 P2P 应用"在某些网络下连不上"时,能准确定位根因。


五、路由------逐跳问路,直到终点

5.1 路由的本质:Hop by Hop

路由器的工作方式非常朴素:收到一个数据报,查看目的 IP 地址,查自己的路由表,找到"下一跳"的 IP 地址和发送接口,发出去。每个路由器只负责选下一跳,不负责规划整条路径。

复制代码
数据报从 A 出发,需要到达 F:

A 的路由表: "目的地F?下一跳是B"
  → B 的路由表: "目的地F?下一跳是C"
    → C 的路由表: "目的地F?下一跳是D"
      → D 的路由表: "目的地F?F在我的直连网络上,直接发"
        → F 收到

每条数据报独立决策。同一台主机发出的两个连续数据报,可能走两条完全不同的路径------因为中间某个路由器的路由表在两次发送之间更新了。这种"无连接、逐跳转发"的模式让 IP 协议具有极高的容错性:一条链路断了,路由器更新路由表,后续数据报自动走另一条路,发送方完全无感知。

5.2 路由表的结构

使用 routeip route 命令查看本机的路由表:

bash 复制代码
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.56.0    0.0.0.0         255.255.255.0   U     100    0        0 eth1
字段 含义 示例解析
Destination 目的网络地址 0.0.0.0 表示默认路由(匹配所有未命中前几项的地址)
Gateway 下一跳的 IP 地址 0.0.0.0 表示直连网络,不需要经路由器转发
Genmask 子网掩码 与目的地址做按位与运算后与 Destination 比较
Flags U=此条目有效, G=需要通过 Gateway 转发(无 G=直连) UG=需转发, U=直连
Iface 发送接口 eth0=第一张网卡, eth1=第二张网卡

5.3 路由表匹配过程------最长前缀匹配

路由器收到数据报后,将目的 IP 与路由表中每条目的子网掩码做按位与 ,与 Destination 比较。如果多条匹配(比如默认路由 0.0.0.0/0 匹配所有地址),选择子网掩码最长 的那条------也就是更具体的路由优先

复制代码
数据报目的地址: 192.168.56.3

匹配过程:
  与第一条 (0.0.0.0)      按位与 → 0.0.0.0        ✓ 匹配 (/0)
  与第二条 (192.168.1.0)  按位与 → 192.168.1.0    ✗ 不匹配 (/24)
  与第三条 (192.168.56.0) 按位与 → 192.168.56.0   ✓ 匹配 (/24)
  
  两条匹配中,/24 比 /0 更长 → 选择第三条,从 eth1 接口直连发出

默认路由(0.0.0.0/0)是路由表中的"最后一道防线"------当目的地址没有命中任何更具体的路由时,数据报被发给默认网关(通常是家庭路由器的上级)。这就是为什么你家里的电脑只需要一条默认路由就能访问整个互联网------所有不在本地网络(192.168.1.0/24)的流量都被默认路由指向了路由器,后续路径由路由器的路由表负责。


六、路由表生成------谁来告诉路由器该往哪走

路由表可以由人工配置(静态路由 ),也可以由算法自动维护(动态路由)。小型网络(如家庭网络)通常只有一条默认路由就够了------家庭路由器只需要知道"不是本地网络的数据全部发给 ISP"。但这种简单策略在面对以下场景时完全失效:主要链路断开、新增子网、ISP 切换、数据中心多路径负载均衡。大型网络(如 ISP 骨干网、企业数据中心)依赖动态路由协议自动适应网络拓扑变化。

常见动态路由算法:

算法 类型 核心思想 代表协议 适用规模
距离向量 分布式 路由器向邻居通告"我知道的网络和距离",邻居据此更新路由表 RIP(Routing Information Protocol) 小型网络(<15 跳)
链路状态 分布式 每个路由器广播自己与邻居的连接状态给区域内所有路由器,全网同步后各自独立计算最短路径 OSPF(Open Shortest Path First)、IS-IS 中型网络(企业/校园网)
路径向量 分布式 在距离向量基础上增加完整路径信息(AS 号列表),防止环路并支持策略路由 BGP(Border Gateway Protocol) 全球互联网骨干

6.1 距离向量 vs 链路状态------两种分布式计算的哲学

距离向量协议的思想是"分布式 Bellman-Ford 算法"------每个路由器只知道邻居告诉它的信息,不知道全局拓扑。优点是实现简单(RIP 的 RFC 只有几十页),缺点是收敛慢------某个链路断了,路由器只能被动等待邻居的更新通告,坏消息传播很慢("无穷计数"问题)。这就是为什么 RIP 限制最大跳数为 15------超过 15 跳就认为不可达,避免坏消息永远传不开。

链路状态协议走了相反的路:每个路由器用"洪泛法"把自己的链路状态广播给区域内所有路由器(不只是邻居),所有路由器都拥有相同的"全局拓扑图"(LSDB,链路状态数据库),各自独立运行 Dijkstra 最短路径算法,以自己为根计算出一棵最短路径树------路由表由此生成。因为每个路由器都有全局视角,链路变化后洪泛传播到全网只需几百毫秒,收敛速度远超距离向量。代价是内存和 CPU------OSPF 要求每个路由器存储整张拓扑图和所有链路状态,在大规模网络中内存占用可达几百 MB。

两种算法的设计差异折射出一个深刻的系统设计原则:局部信息 vs 全局信息。 距离向量只用局部信息(邻居),部署简单但决策质量差。链路状态获取全局信息,决策质量高但代价大。BGP 则走中间路线------收集全局信息(所有 AS 之间的路径),但允许管理员通过本地策略(Local Preference、MED、AS Path 长度)来覆盖算法推荐的最短路径,"运营商不想让流量经过竞争对手的网络"这种非技术因素可以通过 BGP 策略实现。

6.2 BGP------互联网的路由"脊椎骨"

BGP 在 AS(自治系统)之间交换路由信息。每个 AS 有一个唯一的 AS 号(ASN),如中国电信 AS4134、Google AS15169。BGP 的核心数据结构是 AS Path------一条"经过哪些 AS 才能到达目标网络"的列表。路由器收到多条到达同一目标的路径时,选择 AS Path 最短的(经过的 AS 数量最少)。但 AS 管理员可以通过配置 Local Preference 等属性来覆盖这个默认规则------比如"即使经过 AS Path 更短,也优先走便宜的商业对等链路而不是昂贵的跨国专线"。

BGP 的故障可以导致整个国家的互联网中断------2021 年 Facebook 的 BGP 路由撤销故障导致其所有服务(Facebook、Instagram、WhatsApp)从互联网上"消失"了 6 个小时,因为 Facebook 的 DNS 服务器不再通告路由,全世界的路由器都不知道"该往哪走才能到达 Facebook"。这就是为什么 BGP 被称为"互联网的路由脊椎骨"------它断了,整个互联网的神经系统就乱了。


七、ICMP------路由器的"回复消息"

IP 协议只管"发",不管"回复"。当路由器需要告知发送方"你的数据包出问题了"时,用到的就是 ICMP(Internet Control Message Protocol,互联网控制报文协议)

ICMP 不是传输层协议------它是 IP 协议的一部分,直接封装在 IP 数据报中(协议号=1)。常见的 ICMP 消息:

类型 含义 何时触发 日常工具
Echo Reply (0) 回应 ping 请求 目标主机收到 Echo Request 后回复 ping 命令的回复
Destination Unreachable (3) 目标不可达 路由器找不到下一跳,或目标端口无进程监听 ping 返回 "Host unreachable"
Time Exceeded (11) TTL 耗尽 数据报 TTL 减到 0 traceroute 依赖此消息
Redirect (5) 路径重定向 路由器发现存在更优路径 主机更新路由表

traceroute 是理解网络层最直观的工具------它利用 TTL 和 ICMP Time Exceeded 消息,逐跳揭示出数据报从你的电脑到达目标服务器经过的每一台路由器。你可以在终端的输出中看到数据报先走了本地网络(192.168.1.1),然后进入 ISP(如 10.x.x.x 或 172.x.x.x),再经过骨干网(202.x.x.x),跨越国界,最后到达目标。每一行输出都是一台路由器的身份信息。


八、常见问题与避坑指南

8.1 为什么 ping 127.0.0.1 能通但 ping 本机 IP 不通

  • 原因: 127.0.0.1 走的是本地环回接口(lo),数据报不经过网卡,直接在主机内部的协议栈"转了一圈"就回来了------速度快、不依赖网络配置。而 ping 本机 IP(如 192.168.1.10)走的是真实的网卡和网络协议栈,可能被防火墙拦截、网卡未启用、路由配置错误等原因阻断。
  • 解决: 先 ping 127.0.0.1 确认协议栈正常,再 ping 本机 IP 确认网卡和防火墙配置正确,最后 ping 网关确认路由可达------这是标准的网络故障"三层排查法"。

8.2 子网掩码配错导致"同网段却 ping 不通"

  • 现象: 两台主机接在同一个交换机上,A 的 IP 是 192.168.1.10/24,B 的 IP 是 192.168.1.20/25。B 能 ping 通 A,A 却 ping 不通 B。
  • 原因: B 的子网掩码是 /25(255.255.255.128),B 认为"同网段"只包含 192.168.1.0~127。A 的 IP 192.168.1.10 在 B 看来属于同网段,所以 B 直接发 ARP 请求------能通。A 的子网掩码是 /24(255.255.255.0),A 认为"同网段"包含 192.168.1.0~255。B 的 IP 192.168.1.20 在 A 看来属于同网段,A 也直接发 ARP 请求------但 B 的网卡在 /25 视角下不应该直接收到跨网段的 ARP 广播------通信失败。这就是子网掩码不对称导致的单向可达问题。

A 的 /24 视角下"自己人"范围大,B 的 /25 视角下"自己人"范围小------双方对"谁和我在同一个网段"的认知不一致,导致了诡异的单向通信。

8.3 TTL 耗尽导致的"网络不可达"

现象: ping 返回 "Time to live exceeded",或 traceroute 在某跳后显示 * * *

原因: TTL 在每一跳减 1,减到 0 后路由器丢弃数据报。可能是路由环路导致 TTL 被快速消耗,也可能是目标距离太远(TTL 默认 64 跳,某些跨国路径确实超过 64 跳)。

解决: 增大 TTL(ping -t 128),或用 traceroute 定位环路位置。


总结

网络层的核心使命:在复杂的网络拓扑中,为每个数据报找到从源到目标的可行路径。 这个使命被拆分为两个子任务------寻址 (IP 地址、子网划分、CIDR、NAT)和路由(路由表、Hop-by-Hop 转发、动态路由协议)。

概念 解决什么问题 核心机制
IP 地址 唯一标识互联网上每一台主机 32 位整数,点分十进制
子网划分 将海量 IP 地址组织为可管理的网络 网络号 + 主机号
CIDR 打破 A/B/C 类固定粒度,精确分配地址 子网掩码按位与
NAT 用少量公网 IP 支撑海量设备上网(IPv4 续命技术) 私有→公网地址替换 + 端口映射
TTL 防止路由环路,数据报自动消亡 每跳减 1,到 0 丢
路由表 决定数据报的下一跳方向 最长前缀匹配
动态路由 自动适应网络拓扑变化 距离向量/链路状态/路径向量

动手试试

  1. traceroute(或 Windows 下的 tracert)追踪从你的电脑到 8.8.8.8(Google DNS)的完整路径,观察有几跳、哪些经过了中国电信/联通骨干网、哪些出了国:traceroute 8.8.8.8
  2. route -n 查看本机的路由表,找到默认路由(0.0.0.0),理解"所有不在本网段的流量都走这条"的含义。尝试 ping 一个外网地址,同时用 tcpdump 观察本机发出的 ARP 请求是发给谁的(应该是默认网关的 MAC 地址,而不是目标 IP 的 MAC 地址)。
  3. 给家庭路由器配置端口转发规则(在路由器管理界面中找"端口映射"或"虚拟服务器"),将外部对公网 IP 的 8080 端口的访问转发到内网某台设备的 80 端口,用手机流量(外部网络)访问验证。

尾声

本章讲解就到此结束了,若有纰漏或不足之处欢迎大家在评论区留言或者私信,同时也欢迎各位一起探讨学习。感谢您的观看!

更多内容可见主页