3. 网络层核心:IP协议与IP地址
各位同学,今天我们来啃网络层这块硬骨头。说实话,IP协议是整个TCP/IP体系里最核心的部分,没有之一。你想想看,数据要从你的电脑跑到千里之外的服务器上,靠的就是IP协议在中间搭桥铺路。
我刚开始学网络的时候,总觉得IP地址就是给电脑起个名字。后来在项目里排查一个跨网段通信故障,折腾了两天,最后发现是子网掩码配错了。嗯,从那以后我再也不敢小看这些基础概念了。
3.1 IPv4地址分类
IPv4地址是32位的二进制数,通常写成点分十进制,比如192.168.1.1。这32位被分成网络号和主机号两部分。早期设计时,为了适应不同规模的网络,把地址分成了A、B、C、D、E五类。
| 类别 | 首字节范围 | 默认子网掩码 | 可用网络数 | 每网络主机数 |
|---|---|---|---|---|
| A类 | 1 - 126 | 255.0.0.0 | 126 | 16,777,214 |
| B类 | 128 - 191 | 255.255.0.0 | 16,384 | 65,534 |
| C类 | 192 - 223 | 255.255.255.0 | 2,097,152 | 254 |
| D类 | 224 - 239 | 组播地址 | - | - |
| E类 | 240 - 255 | 保留 | - | - |
关键点:127.0.0.1是回环地址,用来测试本机协议栈。我见过有人把服务器IP配成127.0.0.1,结果其他机器死活连不上——这地址只属于你自己。
3.2 子网掩码
子网掩码的作用,说白了就是告诉路由器:IP地址里哪部分是网络号,哪部分是主机号。它也是32位的,网络号部分全为1,主机号部分全为0。
举个例子:IP 192.168.1.100,子网掩码255.255.255.0。把两者做按位与运算,得到网络地址192.168.1.0。这就是这台机器所在的网段。
我的经验:排查网络不通时,第一件事就是检查子网掩码。我曾经遇到一个案例,两台机器IP在同一网段,但子网掩码一个配了24位,一个配了16位,结果就是互相ping不通。折腾半天才发现是掩码不一致。
3.3 CIDR与VLSM
传统的分类地址有个大问题:浪费。一个C类只有254个地址,一个B类却有6万多个。你公司有500台机器,给个C类不够,给个B类又太浪费。怎么办?
CIDR(无类别域间路由)就是来解决这个问题的。它不再死板地按A、B、C分类,而是用"IP/前缀长度"来表示。比如192.168.1.0/24,意思就是前24位是网络号。
VLSM(可变长子网掩码)更进一步,允许在一个大网段里划分子网,每个子网用不同的掩码。这在实际项目中太常用了。
# 举个例子:把192.168.1.0/24划分成4个子网
# 每个子网62个可用地址
子网1: 192.168.1.0/26 (192.168.1.1 - 192.168.1.62)
子网2: 192.168.1.64/26 (192.168.1.65 - 192.168.1.126)
子网3: 192.168.1.128/26 (192.168.1.129 - 192.168.1.190)
子网4: 192.168.1.192/26 (192.168.1.193 - 192.168.1.254)
注意:每个子网的第一个地址是网络地址,最后一个地址是广播地址,都不能分配给主机用。所以/26的子网实际可用地址是62个,不是64个。这个坑我踩过,给客户规划地址时少算了两个,后来紧急调整。
3.4 路由选择原理
路由选择,就是数据包从源到目的地,沿途的路由器怎么决定下一跳。核心思想其实很简单:每个路由器维护一张路由表,数据包来了就查表,找到匹配的条目就转发。
路由表里最重要的三样东西:目标网络、下一跳地址、出接口。匹配规则是"最长前缀匹配"——也就是路由条目里网络号跟数据包目标IP匹配的位数越多,优先级越高。
举个例子:路由表里有两条条目——0.0.0.0/0(默认路由)和192.168.1.0/24。来了一个目标IP是192.168.1.100的数据包,它会匹配第二条,因为前缀长度24比0长。这就是最长前缀匹配的威力。
我建议你记住:默认路由(0.0.0.0/0)是最后一条退路。所有查不到明确路由的数据包,都会走默认路由。配置不当的话,很容易造成路由黑洞。
3.5 ICMP协议与Ping
ICMP(互联网控制报文协议)是IP协议的助手。它不传用户数据,专门用来传控制信息和错误报告。最常见的应用就是Ping命令。
Ping的原理很简单:发送一个ICMP Echo Request报文,目标收到后回复一个ICMP Echo Reply。如果源端收到了回复,就说明网络是通的。
# 用Wireshark抓包能看到的过程
# 请求:Type 8, Code 0 (Echo Request)
# 回复:Type 0, Code 0 (Echo Reply)
# 实际使用
ping 8.8.8.8 -c 4
# 输出示例
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=11.8 ms
避坑指南:我曾经遇到一个问题,Ping外网IP能通,但Ping域名不通。排查了半天,发现是DNS配置错了。所以Ping通了不代表网络完全正常,只能说明IP层是通的。上层应用的问题还得另查。
ICMP还有很多其他类型,比如目标不可达(Type 3)、超时(Type 11)。这些在排查网络故障时非常有用。你想想看,当你Ping不通一个地址时,如果收到的是"目标不可达",那说明路由有问题;如果收不到任何回复,那可能是防火墙把ICMP给过滤了。
安全提醒:很多安全策略会禁止ICMP,尤其是Ping。所以Ping不通不一定代表网络不通,也可能是安全设备把ICMP报文给丢了。我建议你同时用telnet或nc测试目标端口,这样更全面。
好了,这一章的内容就到这里。IP协议是网络层的基石,地址分类、子网掩码、CIDR、路由选择、ICMP,每一个都是你以后排查网络问题的利器。我建议你动手做几个实验:用Wireshark抓个Ping包看看,或者自己划几个子网算算地址。光看不练,永远学不会。
可可精品资料库