
Linux 网络层详解IP 协议、网段划分、CIDR、NAT 与路由转发摘要网络层要解决的核心问题是在复杂网络中为数据包找到一条通往目标主机的路径。本文围绕 IPv4 协议展开从 IP 报头格式、网络号与主机号、CIDR 子网划分、特殊 IP 地址、私有地址与 NAT到路由表匹配和逐跳转发系统梳理网络层最容易混淆的几个概念。前言应用层关心“我要传什么数据”传输层关心“数据交给哪个进程、是否可靠到达”网络层关心的问题更偏底层目标主机不在当前局域网里数据包应该往哪里走这就是网络层的核心任务在复杂网络环境中确定合适路径。在网络层里最重要的协议就是 IP。平时说的 IP 地址、子网掩码、网关、路由表、NAT大多都和这一层有关。先区分三个基本概念概念含义主机配有 IP 地址但不进行路由控制的设备路由器配有 IP 地址并且能进行路由控制的设备节点主机和路由器的统称一、IP 协议解决什么问题如果两台机器在同一个局域网中通信路径相对简单。但真实网络往往由很多子网、交换设备、路由器组成。源主机和目标主机之间可能隔着很多中间节点。IP 协议要做的事情可以理解成源主机路由器 A路由器 B路由器 C目标主机每个路由器只需要根据当前掌握的路由表决定“下一跳”该发给谁。数据包就是这样一跳一跳向目标靠近的。二、IPv4 报头格式IPv4 数据报由 IP 首部和数据部分组成。首部记录版本、长度、分片、TTL、协议号、源地址、目的地址等信息。0 15 16 31 -------------------------------- |版本|首长|服务类型| 总长度 | --------------------------------- | 标识 |标志| 分片偏移 | --------------------------------- | TTL | 协议 | 首部校验和 | ----------------------------------- | 源 IP 地址 | ----------------------------------- | 目的 IP 地址 | ----------------------------------- | 选项如果有 | ----------------------------------- | 数据 | -----------------------------------关键字段说明字段作用4 位版本号IPv4 中该值为44 位首部长度表示 IP 首部有多少个 4 字节最大首部长度为 60 字节8 位服务类型用于表示延时、吞吐量、可靠性、成本等偏好16 位总长度表示整个 IP 数据报占多少字节16 位标识分片后同一个原始数据报的多个分片使用相同标识3 位标志字段包含是否禁止分片、是否还有更多分片等信息13 位分片偏移表示当前分片在原始数据报中的位置8 位 TTL数据报最多还能经过多少跳防止路由循环8 位协议表示上层协议类型如 TCP、UDP 等16 位首部校验和检查 IP 首部是否损坏32 位源地址发送端 IP 地址32 位目的地址接收端 IP 地址TTL 为什么重要TTL 是 Time To Live通常表示数据包最多还能经过多少个路由节点。每经过一个路由器TTL 减 1。如果减到 0 还没有到达目标数据包会被丢弃。它的核心作用是防止路由循环。假设路由配置错误数据包在几个路由器之间绕圈如果没有 TTL这些包可能一直存在于网络中。IP 分片相关字段当 IP 数据报超过链路层 MTU 时可能需要分片。分片时会用到字段含义标识标记这些分片属于同一个原始数据报更多分片位除最后一个分片外其余分片会标记还有更多分片分片偏移标记该分片在原始数据报中的位置分片偏移的单位不是 1 字节而是 8 字节。因此除了最后一个分片其他分片长度通常要是 8 的整数倍。三、网段划分网络号和主机号IP 地址不是单纯的编号它可以拆成两部分IP 地址 网络号 主机号部分作用网络号标识一个网络或子网主机号标识该网络中的某台主机同一个子网内主机通常具有相同网络号但主机号必须不同。不同子网之间网络号需要不同。举个直观例子192.168.1.10 192.168.1.11 192.168.1.12如果它们都在192.168.1.0/24这个网段里那么192.168.1可以理解为网络部分最后一段用于区分主机。手动管理子网中的 IP 地址很麻烦所以实际环境中经常使用 DHCP 自动分配地址。家用路由器通常就具备 DHCP 能力能给接入局域网的设备自动分配 IP。四、CIDR 与子网掩码早期 IP 地址曾经按 A、B、C、D、E 类划分但这种方式很快暴露出浪费问题。比如一个组织申请到 B 类网络理论上能容纳 6 万多个主机但实际根本用不了这么多剩余地址就被浪费了。CIDR 的思路是不再死板依赖 A/B/C 类而是通过子网掩码灵活划分网络号和主机号。子网掩码也是一个 32 位整数。将 IP 地址和子网掩码做按位与得到的结果就是网络号。网络号 IP 地址 子网掩码示例 1/24 网段项目十进制表示十六进制表示IP 地址140.252.20.688C FC 14 44子网掩码255.255.255.0FF FF FF 00网络号140.252.20.08C FC 14 00地址范围140.252.20.0 ~ 140.252.20.255-140.252.20.68/24表示子网掩码高 24 位为 1也就是255.255.255.0示例 2/28 网段项目十进制表示十六进制表示IP 地址140.252.20.688C FC 14 44子网掩码255.255.255.240FF FF FF F0网络号140.252.20.648C FC 14 40地址范围140.252.20.64 ~ 140.252.20.79-很多初学者看到/24、/28会觉得抽象其实它只是子网掩码的简写。斜杠后面的数字表示子网掩码中连续的 1 有多少位。五、特殊 IP 地址有些 IP 地址不能当普通主机地址使用。地址形式含义主机号全 0网络号代表整个局域网主机号全 1广播地址用于给同一链路中的所有主机发送数据127.*本机环回地址常见为127.0.0.1比如在192.168.1.0/24中地址含义192.168.1.0网络号192.168.1.255广播地址192.168.1.1 ~ 192.168.1.254可分配给主机的地址范围六、IPv4 地址为什么不够用IPv4 地址是 32 位理论上大约有 43 亿个地址。但实际可用数量远少于这个值原因包括有些地址有特殊用途地址不是严格按主机数量分配而是按网卡、网段、组织需求分配早期地址分配方式存在浪费互联网设备数量远超早期设计预期。缓解方式主要有三类方式说明动态分配地址设备接入网络时才分配 IP同一设备每次接入可能得到不同地址NAT多台内网主机共享少量公网地址访问外网IPv6使用 128 位地址空间但和 IPv4 不是简单兼容关系CIDR 能提高地址利用率但不能突破 IPv4 32 位地址空间的绝对上限。七、私有 IP、公网 IP 与 NAT如果 IP 只在局域网内部使用不直接暴露到 Internet就可以使用私有 IP 地址。RFC 1918 规定了几段常见私有地址范围私有地址范围规模说明10.0.0.0/8前 8 位为网络号172.16.0.0/12覆盖172.16.*.* ~ 172.31.*.*192.168.0.0/16常见于家用局域网家用路由器通常有两个方向的地址地址含义LAN 口 IP面向内网设备例如192.168.1.1WAN 口 IP面向上一级网络可能仍是私有地址也可能是公网地址不同家庭中的路由器 LAN 口都可能是192.168.1.1这并不冲突因为它们属于不同局域网。子网内 IP 不能重复但不同子网之间可以重复。NAT 做了什么当内网主机访问外网时路由器会把 IP 首部中的源地址替换成自己的外侧地址。经过多级网络后最终数据包中的源地址会变成公网地址。内网主机 192.168.1.10家用路由器运营商路由器公网服务器从内网主机看自己使用的是私有地址从公网服务器看请求来自某个公网地址。这种地址转换技术就是 NAT。这里也能解释一个常见现象自己在家里写了一个服务器程序局域网内能访问外网却访问不到。因为外网并不知道怎么直接找到你的私有地址。要让服务被公网访问通常需要公网地址、端口映射或者直接部署在具备公网地址的服务器上。八、路由一跳一跳转发数据包路由的本质是根据目的 IP 查表决定下一跳。源主机路由器 A路由器 B路由器 C目标主机所谓“一跳”可以理解为数据链路层中的一个传输区间。在以太网中一跳对应从源 MAC 地址到目的 MAC 地址之间的一次帧传输。IP 数据包到达路由器后路由器会查看目的 IP查询路由表判断目标是否在直连网络如果不是直连网络就发给下一跳路由器重复这个过程直到到达目标。可以使用命令查看路由表route在较新的系统中也常用iproute九、路由表字段怎么理解一个路由表通常包含这些字段字段含义Destination目的网络地址Genmask子网掩码Gateway下一跳地址Iface发送接口Flags中的U表示该路由条目有效Flags中的G表示下一跳是某个路由器地址没有G的条目通常表示目的网络和本机接口直连不需要经过额外路由器转发。可以用一个简化路由表来理解DestinationGatewayGenmaskFlagsIface192.168.10.0*255.255.255.0Ueth0192.168.56.0*255.255.255.0Ueth1127.0.0.0*255.0.0.0Ulodefault192.168.10.10.0.0.0UGeth0示例 1目的地址是 192.168.56.3匹配过程和第一行掩码255.255.255.0做按位与得到192.168.56.0不等于第一行192.168.10.0和第二行掩码255.255.255.0做按位与得到192.168.56.0匹配第二行第二行没有G说明目标网络和本机eth1直连数据从eth1发出不需要交给下一跳路由器。示例 2目的地址是 202.10.1.2匹配过程依次和前几条路由做匹配都不命中命中default缺省路由从eth0发出交给下一跳192.168.10.1后续由192.168.10.1根据自己的路由表继续决定下一跳。这就是网络层“逐跳转发”的核心每个节点只关心当前应该把包交给谁不需要一开始就知道完整路径。十、路由表从哪里来路由表可以通过两种方式得到方式说明静态路由由管理员手动配置适合结构简单、变化少的网络动态路由通过路由算法或路由协议自动生成适合复杂网络动态路由背后会涉及距离向量、链路状态、Dijkstra 等算法。刚开始学习网络层时不必急着深入算法细节先把“查表、匹配、下一跳、缺省路由”这条转发逻辑理解清楚更重要。十一、常见问题与易错点1. 把 IP 地址当成主机唯一身份IP 地址用于网络通信定位不等同于设备永久身份。同一设备接入不同网络可能获得不同 IP同一网卡也可能配置多个 IP。2. 分不清网络号和主机号判断是否在同一网段不是看字符串前几段是否“看起来一样”而是看 IP 地址和子网掩码按位与后的网络号是否一致。3. 误以为私有 IP 全网唯一私有 IP 只要求在同一个局域网内不冲突。不同局域网都可以使用192.168.1.1、192.168.1.100这类地址。4. 认为 NAT 只是改源 IPNAT 的核心确实是地址转换但实际实现中还要维护连接映射关系否则返回数据不知道该转给内网哪台主机。5. 忽略默认路由当目的地址不匹配任何具体网段时系统会尝试使用缺省路由。很多“能访问局域网但不能上网”的问题都和默认路由或网关配置有关。总结网络层的核心任务是路径选择。IP 报头记录源地址、目的地址、TTL、分片等信息IP 地址通过网络号和主机号描述网络位置CIDR 用子网掩码灵活划分网段私有地址配合 NAT 缓解 IPv4 地址不足路由器通过路由表逐跳转发数据包。把这些概念串起来看网络层并不是一堆零散名词而是一套完整流程主机生成 IP 数据报路由器查看目的地址根据路由表选择下一跳必要时经过 NAT 转换最终让数据包一步步到达目标网络。