4、IP协议与子网排错:IP地址分类与子网掩码计算、IP地址冲突检测、路由表分析与默认网关问题、MTU与分片问题

这一章,我们聊聊IP层那些最基础、也最容易出问题的地方。说实话,很多网络故障追根溯源,最后都落在IP地址、子网掩码、网关这几个点上。我见过不少运维同事,抓包工具用得飞起,但一问子网掩码怎么算,反而卡壳了。嗯,咱们先把地基打牢。

核心观点: 80%的IP层故障,都可以归结为三类——地址配错了、掩码算错了、网关指错了。剩下的20%,才轮到MTU分片和路由黑洞。

4.1 IP地址分类与子网掩码计算

IP地址分五类,A、B、C、D、E。实际干活儿用的,主要是A、B、C三类。D类组播,E类保留,平时基本碰不到。

类别 首字节范围 默认掩码 网络数 每网络主机数
A类 1 - 126 255.0.0.0 (/8) 126 16,777,214
B类 128 - 191 255.255.0.0 (/16) 16,384 65,534
C类 192 - 223 255.255.255.0 (/24) 2,097,152 254

记住一个口诀:A前B中C后。看第一个字节就能判断类别。127.0.0.0/8是环回地址,不算在A类里,这个别搞混了。

4.1.1 子网掩码到底在算什么?

说白了,子网掩码就是用来划清「网络位」和「主机位」的界限。掩码为1的位是网络位,为0的位是主机位。两台机器要通信,必须网络位相同,否则就得走网关。

我习惯用二进制来算,虽然现在有计算器,但手算一遍能帮你理解本质。举个例子:

IP:     192.168.1.35
掩码:   255.255.255.224  (/27)

二进制:
IP:      11000000.10101000.00000001.00100011
掩码:    11111111.11111111.11111111.11100000
网络位:  11000000.10101000.00000001.00100000  = 192.168.1.32
主机位:  00000000.00000000.00000000.00000101  = 5

所以这个IP属于 192.168.1.32/27 这个子网。
可用主机范围: 192.168.1.33 ~ 192.168.1.62
广播地址: 192.168.1.63
我的小技巧: 算可用主机数,直接用 2^(32-掩码位数) - 2。减2是因为要去掉网络地址和广播地址。比如/27,就是 2^(32-27) - 2 = 2^5 - 2 = 30 个可用IP。

4.1.2 变长子网掩码(VLSM)

实际项目中,很少用固定掩码。比如一个C类网段,销售部要30个IP,研发部要50个,财务部只要10个。这时候就得用VLSM,按需分配。

我记得有一次帮一家公司做网络规划,他们采购了/24的地址段,非要按部门平均分。结果研发部IP不够用,财务部空着一大半。后来改成VLSM,问题才解决。你想想看,地址规划不合理,后面排错能累死人。

4.2 IP地址冲突检测

IP冲突,说白了就是两台设备用了同一个IP。症状很明显:网络时通时断,或者干脆上不了网。Windows右下角会弹「IP地址冲突」的提示,Linux下可能直接报DAD: duplicate address detected。

4.2.1 怎么快速定位?

我一般三步走:

  1. 看ARP表:arp -a 看看目标IP对应了几个MAC。一个IP对应多个MAC,基本就是冲突了。
  2. 抓包确认:在冲突的网段抓ARP包,看有没有ARP Announcement或ARP Probe异常。正常情况,一台设备上线只会发一次免费ARP。如果频繁出现不同MAC抢同一个IP,那就是冲突。
  3. 查DHCP日志:如果是DHCP分配的,查服务器日志,看同一个IP是不是分配给了不同的MAC。
避坑指南: 我曾经遇到过一个案例,某台服务器配置了静态IP,但DHCP池里也包含了这个IP。结果新设备上线时,DHCP把这个IP又分出去了,导致两台设备冲突。排查了整整一下午。后来我养成了习惯:静态IP一定要排除在DHCP池之外。

