4. 网络层实现:IP协议、IP地址分类、子网掩码、路由选择原理

各位同学,咱们今天聊聊网络层。说实话,这是整个网络通信栈里最核心的一层。没有网络层,数据包就只能在一个局域网里打转,根本出不了门。我当年刚入行时,总觉得IP地址就是随便分配一下,后来被现实狠狠教育了一顿——地址规划不好,后期运维简直是噩梦。

4.1 IP协议:互联网的“通用语言”

IP协议,全称Internet Protocol,说白了就是给每个设备发一个唯一的“门牌号”。这个门牌号就是IP地址。数据包在网络里传输,全靠这个地址找到目标。

目前主流的是IPv4,32位,分4段,每段0-255。比如 192.168.1.1。但IPv4地址早就枯竭了,所以IPv6(128位)正在慢慢普及。我个人习惯,新项目能上IPv6就上,省得以后折腾。

核心要点:IP协议提供的是“无连接、不可靠”的服务。它只管把包发出去,不保证一定能到。可靠性是上层协议(比如TCP)的事。

4.2 IP地址分类:A、B、C、D、E类

早期的IP地址是分类的,就像把房子分成别墅区、公寓区、宿舍区。我刚开始学的时候,觉得这分类挺合理,后来发现太浪费地址了。

类别 首字节范围 默认子网掩码 用途
A类 1 - 126 255.0.0.0 大型网络
B类 128 - 191 255.255.0.0 中型网络
C类 192 - 223 255.255.255.0 小型网络
D类 224 - 239 组播
E类 240 - 255 实验保留

举个例子:A类地址,一个网络就能有1600多万个主机。你想想看,哪个公司需要这么多?所以后来才有了CIDR(无类域间路由),彻底打破了这种僵化的分类。

避坑指南:我曾经在配置网络时,把127.0.0.1当成了普通地址来用,结果怎么都ping不通。后来才想起来,127.0.0.1是回环地址,专门用来测试本机网络栈的。千万别把它分配给任何接口。

4.3 子网掩码:划清“邻里”界限

子网掩码,说白了就是一把“剪刀”,把IP地址剪成网络部分和主机部分。比如 255.255.255.0,前24位是网络号,后8位是主机号。

为什么要用子网掩码?因为要判断两个IP是不是在同一个网段。怎么判断?把IP和子网掩码做“与”运算,结果相同就在同一个网段。

IP:     192.168.1.10  →  11000000.10101000.00000001.00001010
掩码:   255.255.255.0  →  11111111.11111111.11111111.00000000
与运算:                  →  11000000.10101000.00000001.00000000  →  192.168.1.0

嗯,这里要注意:子网掩码不能随便写。写错了,要么网络不通,要么广播风暴。我记得有一次,一个同事把掩码写成了 255.255.0.0,结果整个B段地址都在一个广播域里,网络直接瘫痪。

警告:子网划分时,每个子网的主机数要减去2(网络地址和广播地址不可用)。比如一个C类网段(256个地址),实际可用只有254个。这个坑我踩过,项目上线前才发现地址不够用,临时改规划,那叫一个狼狈。

4.4 路由选择原理:数据包的“导航系统”

路由选择,就是数据包从源到目的地,怎么走的问题。你想想看,互联网上有几亿台设备,数据包不可能乱窜,必须有个“导航”。

路由器的核心工作就两件事:

  • 选路:根据路由表,决定下一跳是谁
  • 转发:把数据包从合适的接口扔出去

路由表长什么样?我给你们看个简化版:

目标网络         下一跳          接口
192.168.1.0/24   直接连接        eth0
10.0.0.0/8       192.168.1.1    eth0
0.0.0.0/0        192.168.1.254  eth0  (默认路由)

路由选择的原则很简单:最长前缀匹配。说白了,就是谁的掩码越长,谁就更精确,就选谁。比如目标IP是 192.168.1.5,既匹配 192.168.1.0/24,又匹配 0.0.0.0/0,那肯定选前者。

个人经验:我在一次跨国网络调优中,发现数据包总是绕远路。后来查路由表,发现是默认路由的优先级设置错了。调整之后,延迟从300ms降到了80ms。路由选择,细节决定成败。

4.5 静态路由 vs 动态路由

路由分两种:静态和动态。

  • 静态路由:管理员手动配置。适合小网络,稳定但维护麻烦。
  • 动态路由:路由器之间自动交换信息。适合大网络,灵活但消耗资源。

常见的动态路由协议有:

  • RIP:基于跳数,最大15跳。老古董了,现在很少用。
  • OSPF:基于链路状态,收敛快。我比较推荐。
  • BGP:互联网的“大管家”,负责不同AS之间的路由。

我曾经在一个项目中,用静态路由配了50多条条目,结果网络拓扑一变化,改配置改到崩溃。后来果断上了OSPF,世界清净了。

建议:小网络(少于10台路由器)用静态路由,简单可靠。大网络(超过20台)必须上动态路由,否则运维成本会让你怀疑人生。

4.6 总结与避坑

网络层这块,说白了就是三件事:地址规划、子网划分、路由配置。我见过太多新手,一上来就配IP,结果地址冲突、子网掩码写错、路由表混乱,最后网络不通。

我的建议是:

  1. 先画拓扑图,再规划地址
  2. 子网掩码算清楚,别偷懒
  3. 路由表写完后,用 traceroute 验证路径
  4. 动态路由协议,选OSPF准没错

好了,这一章就到这里。下一章咱们聊聊传输层,TCP和UDP的那些事儿。到时候我会分享一个我当年调试TCP窗口大小的血泪史,保证精彩。