4. 网络层核心协议IP:IP协议功能与特点、IPv4地址结构、IPv6简介、IP数据报格式

聊到TCP/IP协议栈,网络层是真正承上启下的核心。而IP协议,就是网络层的灵魂。说白了,IP协议解决的是“如何把数据包从一台机器送到另一台机器”的问题,不管这两台机器隔了几条街还是半个地球。

我刚开始学网络时,总觉得IP地址就是一台电脑的“门牌号”。后来在项目里排查一个跨网段通信故障,折腾了两天才发现是子网掩码配错了。嗯,从那以后我才真正理解——IP地址不是孤立的数字,它背后有一套完整的分层、聚合、路由体系。

4.1 IP协议的功能与特点

IP协议的全称是Internet Protocol,中文叫“网际协议”。它的核心功能就三个:寻址、路由、分片与重组。

  • 寻址:给每个网络接口分配一个唯一的IP地址,就像快递包裹上的收件人地址。
  • 路由:根据目的IP地址,决定数据包下一跳该往哪个方向走。
  • 分片与重组:当数据包太大,超过链路层的MTU(最大传输单元)时,IP层会把它切成小块,到了目的地再拼回去。

IP协议有几个特点,我挑重要的说:

  • 无连接:发送数据前不需要先建立连接。每个包独立发送,各自找路。这跟打电话不一样,更像寄明信片。
  • 不可靠:IP层不保证数据包一定能到达。丢了?重传是上层TCP的事,IP只管尽力送。
  • 尽力而为:IP会尽最大努力把数据送到,但如果网络拥塞、链路断了,它就直接丢包,不会通知你。
我的经验: 有一次客户说“网络时好时坏”,我抓包一看,IP分片全乱了。原因是中间链路的MTU比两端小,但路径上的路由器没发ICMP通知。后来我强制在服务器上设了MTU 1400,问题就解决了。IP分片这玩意儿,能避免就避免。

4.2 IPv4地址结构

IPv4地址是32位的二进制数,通常写成点分十进制,比如 192.168.1.1。32位意味着最多只有约43亿个地址。你想想看,全球几十亿人,每人好几台设备,这点地址哪够用?所以后来才有了IPv6。

4.2.1 分类编址(Classful Addressing)

早期的IPv4地址分成了A、B、C、D、E五类。前三类是给主机用的,D类组播,E类保留。分类的依据是地址的前几位:

类别 前导位 地址范围 默认子网掩码 用途
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 — 保留

分类编址有个大问题:浪费地址。比如一个公司只有300台机器,分一个B类地址(支持6万多个主机)太浪费,分一个C类(最多254台)又不够。所以后来出现了子网掩码和CIDR。

4.2.2 子网掩码(Subnet Mask)

子网掩码的作用是区分IP地址中的“网络号”和“主机号”。它也是一个32位的数,网络号部分全1,主机号部分全0。

举个例子:IP地址 192.168.1.100,子网掩码 255.255.255.0。把IP和掩码做“与”运算,得到网络号 192.168.1.0,主机号就是 0.0.0.100。

关键点: 两个IP要通信,必须判断它们是否在同一个子网里。如果在,直接发二层广播找对方;如果不在,就得通过网关转发。

我曾经帮一个创业公司排查网络问题,他们所有机器都配了 255.255.255.0,但IP段是 10.0.0.0/8。结果跨部门通信全走网关,慢得要命。改完子网掩码,速度一下就上来了。

4.2.3 CIDR(无类别域间路由)

CIDR彻底抛弃了A/B/C类的固定分界,改用“前缀长度”来表示网络号位数。写法就是IP后面加个斜杠跟数字,比如 192.168.1.0/24,意思就是前24位是网络号。

CIDR的好处有两个:

  • 节省地址:可以根据实际需要灵活分配,比如 /25 有126个主机,/26 有62个,非常灵活。
  • 路由聚合:可以把多个连续的小网段聚合成一个大网段,减少路由表的条目数。比如 192.168.0.0/24 到 192.168.3.0/24 可以聚合成 192.168.0.0/22。
注意: CIDR虽然灵活,但子网划分时一定要留够主机位。我见过有人把 /30 分配给一个需要3台机器的部门,结果广播地址和网络号占掉两个,只剩两个可用地址,根本不够用。

4.3 IPv6简介

IPv6是下一代IP协议,主要解决IPv4地址枯竭的问题。IPv6的地址长度是128位,是IPv4的4倍。理论上地址数量是2的128次方,地球上每粒沙子都能分到一堆地址。

IPv6的地址写法也变了,用冒号分隔的16进制数,比如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。连续的全0段可以用双冒号省略,比如 2001:db8::8a2e:370:7334。

IPv6相比IPv4,有几个重要改进:

  • 更大的地址空间:这个不用多说。
  • 简化的头部格式:IPv6的固定头部只有40字节,比IPv4的20-60字节更简洁,路由器处理更快。
  • 内置安全性:IPSec是IPv6的标配,而IPv4里IPSec只是个可选扩展。
  • 无状态地址自动配置(SLAAC):设备插上网线就能自动获取IP,不需要DHCP服务器。

我个人习惯在内部实验环境里优先用IPv6。虽然现在IPv6的普及率还没到100%,但大型云厂商和运营商都已经全面支持了。如果你现在做新项目,建议直接考虑双栈(IPv4+IPv6)部署。

4.4 IP数据报格式

IP数据报就是IP层传输的基本单位。IPv4的头部长度是20到60字节,其中固定部分20字节,后面跟着可选项。下面这张图是我手绘的IPv4头部结构:

IPv4数据报头部结构 IPv4数据报头部结构 版本 (4位) 首部长度 (4位) 服务类型 (8位) 总长度 (16位) 标识 (16位) 标志 (3位) 片偏移 (13位) 生存时间 (8位) 协议 (8位) 首部校验和 (16位) 源IP地址 (32位) 目的IP地址 (32位) 选项(可选,长度可变) (0-40字节) 数据(载荷) 关键字段说明 • 版本:IPv4为4,IPv6为6 • 总长度:整个数据报的字节数 • 生存时间(TTL):每经过一跳减1 • 协议:标识上层协议(6=TCP, 17=UDP) 分片相关 • 标识:同一原始数据报的分片 • 标志:DF=1禁止分片,MF=1还有分片 • 片偏移:分片在原始数据报中的位置

几个关键字段我单独说一下:

  • 版本:4位,IPv4就是4,IPv6就是6。
  • 首部长度:4位,单位是4字节。最小值5(20字节),最大值15(60字节)。
  • 总长度:16位,整个数据报的字节数,包括头部和数据。最大值65535字节。
  • 生存时间(TTL):每经过一个路由器减1,减到0就丢弃。防止数据包在网络里死循环。
  • 协议:告诉接收方这个IP包里面装的是TCP(6)、UDP(17)还是ICMP(1)等。
  • 首部校验和:只校验头部,不校验数据。每经过一个路由器都要重新计算,因为TTL变了。
避坑指南: 我曾经在抓包时发现一个奇怪现象——某些大包能通,小包反而丢。查了半天,原来是中间防火墙把“片偏移”非零的包给丢了。有些安全设备对分片包的处理有bug,遇到这种情况,要么调大防火墙的“分片重组”缓存,要么在源端设小MTU避免分片。

IPv6的头部就简洁多了,固定40字节,没有选项字段(选项被放到扩展头部里)。路由器处理IPv6包时不需要解析扩展头部,所以转发效率更高。

好了,这一章的内容就这些。IP协议是整个网络层的基石,理解它的地址结构和数据报格式,后面学路由协议、NAT、ICMP都会轻松很多。