4、IP协议与子网排错:IP地址分类与子网掩码计算、IP地址冲突检测、路由表分析与默认网关问题、MTU与分片问题
这一章,我们聊聊IP层那些最基础、也最容易出问题的地方。说实话,很多网络故障追根溯源,最后都落在IP地址、子网掩码、网关这几个点上。我见过不少运维同事,抓包工具用得飞起,但一问子网掩码怎么算,反而卡壳了。嗯,咱们先把地基打牢。
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
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 怎么快速定位?
我一般三步走:
- 看ARP表:
arp -a看看目标IP对应了几个MAC。一个IP对应多个MAC,基本就是冲突了。 - 抓包确认:在冲突的网段抓ARP包,看有没有
ARP Announcement或ARP Probe异常。正常情况,一台设备上线只会发一次免费ARP。如果频繁出现不同MAC抢同一个IP,那就是冲突。 - 查DHCP日志:如果是DHCP分配的,查服务器日志,看同一个IP是不是分配给了不同的MAC。
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表。
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。
4.5 本章知识体系
下面这张图,把IP层排错的几个核心模块串起来了。你可以把它当作排错时的思维导图。
好了,这一章的内容就到这里。IP层的问题,说到底就是地址、掩码、网关、MTU这四个维度。下次遇到网络不通,别急着抓包,先按这个思路捋一遍,往往能省下不少时间。