请君浏览前言一、网络层的定位——传输层之下链路层之上1.1 网络层解决什么问题1.2 网络层与上下层的关系二、IP 协议头格式——20 字节的路由通行证2.1 协议头全景2.2 TTL——防止数据报在网络中鬼打墙2.3 IP 分片——当数据报超过 MTU三、IP 地址与子网划分——网络层如何组织世界3.1 网络号与主机号3.2 历史上的 A/B/C/D/E 类地址3.3 CIDR——引入子网掩码3.4 CIDR 的实际应用——划分子网的动手练习3.5 特殊的 IP 地址四、IP 地址不够用——三大解决方案4.1 动态分配——DHCP4.2 NAT——私有地址的魔法4.3 IPv6——终极方案4.4 IPv4 到 IPv6 的过渡——双栈、隧道和翻译4.5 NAT 的四种类型——为什么 P2P 有时候连不上五、路由——逐跳问路直到终点5.1 路由的本质Hop by Hop5.2 路由表的结构5.3 路由表匹配过程——最长前缀匹配六、路由表生成——谁来告诉路由器该往哪走6.1 距离向量 vs 链路状态——两种分布式计算的哲学6.2 BGP——互联网的路由脊椎骨七、ICMP——路由器的回复消息八、常见问题与避坑指南8.1 为什么 ping 127.0.0.1 能通但 ping 本机 IP 不通8.2 子网掩码配错导致同网段却 ping 不通8.3 TTL 耗尽导致的网络不可达总结动手试试尾声前言前几篇我们自顶向下走了 TCP/UDP传输层和 HTTP应用层理解了数据如何在端到端之间可靠或不可靠地送达。但如果只有传输层和应用层数据依然无法到达目的地——因为互联网不是一条直连的线缆而是一张由数千万台路由器织成的巨型网状网络。数据从北京发往纽约中间经过十几个路由器每个路由器都要做一个关键决策这个数据包下一步应该发给谁这个决策属于网络层的职责。网络层的核心协议是IPInternet 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 字节为单位计数——最小值 55×4 20 字节最大值 1515×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 协议版本IPv44, IPv66。这是路由器判断如何处理此数据报的第一个字段头部长度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)。MF1 表示后面还有分片分片偏移13 位当前分片在原始数据报中的位置以8 字节为单位——除了最后一个分片其他分片的数据长度必须是 8 的倍数TTL8 位最大生存跳数每经过一个路由器减 1减到 0 丢弃。默认 64/128/255。防止数据报在网络中无限循环协议8 位上层协议类型TCP6, UDP17, ICMP1。路由器靠这个字段决定把数据交给哪个传输层协议头部校验和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 把包发给路由器 BB 又发给 CC 又发给 A——如果没有 TTL 兜底这个包会永远占用网络带宽。TTL 给每一个数据报设置了一个死刑缓期——即使路由配置错了兜兜转转几十跳后数据报也会自动消亡不会永远在网络中流浪。traceroute命令正是利用 TTL 的原理工作的——它依次发送 TTL1, TTL2, TTL3…的数据报每个路由器在 TTL 减到 0 时返回 ICMP 消息从而揭示出路径上的每一跳。2.3 IP 分片——当数据报超过 MTUIP 数据报的总长度上限是 65535 字节但链路层的 MTU 通常只有 1500 字节。如果 IP 数据报超过 MTUIP 层必须将其拆分为多个分片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.2558 位24 位1677 万255.0.0.0B 类128.0.0.0 ~ 191.255.255.25516 位16 位65534255.255.0.0C 类192.0.0.0 ~ 223.255.255.25524 位8 位254255.255.255.0D 类224.0.0.0 ~ 239.255.255.255——组播地址—E 类240.0.0.0 ~ 247.255.255.255——保留—这个方案很快失败——一个组织申请一个 B 类地址理论上能容纳 65534 台主机但实际可能只用了 200 台。大量 IP 地址被浪费在从未填满的地址空间里而外面需要的组织却分不到地址。这是互联网历史上最昂贵的固定粒度设计错误——预定义的类别无法匹配真实世界的需求分布。3.3 CIDR——引入子网掩码CIDRClassless 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广播地址主机号全为 1192.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 个地址需要 /23512-2510 个100 个需要 /25128-2126 个50 个需要 /2664-262 个。但熟练的网络工程师不会用这种一个部门一个子网的静态划分——他们用 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在服务器端表示本机所有 IPINADDR_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.25510.0.0.0/81677 万172.16.0.0 ~ 172.31.255.255172.16.0.0/12104 万192.168.0.0 ~ 192.168.255.255192.168.0.0/1665536私有地址的神奇之处在于全世界无数家庭和企业都可以使用相同的私有地址段只要它们不直接暴露在公网上。你的路由器 WAN 口有一个公网 IP如 123.45.67.89LAN 口下所有设备都使用 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 网络边界做协议翻译类似 NAT64IPv6-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 的路由表: 目的地FF在我的直连网络上直接发 → F 收到每条数据报独立决策。同一台主机发出的两个连续数据报可能走两条完全不同的路径——因为中间某个路由器的路由表在两次发送之间更新了。这种无连接、逐跳转发的模式让 IP 协议具有极高的容错性一条链路断了路由器更新路由表后续数据报自动走另一条路发送方完全无感知。5.2 路由表的结构使用route或ip route命令查看本机的路由表$ route-nKernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0192.168.1.10.0.0.0 UG10000eth0192.168.1.00.0.0.0255.255.255.0 U10000eth0192.168.56.00.0.0.0255.255.255.0 U10000eth1字段含义示例解析Destination目的网络地址0.0.0.0 表示默认路由匹配所有未命中前几项的地址Gateway下一跳的 IP 地址0.0.0.0 表示直连网络不需要经路由器转发Genmask子网掩码与目的地址做按位与运算后与 Destination 比较FlagsU此条目有效, 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 骨干网、企业数据中心依赖动态路由协议自动适应网络拓扑变化。常见动态路由算法算法类型核心思想代表协议适用规模距离向量分布式路由器向邻居通告我知道的网络和距离邻居据此更新路由表RIPRouting Information Protocol小型网络15 跳链路状态分布式每个路由器广播自己与邻居的连接状态给区域内所有路由器全网同步后各自独立计算最短路径OSPFOpen Shortest Path First、IS-IS中型网络企业/校园网路径向量分布式在距离向量基础上增加完整路径信息AS 号列表防止环路并支持策略路由BGPBorder 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 协议只管发不管回复。当路由器需要告知发送方你的数据包出问题了时用到的就是ICMPInternet 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 减到 0traceroute依赖此消息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/24B 的 IP 是 192.168.1.20/25。B 能 ping 通 AA 却 ping 不通 B。原因B 的子网掩码是 /25255.255.255.128B 认为同网段只包含 192.168.1.0~127。A 的 IP 192.168.1.10 在 B 看来属于同网段所以 B 直接发 ARP 请求——能通。A 的子网掩码是 /24255.255.255.0A 认为同网段包含 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 跳。解决增大 TTLping -t 128或用traceroute定位环路位置。总结网络层的核心使命在复杂的网络拓扑中为每个数据报找到从源到目标的可行路径。这个使命被拆分为两个子任务——寻址IP 地址、子网划分、CIDR、NAT和路由路由表、Hop-by-Hop 转发、动态路由协议。概念解决什么问题核心机制IP 地址唯一标识互联网上每一台主机32 位整数点分十进制子网划分将海量 IP 地址组织为可管理的网络网络号 主机号CIDR打破 A/B/C 类固定粒度精确分配地址子网掩码按位与NAT用少量公网 IP 支撑海量设备上网IPv4 续命技术私有→公网地址替换 端口映射TTL防止路由环路数据报自动消亡每跳减 1到 0 丢路由表决定数据报的下一跳方向最长前缀匹配动态路由自动适应网络拓扑变化距离向量/链路状态/路径向量动手试试用traceroute或 Windows 下的tracert追踪从你的电脑到8.8.8.8Google DNS的完整路径观察有几跳、哪些经过了中国电信/联通骨干网、哪些出了国traceroute 8.8.8.8用route -n查看本机的路由表找到默认路由0.0.0.0理解所有不在本网段的流量都走这条的含义。尝试ping一个外网地址同时用tcpdump观察本机发出的 ARP 请求是发给谁的应该是默认网关的 MAC 地址而不是目标 IP 的 MAC 地址。给家庭路由器配置端口转发规则在路由器管理界面中找端口映射或虚拟服务器将外部对公网 IP 的 8080 端口的访问转发到内网某台设备的 80 端口用手机流量外部网络访问验证。尾声本章讲解就到此结束了若有纰漏或不足之处欢迎大家在评论区留言或者私信同时也欢迎各位一起探讨学习。感谢您的观看更多内容可见主页
【Linux之旅】Linux 网络层协议详解:从 IP 报文到路由转发的底层逻辑
请君浏览前言一、网络层的定位——传输层之下链路层之上1.1 网络层解决什么问题1.2 网络层与上下层的关系二、IP 协议头格式——20 字节的路由通行证2.1 协议头全景2.2 TTL——防止数据报在网络中鬼打墙2.3 IP 分片——当数据报超过 MTU三、IP 地址与子网划分——网络层如何组织世界3.1 网络号与主机号3.2 历史上的 A/B/C/D/E 类地址3.3 CIDR——引入子网掩码3.4 CIDR 的实际应用——划分子网的动手练习3.5 特殊的 IP 地址四、IP 地址不够用——三大解决方案4.1 动态分配——DHCP4.2 NAT——私有地址的魔法4.3 IPv6——终极方案4.4 IPv4 到 IPv6 的过渡——双栈、隧道和翻译4.5 NAT 的四种类型——为什么 P2P 有时候连不上五、路由——逐跳问路直到终点5.1 路由的本质Hop by Hop5.2 路由表的结构5.3 路由表匹配过程——最长前缀匹配六、路由表生成——谁来告诉路由器该往哪走6.1 距离向量 vs 链路状态——两种分布式计算的哲学6.2 BGP——互联网的路由脊椎骨七、ICMP——路由器的回复消息八、常见问题与避坑指南8.1 为什么 ping 127.0.0.1 能通但 ping 本机 IP 不通8.2 子网掩码配错导致同网段却 ping 不通8.3 TTL 耗尽导致的网络不可达总结动手试试尾声前言前几篇我们自顶向下走了 TCP/UDP传输层和 HTTP应用层理解了数据如何在端到端之间可靠或不可靠地送达。但如果只有传输层和应用层数据依然无法到达目的地——因为互联网不是一条直连的线缆而是一张由数千万台路由器织成的巨型网状网络。数据从北京发往纽约中间经过十几个路由器每个路由器都要做一个关键决策这个数据包下一步应该发给谁这个决策属于网络层的职责。网络层的核心协议是IPInternet 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 字节为单位计数——最小值 55×4 20 字节最大值 1515×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 协议版本IPv44, IPv66。这是路由器判断如何处理此数据报的第一个字段头部长度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)。MF1 表示后面还有分片分片偏移13 位当前分片在原始数据报中的位置以8 字节为单位——除了最后一个分片其他分片的数据长度必须是 8 的倍数TTL8 位最大生存跳数每经过一个路由器减 1减到 0 丢弃。默认 64/128/255。防止数据报在网络中无限循环协议8 位上层协议类型TCP6, UDP17, ICMP1。路由器靠这个字段决定把数据交给哪个传输层协议头部校验和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 把包发给路由器 BB 又发给 CC 又发给 A——如果没有 TTL 兜底这个包会永远占用网络带宽。TTL 给每一个数据报设置了一个死刑缓期——即使路由配置错了兜兜转转几十跳后数据报也会自动消亡不会永远在网络中流浪。traceroute命令正是利用 TTL 的原理工作的——它依次发送 TTL1, TTL2, TTL3…的数据报每个路由器在 TTL 减到 0 时返回 ICMP 消息从而揭示出路径上的每一跳。2.3 IP 分片——当数据报超过 MTUIP 数据报的总长度上限是 65535 字节但链路层的 MTU 通常只有 1500 字节。如果 IP 数据报超过 MTUIP 层必须将其拆分为多个分片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.2558 位24 位1677 万255.0.0.0B 类128.0.0.0 ~ 191.255.255.25516 位16 位65534255.255.0.0C 类192.0.0.0 ~ 223.255.255.25524 位8 位254255.255.255.0D 类224.0.0.0 ~ 239.255.255.255——组播地址—E 类240.0.0.0 ~ 247.255.255.255——保留—这个方案很快失败——一个组织申请一个 B 类地址理论上能容纳 65534 台主机但实际可能只用了 200 台。大量 IP 地址被浪费在从未填满的地址空间里而外面需要的组织却分不到地址。这是互联网历史上最昂贵的固定粒度设计错误——预定义的类别无法匹配真实世界的需求分布。3.3 CIDR——引入子网掩码CIDRClassless 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广播地址主机号全为 1192.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 个地址需要 /23512-2510 个100 个需要 /25128-2126 个50 个需要 /2664-262 个。但熟练的网络工程师不会用这种一个部门一个子网的静态划分——他们用 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在服务器端表示本机所有 IPINADDR_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.25510.0.0.0/81677 万172.16.0.0 ~ 172.31.255.255172.16.0.0/12104 万192.168.0.0 ~ 192.168.255.255192.168.0.0/1665536私有地址的神奇之处在于全世界无数家庭和企业都可以使用相同的私有地址段只要它们不直接暴露在公网上。你的路由器 WAN 口有一个公网 IP如 123.45.67.89LAN 口下所有设备都使用 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 网络边界做协议翻译类似 NAT64IPv6-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 的路由表: 目的地FF在我的直连网络上直接发 → F 收到每条数据报独立决策。同一台主机发出的两个连续数据报可能走两条完全不同的路径——因为中间某个路由器的路由表在两次发送之间更新了。这种无连接、逐跳转发的模式让 IP 协议具有极高的容错性一条链路断了路由器更新路由表后续数据报自动走另一条路发送方完全无感知。5.2 路由表的结构使用route或ip route命令查看本机的路由表$ route-nKernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0192.168.1.10.0.0.0 UG10000eth0192.168.1.00.0.0.0255.255.255.0 U10000eth0192.168.56.00.0.0.0255.255.255.0 U10000eth1字段含义示例解析Destination目的网络地址0.0.0.0 表示默认路由匹配所有未命中前几项的地址Gateway下一跳的 IP 地址0.0.0.0 表示直连网络不需要经路由器转发Genmask子网掩码与目的地址做按位与运算后与 Destination 比较FlagsU此条目有效, 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 骨干网、企业数据中心依赖动态路由协议自动适应网络拓扑变化。常见动态路由算法算法类型核心思想代表协议适用规模距离向量分布式路由器向邻居通告我知道的网络和距离邻居据此更新路由表RIPRouting Information Protocol小型网络15 跳链路状态分布式每个路由器广播自己与邻居的连接状态给区域内所有路由器全网同步后各自独立计算最短路径OSPFOpen Shortest Path First、IS-IS中型网络企业/校园网路径向量分布式在距离向量基础上增加完整路径信息AS 号列表防止环路并支持策略路由BGPBorder 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 协议只管发不管回复。当路由器需要告知发送方你的数据包出问题了时用到的就是ICMPInternet 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 减到 0traceroute依赖此消息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/24B 的 IP 是 192.168.1.20/25。B 能 ping 通 AA 却 ping 不通 B。原因B 的子网掩码是 /25255.255.255.128B 认为同网段只包含 192.168.1.0~127。A 的 IP 192.168.1.10 在 B 看来属于同网段所以 B 直接发 ARP 请求——能通。A 的子网掩码是 /24255.255.255.0A 认为同网段包含 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 跳。解决增大 TTLping -t 128或用traceroute定位环路位置。总结网络层的核心使命在复杂的网络拓扑中为每个数据报找到从源到目标的可行路径。这个使命被拆分为两个子任务——寻址IP 地址、子网划分、CIDR、NAT和路由路由表、Hop-by-Hop 转发、动态路由协议。概念解决什么问题核心机制IP 地址唯一标识互联网上每一台主机32 位整数点分十进制子网划分将海量 IP 地址组织为可管理的网络网络号 主机号CIDR打破 A/B/C 类固定粒度精确分配地址子网掩码按位与NAT用少量公网 IP 支撑海量设备上网IPv4 续命技术私有→公网地址替换 端口映射TTL防止路由环路数据报自动消亡每跳减 1到 0 丢路由表决定数据报的下一跳方向最长前缀匹配动态路由自动适应网络拓扑变化距离向量/链路状态/路径向量动手试试用traceroute或 Windows 下的tracert追踪从你的电脑到8.8.8.8Google DNS的完整路径观察有几跳、哪些经过了中国电信/联通骨干网、哪些出了国traceroute 8.8.8.8用route -n查看本机的路由表找到默认路由0.0.0.0理解所有不在本网段的流量都走这条的含义。尝试ping一个外网地址同时用tcpdump观察本机发出的 ARP 请求是发给谁的应该是默认网关的 MAC 地址而不是目标 IP 的 MAC 地址。给家庭路由器配置端口转发规则在路由器管理界面中找端口映射或虚拟服务器将外部对公网 IP 的 8080 端口的访问转发到内网某台设备的 80 端口用手机流量外部网络访问验证。尾声本章讲解就到此结束了若有纰漏或不足之处欢迎大家在评论区留言或者私信同时也欢迎各位一起探讨学习。感谢您的观看更多内容可见主页