拆解 Linux 中的 IP 协议与数据链路层
在 Linux 内核的网络子系统中,IP 协议承担着承上启下的关键职责:向上接收传输层(TCP/UDP)的数据包,为其添加地址与路由信息;向下将数据包交付给链路层(以太网等),完成物理传输的适配。当一个数据包从应用层发出,它会先经过 TCP 封装,再进入 IP 层被打上源 IP 和目的 IP 的标签,随后通过路由表计算出最优路径,最终通过网卡发送出去。这个过程中,IP 地址的分配、路由的选择、数据包的分片与重组,每一个环节都直接影响 Linux 网络的稳定性与性能。
IP 协议
在网络模型中,IP 协议位于网络层,负责实现两台主机之间的数据传送。它相当于快递员,处理数据的寻址与路由。
报文格式
IP 报文头部包含多个关键字段,用于控制数据传输过程:
1. 四位版本号
对于 IPv4 来说,该字段值为 4。
2. 四位首部长度
用来描述报头的单位,每个单位是 4 个字节。该字段决定了 IP 头部的总长度。
3. 8 位服务类型
例如最大吞吐量、最小延迟、最高可靠性等。一般只能选一个优先级策略。
4. 16 位总长度
整个报文的大小,以字节为单位。包括头部和数据部分。
5. 16 位标识
用于标识同一数据包的分片,确保接收方能正确重组。所有来自同一个原始数据包的分片具有相同的标识值。
6. 3 位标志
包含保留位、不分片标志(DF)和更多分片标志(MF)。用于控制是否允许分片以及是否为最后一个分片。
7. 13 位片偏移
指示当前分片在原数据包中的位置,以 8 字节为单位。用于确定分片的顺序。
8. 8 位生存时间
数据包的最大跳数。每经过一个路由器减 1,防止路由器错误占用网络资源导致环路。
9. 8 位协议
表示上层协议的类型,例如 TCP 协议(6)、UDP 协议(17)等。
10. 16 位首部检验和
使用 CRC 进行校验,来鉴别头部是否损坏。仅对头部进行校验,不对数据部分校验。
网段划分
什么是网段划分
网段划分就是将一整个互联网划分为更小的网络区域,提高查询效率,方便管理。例如 A 区、B 区、C 区,再在每个区域进行划分,形成许多子网。
如何进行网段划分
引入两个概念:
- 网络位:保证相互连接的两个网段具有不同的标识。
- 主机位:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
而划分网络位和主机位的就是子网掩码,比如 255.255.255.0。
如何计算网段
假设现在有一个 IPv4 地址:192.168.1.100,二进制是 11000000.10101000.00000001.01100100。
子网掩码前面连续的 1 对应网络位,后面连续的 0 对应主机位。例如:
255.255.255.0 -> 11111111.11111111.11111111.00000000 -> 前 24 位是网络位,后 8 位是主机位。
它表示的含义是:IP 地址(二进制)的前 24 位保持不变,后 8 位全变为 0。
例如:11000000.10101000.00000001.01100100 -> 11000000.10101000.00000001.00000000
网段为 192.168.1.0。同一个网络主机如 192.168.1.5、192.168.1.200 最后的网段都是 192.168.1.0。
IP 地址数量
我们知道 IPv4 是由 32 位二进制表示,那么一共有 2^32 个 IP。但网民不止这么多,设备主机上网的时候再给它分配 IP,该 IP 由它连接的路由器分配,因此每次分配的 IP 可能不同。


