网络层核心协议:IP协议详解
网络层是整个TCP/IP协议栈的「交通枢纽」。而IP协议,就是枢纽里的交通规则。说白了,它负责把数据包从源主机送到目标主机,中间可能经过好几跳路由器。我刚开始学的时候,总觉得IP协议很简单——不就是个地址嘛?后来踩了坑才发现,里面的门道多着呢。
IPv4地址结构与分类
IPv4地址是32位的二进制数,通常写成点分十进制,比如 192.168.1.1。这32位分成网络号和主机号两部分。网络号标识一个网段,主机号标识网段里的具体设备。
早期设计者把地址分成了五类:
| 类别 | 起始位 | 地址范围 | 默认子网掩码 | 用途 |
|---|---|---|---|---|
| A类 | 0 | 1.0.0.0 – 126.255.255.255 | 255.0.0.0 | 大型网络 |
| B类 | 10 | 128.0.0.0 – 191.255.255.255 | 255.255.0.0 | 中型网络 |
| C类 | 110 | 192.0.0.0 – 223.255.255.255 | 255.255.255.0 | 小型网络 |
| D类 | 1110 | 224.0.0.0 – 239.255.255.255 | 无 | 组播 |
| E类 | 1111 | 240.0.0.0 – 255.255.255.255 | 无 | 保留/实验 |
子网划分与CIDR
分类地址有个大问题:浪费。一个C类只有254个主机,一个B类却有65534个。你想想看,一个中型公司用B类太浪费,用C类又不够。怎么办?
子网划分就是解决方案。它把主机号借几位给网络号,把一个大的网络切成多个小的子网。比如 192.168.1.0/24 可以切成 192.168.1.0/25 和 192.168.1.128/25,每个子网126个可用主机。
后来CIDR(无类别域间路由)彻底打破了分类的束缚。CIDR用「前缀长度」代替了固定的分类,比如 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。前缀长度可以是0到32之间的任意值。
CIDR的核心思想: 不再看地址是A、B还是C类,只看网络前缀长度。这让路由聚合变得非常灵活,也大大减少了路由表的条目数。
我记得有一次帮客户做网络规划,他们申请了一个 10.0.0.0/8 的私有地址段。按分类法这就是一个A类网,但用CIDR我把它切成了几十个 /24 子网,每个部门一个,互不干扰。要是用老方法,光子网掩码就得算半天。
ARP协议工作原理
IP地址是逻辑地址,数据链路层只认MAC地址。ARP(地址解析协议)就是干这个翻译活的——把IP地址转成MAC地址。
工作流程很简单:
- 主机A要发数据给主机B,知道B的IP,不知道B的MAC。
- A在局域网里广播一个ARP请求:「谁的IP是192.168.1.2?告诉我你的MAC。」
- 所有主机都收到这个广播,但只有B回应:「我是192.168.1.2,我的MAC是aa:bb:cc:dd:ee:ff。」
- A收到回应,把IP-MAC映射缓存起来,然后正常通信。
ARP还有一个变种叫RARP(逆地址解析协议),用于无盘工作站启动时获取自己的IP。不过现在基本被DHCP取代了,你了解就行。
ICMP协议与Ping
ICMP(互联网控制报文协议)是IP协议的「助手」。它不传用户数据,专门传控制信息和错误报告。你平时用的 ping 和 traceroute 都是基于ICMP的。
ICMP报文类型很多,常见的有:
| 类型 | 代码 | 含义 | 典型场景 |
|---|---|---|---|
| 0 | 0 | Echo Reply | ping的回应 |
| 3 | 0-15 | Destination Unreachable | 目标不可达(网络、主机、端口等) |
| 8 | 0 | Echo Request | ping的请求 |
| 11 | 0 | Time Exceeded | TTL超时(traceroute用这个) |
Ping的原理:发送ICMP Echo Request,目标回复ICMP Echo Reply。通过计算往返时间(RTT)和丢包率,就能判断网络连通性和延迟。
ICMP还有一个重要功能:Path MTU Discovery。它利用ICMP的「Fragmentation Needed」报文,让发送端自动调整数据包大小,避免在路径中被分片。我在调优大文件传输时经常用到这个机制。
嗯,到这里网络层核心协议的基本骨架就搭起来了。IP协议是基石,ARP和ICMP是左右护法,子网划分和CIDR是让这个体系能在大规模网络中运转的关键。你把这些搞清楚了,后面学路由协议、NAT、IPsec都会轻松很多。