3、网络层核心协议:IP协议与IP地址分类、子网掩码与CIDR、ARP协议工作原理、ICMP协议与Ping工具
各位同学,咱们今天聊聊网络层。说实话,网络层是整个协议栈里最“烧脑”的一层,但也是最有意思的一层。我当年刚入行时,被IP地址分类和子网掩码绕得晕头转向,后来在项目里踩过坑,才真正搞明白。今天我把这些经验掰开揉碎讲给你听。
3.1 IP协议与IP地址分类
IP协议,全称Internet Protocol,是网络层的核心。它的任务很简单:把数据包从源主机送到目标主机。但怎么送?靠的就是IP地址。
IP地址是32位的二进制数,通常写成点分十进制,比如192.168.1.1。早期设计时,IP地址被分成了五类:A、B、C、D、E。其中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 |
你可能会问:为什么A类网络数这么少,但每个网络能容纳那么多主机?说白了,这就是设计上的取舍。A类网络给超大型机构用,比如IBM、AT&T这些。但后来发现,这种分类方式太死板了。我在一个物联网项目里就遇到过:公司分到了一个B类地址,但实际只用了200个设备,剩下的6万多个地址全浪费了。这就是典型的地址浪费问题。
重要概念:IP地址分为网络部分和主机部分。子网掩码就是用来区分这两部分的。
3.2 子网掩码与CIDR
为了解决地址浪费问题,后来提出了CIDR(无类别域间路由)。CIDR彻底抛弃了A、B、C类的固定分类,改用“前缀长度”来表示网络部分。比如192.168.1.0/24,意思就是前24位是网络部分,后8位是主机部分。
子网掩码和CIDR是一体两面。子网掩码是点分十进制形式,CIDR是斜杠加数字形式。两者可以互相转换:
子网掩码:255.255.255.0
CIDR前缀:/24
二进制:11111111.11111111.11111111.00000000
我个人习惯用CIDR,因为它更直观。比如/24就是256个地址,/16就是65536个地址,心里一算就清楚。
举个例子:你有一个C类网络192.168.1.0/24,想分成4个子网,每个子网64个地址。怎么做?
- 需要2位来划分子网(2^2=4)
- 子网掩码变成/26(24+2)
- 子网范围:192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26
我的经验:做子网划分时,先画个二进制表格,把网络位和主机位标清楚。我曾经在调试一个工业网关时,因为子网掩码算错了一位,导致两个子网之间死活不通。排查了整整一下午,最后发现是掩码写成了/25而不是/26。从那以后,我每次写掩码都会反复核对。
3.3 ARP协议工作原理
ARP(地址解析协议)解决的是一个问题:已知IP地址,如何找到对应的MAC地址?
你想想看,IP地址是逻辑地址,MAC地址是物理地址。数据包在链路上传输时,最终靠的是MAC地址。所以必须有一个机制把IP映射到MAC。
ARP的工作原理很简单:
- 主机A想和主机B通信,但不知道B的MAC地址
- A广播一个ARP请求:“谁的IP是192.168.1.2?请告诉我你的MAC地址”
- 所有主机都收到这个广播,但只有B回应:“我是192.168.1.2,我的MAC是00:11:22:33:44:55”
- A收到回应后,把IP-MAC映射存入ARP缓存,然后开始通信
这里有个坑:ARP请求是广播,但ARP回应是单播。为什么?因为A已经知道了B的MAC地址,没必要再广播了。
避坑指南:我曾经在一个嵌入式项目里遇到过ARP缓存老化问题。设备长时间不通信,ARP缓存被清除了,下次通信时又要重新发ARP请求。如果网络中有大量设备同时发起通信,ARP广播风暴会把网络打爆。解决方案是适当调大ARP缓存超时时间,或者用静态ARP表。
3.4 ICMP协议与Ping工具
ICMP(互联网控制报文协议)是IP协议的“助手”。它不传输用户数据,而是传输控制信息和错误报告。比如你ping一个地址,用的就是ICMP。
ICMP报文类型很多,常用的有:
- 类型0:回显应答(Ping回应)
- 类型8:回显请求(Ping请求)
- 类型3:目标不可达
- 类型11:超时(TTL超时)
Ping工具的工作原理:
- 发送ICMP回显请求(类型8)
- 目标主机收到后,回复ICMP回显应答(类型0)
- 发送方计算往返时间(RTT)
我经常用Ping来排查网络问题。比如:
- Ping不通?可能是物理链路断了,或者防火墙屏蔽了ICMP
- Ping通但丢包?可能是网络拥塞或链路质量差
- Ping延迟高?可能是路由跳数多或带宽不足
实战技巧:在嵌入式设备里,我习惯用Ping来测试网络连通性。但要注意,有些设备为了省电,会关闭ICMP回应。这时候Ping不通不代表网络不通,需要用其他方式验证,比如TCP连接测试。
嗯,网络层的内容就讲到这里。IP地址分类是基础,CIDR是进化,ARP解决地址映射,ICMP提供诊断能力。这些协议环环相扣,缺一不可。下一章我们讲传输层,到时候你会看到TCP和UDP是怎么在IP之上构建可靠或不可靠传输的。