3. 网络层核心
网络层是TCP/IP协议栈中承上启下的关键一层,它负责把数据包从源主机跨越多个网络送到目的主机。这一层的核心协议就是IP(Internet Protocol)。理解IP协议,需要同时掌握三件事:IPv4报文长什么样、IP地址如何组织与划分、路由器如何根据路由表把包转发出去。本章围绕这三条主线展开,并给出可动手复现的子网规划方法。
一、IPv4报文格式
IPv4数据报由首部和数据两部分组成,首部固定长度为20字节,若带选项则最长可达60字节。首部各字段决定了路由器如何处理这个包:
- 版本(4位):值为4,表示IPv4。
- 首部长度(4位):以4字节为单位,最小值为5(即20字节)。
- 区分服务(8位):用于QoS标记,如DSCP。
- 总长度(16位):首部加数据的总字节数,最大65535字节。
- 标识、标志、片偏移:三者配合完成分片与重组。标志位中DF=1表示禁止分片,MF=1表示后面还有分片。
- 生存时间TTL(8位):每经过一台路由器减1,减到0则丢弃并回送ICMP超时,用于防止环路。
- 协议(8位):标识上层协议,1=ICMP,6=TCP,17=UDP。
- 首部校验和(16位):只校验首部,每跳都要重算。
- 源IP地址、目的IP地址(各32位):转发决策的核心依据。
需要特别记住:路由器转发时只关心目的IP地址,源IP地址在转发过程中不变(除非经过NAT)。TTL和首部校验和是每跳都会变化的字段。
二、IP地址分类与子网划分
IPv4地址长32位,通常写成点分十进制。传统分类把地址分为A、B、C、D、E五类:A类首位为0,网络号8位;B类前两位10,网络号16位;C类前三位110,网络号24位;D类用于组播;E类保留。分类编址的问题是地址利用率低,例如一个B类网络可容纳6万多台主机,很多组织根本用不完。
子网划分的思路是:从主机位借若干位作为子网位,把一个大网络切成多个小网络。判断两台主机是否在同一子网,靠的是子网掩码。掩码中为1的位对应网络位,为0的位对应主机位。例如掩码255.255.255.192(即/26),表示前26位是网络位,后6位是主机位,每个子网可用主机数为2^6−2=62台(去掉全0的网络地址和全1的广播地址)。
三、CIDR与VLSM
CIDR(无类别域间路由)取消了A/B/C类的固定边界,用“IP/前缀长度”表示网络,例如192.168.1.0/24。CIDR支持路由聚合,把多条连续路由合并成一条,减小路由表规模。例如172.16.0.0/24到172.16.3.0/24可以聚合为172.16.0.0/22。
VLSM(可变长子网掩码)允许在同一主网内对不同子网使用不同长度的掩码。实际规划中,先满足主机数最多的网段,再逐级细分。例如把10.0.0.0/24分给三个部门:研发需要100台、销售需要50台、财务需要20台。可以这样切:研发用10.0.0.0/25(126台可用),销售用10.0.0.128/26(62台可用),财务用10.0.0.192/27(30台可用),剩余10.0.0.224/27留作扩展。
四、路由表查找过程
路由器收到包后,取出目的IP地址,在路由表中查找匹配项。查找遵循“最长前缀匹配”原则:在所有能匹配目的地址的路由条目中,选择前缀最长(掩码最具体)的那一条。若没有匹配项,则使用默认路由0.0.0.0/0;若连默认路由都没有,则丢弃并回送ICMP不可达。
路由表通常包含目的网络、掩码、下一跳、出接口、度量值等字段。直连路由优先级最高,静态路由次之,动态路由协议(如OSPF、BGP)根据管理距离和度量值决定。下面这张图展示了从收到数据包到决定转发路径的完整判断链:
五、使用ipcalc进行子网规划实战
手工计算子网容易出错,Linux下的ipcalc工具可以快速给出网络地址、广播地址、可用主机范围等信息。下面以一个实际规划任务为例:某公司拿到10.10.0.0/22,需要划分给四个部门,分别需要200、100、50、25台主机。
先看整体信息:
$ ipcalc 10.10.0.0/22
Address: 10.10.0.0 00001010.00001010.000000 00.00000000
Netmask: 255.255.252.0 = 22 11111111.11111111.111111 00.00000000
Wildcard: 0.0.3.255 00000000.00000000.000000 11.11111111
Network: 10.10.0.0/22
HostMin: 10.10.0.1
HostMax: 10.10.3.254
Broadcast: 10.10.3.255
Hosts/Net: 1022
按VLSM从大到小分配:200台主机需要/24(254可用),100台需要/25(126可用),50台需要/26(62可用),25台需要/27(30可用)。依次切分:
$ ipcalc 10.10.0.0/24
Network: 10.10.0.0/24
HostMin: 10.10.0.1
HostMax: 10.10.0.254
Broadcast: 10.10.0.255
Hosts/Net: 254
$ ipcalc 10.10.1.0/25
Network: 10.10.1.0/25
HostMin: 10.10.1.1
HostMax: 10.10.1.126
Broadcast: 10.10.1.127
Hosts/Net: 126
$ ipcalc 10.10.1.128/26
Network: 10.10.1.128/26
HostMin: 10.10.1.129
HostMax: 10.10.1.190
Broadcast: 10.10.1.191
Hosts/Net: 62
$ ipcalc 10.10.1.192/27
Network: 10.10.1.192/27
HostMin: 10.10.1.193
HostMax: 10.10.1.222
Broadcast: 10.10.1.223
Hosts/Net: 30
剩余10.10.1.224/27到10.10.3.255留作扩展。规划完成后,把每个子网的网络地址、掩码、网关(通常取第一个可用地址)填入下表,即可交给配置人员使用:
| 部门 | 需求主机数 | 子网 | 掩码 | 可用范围 | 网关 |
|---|---|---|---|---|---|
| 研发部 | 200 | 10.10.0.0/24 | 255.255.255.0 | 10.10.0.1–10.10.0.254 | 10.10.0.1 |
| 销售部 | 100 | 10.10.1.0/25 | 255.255.255.128 | 10.10.1.1–10.10.1.126 | 10.10.1.1 |
| 财务部 | 50 | 10.10.1.128/26 | 255.255.255.192 | 10.10.1.129–10.10.1.190 | 10.10.1.129 |
| 行政部 | 25 | 10.10.1.192/27 | 255.255.255.224 | 10.10.1.193–10.10.1.222 | 10.10.1.193 |
| 预留 | — | 10.10.1.224/27 | 255.255.255.224 | 10.10.1.225–10.10.1.254 | — |
ipcalc -n -b -h 10.10.1.128/26可以只输出网络地址、广播地址和主机范围,适合脚本批量处理。规划时始终从最大需求开始切分,避免地址碎片化。掌握IPv4报文格式、地址分类与子网划分、CIDR/VLSM以及路由表查找逻辑,是理解网络层转发行为的基础。实际工程中,先明确主机需求,再用ipcalc验证每个子网的边界,最后把结果落到路由器和主机的配置中,才能保证地址规划既够用又不浪费。