4.3 路由表分析与默认网关问题

路由表,就是设备用来决定「这个包该往哪儿扔」的规则表。Windows下用route print,Linux下用ip route或route -n。

4.3.1 路由表的核心逻辑

路由匹配遵循最长前缀匹配原则。说白了,就是谁的掩码越长,谁就更精确,就优先用谁。如果所有条目都不匹配,就走默认路由(0.0.0.0/0)。

举个例子:

目标: 192.168.1.100

路由表:
  192.168.1.0/24     via 10.0.0.1
  192.168.0.0/16     via 10.0.0.2
  0.0.0.0/0          via 10.0.0.254

匹配过程:
  先看/24,匹配 → 走10.0.0.1
  不会再看/16和默认路由

4.3.2 默认网关的常见坑

默认网关配错了,最典型的症状就是:能ping通同网段的机器,但出不了网。我见过有人把网关配成了广播地址,或者配成了别的网段的IP,结果所有跨网段通信都失败。

检查默认网关对不对,就两步:

  • 第一步:确认网关IP和本机IP在同一个子网内。掩码不同,网关就不可达。
  • 第二步:ping 网关IP,看通不通。不通的话,检查物理链路和ARP表。
一个真实案例: 有次客户反馈,办公网能上,但打不开网页。我查了一圈,发现DNS没问题,路由表也没问题。最后发现默认网关的MAC地址一直在变——原来是有人在交换机上做了ARP欺骗。嗯,网关问题有时候不一定是配置错,也可能是安全攻击。

4.4 MTU与分片问题

MTU(最大传输单元),以太网默认是1500字节。如果上层协议(比如TCP)发下来的数据包超过1500字节,IP层就会把它拆成多个小片,到目的地再重组。

分片本身不是问题,但分片多了,性能会下降。更麻烦的是,有些防火墙或中间设备会直接丢弃分片包。这就是为什么有时候大包ping不通,小包却能通。

4.4.1 怎么测MTU?

我常用的方法:

# Linux下,用ping测MTU
ping -M do -s 1472 8.8.8.8

# -M do 表示禁止分片
# -s 1472 表示ICMP负载大小
# 1472 + 20(IP头) + 8(ICMP头) = 1500

# 如果ping不通,就减小-s的值,直到能通为止
# 能通的最大值 + 28 = 路径MTU

Windows下类似,用ping -f -l 1472 8.8.8.8。

4.4.2 分片导致的故障

我记得有一次,某台服务器往另一台服务器传大文件,总是超时重传。抓包一看,TCP三次握手没问题,但数据包到了某个中间路由器就被丢了。后来发现是路径上有个设备的MTU设成了1400,而服务器端没开PMTUD(路径MTU发现)。结果大包被分片后,分片包被那个设备丢弃了。

解决办法:要么在服务器上把MTU改成1400,要么在中间设备上把MTU改回1500。

我的建议: 如果遇到「某些网站打不开,但其他网站正常」的情况,先怀疑MTU问题。尤其是用了VPN或隧道的情况下,隧道封装会增加头部开销,导致有效MTU变小。这时候把客户端MTU改成1400或更小,往往能解决问题。

4.5 本章知识体系

下面这张图,把IP层排错的几个核心模块串起来了。你可以把它当作排错时的思维导图。

IP协议与子网排错知识体系 IP协议与子网排错 IP地址分类与掩码 IP地址冲突检测 路由表与默认网关 MTU与分片问题 A/B/C类 & 默认掩码 VLSM & 子网计算 ARP表 & 免费ARP DHCP日志排查 最长前缀匹配 默认网关可达性 路径MTU探测 分片与PMTUD 排错时,按这四个方向逐一排查,效率最高

好了,这一章的内容就到这里。IP层的问题,说到底就是地址、掩码、网关、MTU这四个维度。下次遇到网络不通,别急着抓包,先按这个思路捋一遍,往往能省下不少时间。