Linux网络学习【从深入理解网络层原理到IP分片与重组全过程剖析】


🔥承渊政道: 个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统与网络知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》 《cpolar知识学习》
✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介:

在Linux网络编程中,我们常常关注 TCP、UDP 的通信特点与数据收发接口,但数据离开主机后,如何跨越不同网络到达目的地?如果途中某段链路无法容纳整个数据报,又该如何处理? 要回答这些问题,就需要深入网络层,理解逻辑寻址、路由转发,以及IP 分片与重组之间的联系.本文主要以 IPv4 为讨论对象.当数据报超过出口链路的最大传输单元(MTU),且允许分片时,可以拆分为多个分片分别传输,再由目的主机完成重组.然而,这并不是简单地"切开再拼接":如何确定每个分片的大小?接收端怎样识别属于同一数据报的分片?片偏移与分片标志分别起什么作用?如果分片乱序到达或发生丢失,重组过程又会受到什么影响?这些细节,正是理解协议运行机制的关键.本文将以 "网络层职责 → IP 报文结构 → 分片过程 → 目的端重组" 为主线,从寻址、路由与转发入手,结合具体示例分析分片大小、偏移计算与重组条件,并通过抓包观察实际传输现象.通过串联一个数据报从发送、分片到重组的完整过程,将报文字段与通信行为对应起来,为后续网络编程与故障排查打下基础.

目录

一、网络层

网络层是OSI七层模型中的第3层,核心作用是通过IP地址和路由选择,实现数据包在不同网络之间的传输.

1.网络层的主要功能

  1. 逻辑寻址:使用 IPv4、IPv6 地址标识网络中的设备.
  2. 路由选择:根据目标 IP 地址,确定数据包的传输路径.
  3. 数据包转发:路由器根据路由表,将数据包转发到下一跳.
  4. 分片与重组:在适用情况下,处理数据包大小与网络 MTU 的限制.
  5. 差错报告与诊断:通过ICMP等协议反馈网络问题.

2.网络层常见协议

协议 主要作用
IPv4 使用 32 位 IP 地址进行寻址
IPv6 使用 128 位 IP 地址进行寻址
ICMP 网络差错报告、Ping 诊断
OSPF 内部网络动态路由
BGP 自治系统之间的路由信息交换

3.网络层如何工作?

例如,电脑访问不同网络中的服务器:

  • 电脑根据目标IP,决定将数据包交给默认网关.
  • 路由器查询路由表,选择下一跳.
  • 数据包经过多个路由器,最终到达目标主机.

IP提供的是尽力而为的传输服务,不保证数据包一定到达或按顺序到达.

4.网络层与其他层的区别

层次 核心功能 典型标识或协议
传输层(第4层) 进程间通信 TCP、UDP、端口号
网络层(第3层) 跨网络寻址与路由 IP、路由器
数据链路层(第2层) 同一链路上的帧传输 MAC、以太网

数据链路层看MAC,网络层看IP,传输层看端口.


二、IP协议


2.1基本概念

IP(Internet Protocol,网际协议)是网络层的核心协议,负责将数据包从源主机传送到目标主机,实现不同网络之间的通信.

1.IP协议的核心概念

概念 含义
IP 地址 用于标识网络中的设备或网络接口
IP 数据报 IP 协议传输的基本数据单位
源 IP 地址 数据包从哪里发出
目的 IP 地址 数据包要发送到哪里
路由选择 确定数据包下一步往哪里走
TTL(生存时间) 限制数据包可以经过的路由器跳数
尽力而为 尽力传输,但不保证成功送达

2.IP数据报的基本结构

3.IP 协议如何工作?

以主机B向主机C发送数据:

  1. 封装数据包:主机 B 添加源 IP、目的IP等信息.
  2. 查询路由表:每台路由器根据目的IP地址选择下一跳.
  3. 逐跳转发:数据包依次经过多个路由器,TTL每经过一个路由器减1.
  4. 到达目标:主机C收到数据报后,将其交给相应的上层协议处理.

4.IP协议的三个重要特点

  • 无连接:发送数据之前,不需要建立专门的连接.
  • 不可靠:不保证数据包一定到达,也不保证按顺序到达.
  • 尽力而为:网络尽可能转发数据包,但可能出现丢包、延迟或乱序.

一句话记忆:IP协议解决的是"数据包发给谁、经过哪里、如何转发"的问题,而不是保证数据一定可靠到达.


2.2协议头格式

IPv4 数据报由IP首部(Header)和数据部分(Data)组成.IP首部包含版本、首部长度、服务类型、总长度、标识、标志、片偏移、TTL、协议、首部检验和、源 IP 地址、目的 IP 地址以及可选字段.

1.4位版本号(Version)

指定 IP 协议的版本号,用来说明当前数据报采用哪一种IP协议.对于IPv4来说,版本号固定为 4,其二进制表示为 0100.如果是IPv6,则版本号为6.

2.4位首部长度(Header Length / IHL)

表示IP数据报首部占用多少个32位(4字节)的单位.由于该字段只有4位,最大可以表示15,因此 IPv4 首部最大长度为15 × 4 = 60字节.

IPv4首部固定部分的长度为 20 字节,因此首部长度字段的最小有效值为 5.如果没有可选字段,通常首部长度就是 20 字节.

3.8位服务类型(Type of Service,TOS)

用于描述数据报的服务质量要求,例如传输优先级、延迟和拥塞处理等.

早期 TOS 字段由 3 位优先级、4 位服务类型和 1 位保留位组成.其中 4 位服务类型分别表示最小延迟、最大吞吐量、最高可靠性和最小成本.

例如,SSH、Telnet 等交互式应用更关注传输延迟,而 FTP 等文件传输应用通常更关注吞吐量.

注意: 上述是早期的定义.现代 IPv4 将这 8 位作为区分服务字段,其中 6 位为 DSCP(区分服务代码点),2 位为 ECN(显式拥塞通知).

4.16位总长度(Total Length)

表示整个 IP 数据报的长度,包括 IP 首部和数据部分,单位为字节.

由于总长度字段占 16 位,因此 IPv4 数据报的理论最大长度为 2¹⁶ - 1 = 65535 字节.

例如,一个 IP 数据报的首部长度为 20 字节,数据部分为 1000 字节,那么总长度就是 1020 字节.

5.16位标识(Identification)

用于标识一个 IP 数据报,主要作用是帮助接收端完成 IP 分片的重组.

当一个 IP 数据报因为超过网络的 MTU(最大传输单元)而需要分片时,各个分片会携带相同的标识值.

接收端可以结合标识、源 IP、目的 IP 和协议等信息,判断哪些分片属于同一个原始数据报,并将它们重新组合.

6.3位标志(Flags)

用于控制 IP 数据报是否允许分片,以及判断后面是否还有更多分片.

3 位标志分别为:

  • 第一位:保留位,必须设置为 0.
  • 第二位:DF(Don't Fragment),禁止分片标志.DF = 1 表示不允许分片;DF = 0 表示允许分片.
  • 第三位:MF(More Fragments),更多分片标志.MF = 1 表示后面还有分片;MF = 0 表示这是最后一个分片,或者数据报根本没有分片.

例如,当 DF = 1 且数据报超过下一跳网络允许的 MTU 时,路由器不能对其进行分片,通常会丢弃数据报并返回相应的 ICMP 差错报文.

7.13位片偏移(Fragment Offset)

表示当前分片的数据部分在原始 IP 数据报数据部分中的相对位置,主要用于接收端按照正确顺序重组分片.

片偏移的单位是8字节,因此实际偏移字节数等于片偏移字段的值乘以 8.

例如,一个分片的片偏移值为185,那么它在原始数据部分中的起始位置就是 185 × 8 = 1480 字节.

为了保证偏移位置能够正确表示,除最后一个分片外,其他分片的数据部分长度必须是 8 字节的整数倍.

8.8位生存时间(Time To Live,TTL)

用于限制 IP 数据报在网络中能够经过的路由器跳数,防止数据报因为路由环路而在网络中无限转发.

TTL 由发送端设置,常见的初始值有 64、128、255 等,具体取决于操作系统或应用配置.

每经过一个路由器,TTL 通常减 1. 如果 TTL 减少到0,路由器就会丢弃该数据报,通常还会向发送端返回 ICMP 超时报文.

例如,数据报初始 TTL = 64,经过 5 台路由器后,TTL 通常变成 59.

9.8位协议(Protocol)

用于标识 IP 数据报的数据部分使用哪一种上层协议,帮助接收端将数据交给正确的协议模块进行处理.

常见协议编号:

  • ICMP:1,主要用于网络诊断和差错报告.
  • TCP:6,提供面向连接的可靠传输服务.
  • UDP:17,提供无连接的数据报传输服务.

例如,协议字段的值为 6,表示 IP 数据报的数据部分承载的是 TCP 报文段;如果值为17,则表示承载的是 UDP 数据报.

10.16位首部检验和(Header Checksum)

用于检查 IPv4 首部在传输过程中是否发生错误.

发送端会根据 IP 首部内容,采用 16 位反码求和 的方式计算检验和,并将结果填写到首部检验和字段中.

接收设备通过相应的计算检查首部是否出错.如果检测到错误,通常会丢弃该数据报.

需要注意,该字段只检查IP首部,不检查数据部分.

另外,由于路由器转发数据报时会修改 TTL,因此也需要相应更新首部检验和.

11.32位源IP地址(Source IP Address)

用于标识 IP 数据报的发送方地址,长度为 32 位,也就是 4 字节.

例如,源 IP 地址为 192.168.1.10,表示该数据报的源地址是 192.168.1.10.

通常情况下,路由器在转发数据报时不会修改源 IP 地址,但在经过 NAT(网络地址转换)设备时,源 IP 地址可能发生变化.

12.32位目的IP地址(Destination IP Address)

用于标识 IP 数据报的目标地址,长度同样为 32 位.

例如,目的 IP 地址为 192.168.2.20,表示该数据报需要发送到该 IP 地址对应的目标设备或网络接口.

路由器在转发数据报时,会根据目的 IP 地址查询路由表,确定数据报应该从哪个接口转发,以及下一跳应该发送给哪台设备.

13.选项字段(Options)

选项字段不是 IPv4 首部中必须存在的内容,主要用于提供一些附加功能,例如记录路由、时间戳等.

选项字段的长度是可变的.IPv4 固定首部为 20 字节,最大首部为 60 字节,因此选项及其填充最多占用 40 字节.

如果首部包含选项,还需要根据情况进行填充,使整个首部长度保持为 4 字节的整数倍.

在普通网络通信中,IPv4 数据报通常不包含选项字段.

14.数据部分(Data / Payload)

数据部分用于存放上层协议传递下来的实际内容,例如 TCP 报文段、UDP 数据报或者 ICMP 报文.

IP 协议会在数据部分前面添加 IP 首部,形成完整的IP数据报,然后交给数据链路层进行封装和传输.

例如,当用户通过浏览器访问网站时,TCP 报文段可以作为 IP 数据报的数据部分,由 IP 协议负责将其发送到目的地址.


2.3⽹段划分(重点)

IP地址分为两个部分,⽹络号和主机号.

  • ⽹络号: 保证相互连接的两个⽹段具有不同的标识.
  • 主机号: 同⼀⽹段内,主机之间具有相同的⽹络号,但是必须有不同的主机号.
  • 不同的⼦⽹其实就是把⽹络号相同的主机放到⼀起.
  • 如果在⼦⽹中新增⼀台主机,则这台主机的⽹络号和这个⼦⽹的⽹络号⼀致, 但是主机号必须不能和⼦⽹中的其他主机重复.

通过合理设置主机号和⽹络号,就可以保证在相互连接的⽹络中,每台主机的IP地址都不相同.那么问题来了⼿动管理⼦⽹内的IP,是⼀个相当麻烦的事情.

  • 有⼀种技术叫做DHCP, 能够⾃动的给⼦⽹内新增主机节点分配IP地址,避免了⼿动管理IP的不便.
  • ⼀般的路由器都带有DHCP功能.因此路由器也可以看做⼀个DHCP服务器.

过去曾经提出⼀种划分⽹络号和主机号的⽅案把所有IP 地址分为五类,如下图所示.

随着Internet的⻜速发展,这种划分⽅案的局限性很快显现出来,⼤多数组织都申请B类⽹络地址导致B类地址很快就分配完了,⽽A类却浪费了⼤量地址.

  • 例如,申请了⼀个B类地址,理论上⼀个⼦⽹内能允许6万5千多个主机. A类地址的⼦⽹内的主机数更多.
  • 然⽽实际⽹络架设中不会存在⼀个⼦⽹内有这么多的情况.因此⼤量的IP地址都被浪费掉了.

针对这种情况提出了新的划分⽅案称为CIDR(Classless Interdomain Routing)(⽆类别域间路由).

  • 引⼊⼀个额外的⼦⽹掩码(subnet mask)来区分⽹络号和主机号.
  • ⼦⽹掩码也是⼀个32位的正整数.通常⽤⼀串 "0" 来结尾.
  • 将IP地址和⼦⽹掩码进⾏ "按位与" 操作,得到的结果就是⽹络号.
  • ⽹络号和主机号的划分与这个IP地址是A类、B类还是C类⽆关.

可⻅,IP地址与⼦⽹掩码做与运算可以得到⽹络号,主机号从全0到全1就是⼦⽹的地址范围;IP地址和⼦⽹掩码还有⼀种更简洁的表示⽅法,例如140.252.20.68/24,表示IP地址为140.252.20.68,⼦⽹掩码的⾼24位是1,也就是255.255.255.0.


2.4特殊的IP地址

在 IPv4 网络中,并不是所有 IP 地址都可以直接分配给普通主机使用.有些地址具有特殊用途,例如表示整个网络、广播通信、本机测试以及局域网内部通信等.

1.常见的特殊 IPv4 地址

IP 地址或地址范围 名称 主要作用
0.0.0.0 未指定地址 表示尚未指定的本机地址
0.0.0.0/0 默认路由 匹配所有 IPv4 目的地址
127.0.0.1 环回地址 本机与本机通信
127.0.0.0/8 环回地址范围 用于本机内部通信
255.255.255.255 受限广播地址 向本地网络广播
169.254.0.0/16 链路本地地址 在本地链路自动配置地址
224.0.0.0/4 组播地址 将数据发送给一组接收者
240.0.0.0/4 保留地址范围 主要保留供特殊用途或未来使用
192.168.1.0/24 网络地址示例 标识一个具体子网

2.通过实例理解特殊 IP 地址

1.网络地址(Network Address)

用于表示一个网络,而不是网络中的某一台具体主机.

例如 192.168.1.0/24,前24位是网络位,后8位是主机位.当主机位全部为0时,得到网络地址 192.168.1.0.

2.广播地址(Broadcast Address)

用于向一个网络内的所有主机发送广播数据.

例如 192.168.1.0/24 的广播地址为 192.168.1.255,因为其主机位全部为 1.

另外,255.255.255.255 是受限广播地址,只用于本地网络,路由器不会转发此类广播.

3.环回地址(Loopback Address)

最常见的是 127.0.0.1,也叫本地回环地址,用于测试本机 TCP/IP 协议栈.

例如:

复制代码
ping 127.0.0.1

数据在本机网络协议栈内部处理,不需要通过物理网卡发送到外部网络.

4.私有 IP 地址(Private IP Address)

私有 IP 地址可以在局域网内部使用,但不能直接作为公网路由中的地址.

类型 私有 IP 地址范围 CIDR
A 类范围 10.0.0.0 ~ 10.255.255.255 /8
B 类范围 172.16.0.0 ~ 172.31.255.255 /12
C 类范围 192.168.0.0 ~ 192.168.255.255 /16

例如,家庭路由器给电脑分配的 192.168.1.100 通常就是私有 IP 地址,访问互联网时一般会通过 NAT 进行地址转换.

5.链路本地地址(Link-local Address)

169.254.0.0/16 用于本地链路通信.

例如,一台电脑配置为自动获取 IP 地址,但无法从 DHCP 服务器获得地址时,某些操作系统可能会自动配置 169.254.x.x 地址.

这种地址通常不能通过路由器跨网络通信.

6.组播地址(Multicast Address)

地址范围是 224.0.0.0 ~ 239.255.255.255,用于一对多或者多对多的数据传输.

与广播不同,组播主要将数据发送给加入对应组播组的接收者,而不是所有主机.


2.5IP地址的数量限制

IP 地址的数量限制主要来自 IP 地址的二进制位数.IPv4使用32位地址,能够表示的地址总数有限.随着互联网设备不断增加,IPv4地址逐渐不够使用,因此出现了 IPv6、NAT等解决方案.

1.IPv4 地址为什么数量有限?

IPv4 地址由 32 位二进制数组成,每一位只能是 0 或 1,因此理论上最多可以表示:

2 32 = 4 , 294 , 967 , 296 2^{32}=4,294,967,296 \\ 232=4,294,967,296

也就是约 42.95 亿个 IPv4 地址.

例如:

但这 42.95 亿个地址并不能全部作为公网主机地址使用,因为其中一部分被分配给私有网络、组播、环回、保留等特殊用途.

2.子网划分对 IP 地址数量的影响

在 IPv4 网络中,IP 地址通常分成两部分:

  • 网络位:用于标识设备所在的网络.
  • 主机位:用于标识网络中的不同主机.

主机位越多,一个子网包含的 IP 地址就越多.

对于普通 IPv4 子网:

t e x t 地址总数 = 2 主机位数 text{地址总数}=2^{\text{主机位数}} text地址总数=2主机位数

可用主机地址数 = 2 主机位数 − 2 \text{可用主机地址数}=2^{\text{主机位数}}-2 可用主机地址数=2主机位数−2

减去的 2 个地址通常是网络地址和广播地址.

常见子网的 IP 地址数量

子网掩码 主机位 地址总数 通常可用
/24 8 256 254
/25 7 128 126
/26 6 64 62
/27 5 32 30
/28 4 16 14
/29 3 8 6
/30 2 4 2

注:/31 常用于点对点链路,可以使用两个地址;/32 表示单个 IPv4 地址,不适用普通的减 2 规则.

3.举例:为什么 /24 能容纳 254 台主机?

假设一个网络为 192.168.1.0/24.

如果将同一个 /24 网络划分成 16 个 /28 子网,每个子网就只有 16 个地址,其中通常可供主机使用的只有 14 个.

注意:子网划分不会增加 IP 地址总数,只会改变地址的分组方式.

4.如何解决 IPv4 地址数量不足?

  1. NAT(网络地址转换)

允许局域网中多台设备通过一个或少量公网 IP 地址访问互联网.例如,家里的手机、电脑、平板可以共用路由器的一个公网 IPv4 地址.

  1. CIDR(无类别域间路由)

不再受传统 A、B、C 类地址固定网络边界的限制,使用 /20、/24、/28 等前缀长度,更灵活地分配地址空间,减少浪费.

  1. IPv6

IPv6 将 IP 地址长度从 32 位扩展到 128 位,理论地址数量达到:

2 128 ≈ 3.4 × 10 38 2^{128}\approx3.4\times10^{38} 2128≈3.4×1038

相比 IPv4,IPv6 提供了极其庞大的地址空间.


2.6私有IP地址和公⽹IP地址

IP 地址按照使用范围,可以分为私有 IP 地址(Private IP)和公网IP地址(Public IP).

  • 私有 IP 地址:主要用于家庭、学校、公司等内部网络,可以在不同的局域网中重复使用,但不能直接在公共互联网中路由.
  • 公网 IP 地址:用于公共互联网通信,必须在全球路由体系中保持唯一,才能正确找到对应的网络设备或服务.

1.私有 IP 地址(Private IP)

私有 IP 地址是专门保留给内部网络使用的 IP 地址.

根据RFC1918,IPv4 私有地址分为以下三个范围:

地址类别 私有 IP 地址范围 子网前缀
A 类范围 10.0.0.0 ~ 10.255.255.255 /8
B 类范围 172.16.0.0 ~ 172.31.255.255 /12
C 类范围 192.168.0.0 ~ 192.168.255.255 /16

例如:

  • 家庭电脑:192.168.1.100
  • 手机:192.168.1.101
  • 家庭路由器:192.168.1.1

这些设备可以通过私有 IP 地址在局域网中相互通信.

私有IP地址最重要的特点是:不同的局域网可以重复使用相同的私有 IP 地址.

例如,你家的电脑和朋友家的电脑都可以使用 192.168.1.100,因为它们属于相互独立的局域网,不会直接发生地址冲突.

2.公网 IP 地址(Public IP)

公网 IP 地址是可以在公共互联网中进行路由的 IP 地址.

例如,前面提供的网络拓扑图中:

  • 公网服务器:122.77.241.3
  • 运营商路由器公网接口:122.77.241.4
  • 另一台运营商路由器公网接口:122.77.241.5

这些地址在图中被用作公网通信地址.

与私有IP不同,公网IP地址不能在全球互联网的正常路由环境下随意重复分配给不同网络.

注意:并不是所有非私有IP地址都是可用公网地址.环回、组播、链路本地等特殊地址也不能作为普通公网主机地址使用.

3.私有 IP 如何访问公网?

在这个过程中,家庭电脑原本使用 192.168.1.201,经过家庭路由器和运营商两次 NAT 地址转换后,公网服务器看到的源 IP 可以是 122.77.241.4.

这种情况下,多个家庭设备可以共享一个公网 IP 地址访问互联网.

4.NAT(网络地址转换)

NAT(Network Address Translation)是一种将 IP 地址进行转换的技术.

它的主要作用之一,是让多个使用私有 IP 地址的设备共享较少数量的公网 IP 地址.

例如:

内部设备 私有 IP 对外使用的公网 IP
电脑 A 192.168.1.100 122.77.241.4
电脑 B 192.168.1.101 122.77.241.4
手机 C 192.168.1.102 122.77.241.4

在常见的 NAPT(网络地址端口转换)中,路由器还通过端口号区分不同设备的连接,保证返回的数据能交给正确的内部设备.

5.私有 IP 与公网 IP 的区别

对比项目 私有 IP 公网 IP
使用范围 内部网络 公共互联网
全球唯一性 不要求 正常公网路由中要求唯一
是否可以重复使用 不同私有网络可以 不能随意重复
是否可以直接在公网路由 不可以 可以
是否需要向公网地址资源体系申请 不需要 需要通过相应分配体系获取
常见示例 192.168.1.100 8.8.8.8

需要注意,拥有公网IP并不意味着互联网中的其他设备一定可以主动访问它,还可能受到防火墙、安全策略等限制.

地区或者国家IP的分布


2.7尝试理解公⽹


2.8路由

路由是指在计算机网络中,根据数据包的目的IP地址,选择数据包从源主机到目标主机的传输路径的过程.

简单理解:路由就是找路,路由器就是负责指路和转发数据的设备.

1.路由的基本概念

可以用前面讲过的"唐僧问路"来理解.

唐僧要从长安去西天取经,但他不知道完整路线,于是每到一个地方,就询问下一步应该往哪里走.

路由器也是如此:每台路由器不一定知道数据包从起点到终点的完整路径,但需要知道应该把数据包交给哪个下一跳.

2.路由的工作过程

假设主机 A 的 IP 地址为 192.168.1.10,主机 B 的 IP 地址为 192.168.2.10.

  1. 主机 A 判断目标位置:发现主机B不在自己的局域网中,于是把数据包发送给默认网关(路由器A).
  2. 路由器 A 查询路由表:根据目的IP地址,找到下一跳路由器B.
  3. 路由器 B 查询路由表:发现目的网络是直接连接的网络,因此将数据包发送到主机B.
  4. 主机 B 接收数据包:完成此次网络层的数据传输.

3.什么是路由表(Routing Table)?

路由表是路由器内部保存的路径信息,用于决定数据包应该从哪个接口发出,以及交给哪个下一跳.

例如,路由器 A 的路由表:

目标网络 下一跳 出接口
192.168.1.0/24 直连 eth0
10.0.0.0/30 直连 eth1
192.168.2.0/24 10.0.0.2 eth1
0.0.0.0/0 10.0.0.2 eth1

当路由器收到目的 IP 为 192.168.2.10 的数据包时:

  • 查找与目的 IP 匹配的路由.
  • 按最长前缀匹配原则,选择 192.168.2.0/24.
  • 确定下一跳为 10.0.0.2.
  • 从 eth1 接口转发数据包.

其中,0.0.0.0/0 是默认路由,当没有其他更具体的匹配路由时,可以使用它.

4.路由的分类

类型 特点
直连路由 接口配置地址且链路正常时,通常自动生成
静态路由 由管理员手动配置
动态路由 通过 OSPF、BGP 等路由协议学习
默认路由 没有更具体的匹配路由时使用

5.路由和转发有什么区别?

路由(Routing):决定数据包应该往哪里走,涉及路径的计算和选择.

转发(Forwarding):根据已有的转发表,将收到的数据包发送到对应接口.

可以把它理解为:

  • 路由:导航软件规划路线.
  • 转发:汽车按照路线实际行驶.

核心记忆:IP 地址决定最终要去哪里,路由表决定下一跳去哪里;数据包依靠每台路由器逐跳转发,最终到达目标主机.

假设某主机上的⽹络接⼝配置和路由表如下:

这台主机有两个⽹络接⼝,⼀个⽹络接⼝连到192.168.10.0/24⽹络,另⼀个⽹络接⼝连到192.168.56.0/24⽹络.路由表的Destination是⽬的⽹络地址,Genmask是⼦⽹掩码,Gateway是下⼀跳地址,Iface是发送接⼝,Flags中的U标志表⽰此条⽬有效(可以禁⽤某些条⽬),G标志表示此条⽬的下⼀跳地址是某个路由器的地址,没有G标志的条⽬表示⽬的⽹络地址是与本机接⼝直接相连的⽹络,不必经路由器转发.

转发过程例1: 如果要发送的数据包的⽬的地址是192.168.56.3.

  • 跟第⼀⾏的⼦⽹掩码做与运算得 到192.168.56.0,与第⼀⾏的⽬的⽹络地址不符
  • 再跟第⼆⾏的⼦⽹掩码做与运算得 到192.168.56.0,正是第⼆⾏的⽬的⽹络地址,因此从eth1接⼝发送出去.
  • 由于192.168.56.0/24正是与eth1接⼝直接相连的⽹络,因此可以直接发到⽬的主机,不需要经路由器转发.

转发过程例2: 如果要发送的数据包的⽬的地址是202.10.1.2

  • 依次和路由表前⼏项进⾏对⽐,发现都不匹配.
  • 按缺省路由条⽬,从eth0接⼝发出去,发往192.168.10.1路由器.
  • 由192.168.10.1路由器根据它的路由表决定下⼀跳地址.

2.9路由表⽣成算法

路由表生成算法是指路由器通过计算或学习网络路径,确定到达不同目标网络的最佳下一跳,并生成、更新路由表的方法.

简单理解:前面讲的"唐僧问路"是数据包按照路由表一跳一跳地前进,而路由表生成算法解决的是:每个路由器怎么知道下一站应该去哪里?

1.路由表是如何生成的?

路由表主要有三种来源:

路由类型 生成方式 特点
直连路由 根据路由器接口的网络配置自动生成 不需要学习
静态路由 网络管理员手动配置 简单、可控
动态路由 路由器通过路由协议交换信息并计算 自动适应网络变化

其中,动态路由算法是学习路由表生成原理的重点.

2.三种重要的动态路由算法

3.举例:路由器如何计算最佳路径?

假设有四台路由器 A、B、C、D,各条链路的代价如下:

如果 A 想将数据包发送到 D:

  • 路径一:A → B → C → D,总代价为 1 + 2 + 1 = 4.
  • 路径二:A → C → D,总代价为 4 + 1 = 5.

按照最小总代价原则,路由器 A 会选择第一条路径,下一跳为 B.

根据上述拓扑,路由器 A 计算出的简化结果如下:

目标路由器 最优下一跳 总代价
B B 1
C B 3
D B 4

实际 IP 路由表中,目的项通常是网络前缀,而不是路由器名称.

4.两种经典算法的计算原理

1.Bellman-Ford 算法(距离向量)

基本公式:

D x ( y ) = m i n v c ( x , v ) + D v ( y ) D_x(y)=min_v{c(x,v)+D_v(y)} Dx(y)=minvc(x,v)+Dv(y)

其中:

  • \(D_x(y)\):路由器 x 到目的地 y 的估计最小代价.
  • \(c(x,v)\):路由器 x 到邻居 v 的链路代价.
  • \(D_v(y)\):邻居 v 到目的地 y 的估计最小代价.

路由器不断与邻居交换距离信息,更新自己的路由表,直到路径信息逐渐收敛.

2.Dijkstra 算法(链路状态)

Dijkstra 算法通过以下过程计算最短路径:

  1. 以当前路由器作为起点.
  2. 初始化到各节点的路径代价.
  3. 从尚未确定最短距离的节点中,选择当前代价最小的节点.
  4. 更新通过该节点到达其他节点的代价.
  5. 重复计算,直到得到所有可达目标的最短路径.

5.距离向量和链路状态的区别

对比 距离向量 链路状态
代表协议 RIP OSPF
典型算法 Bellman-Ford Dijkstra
掌握的信息 邻居通告的距离 区域内的网络拓扑
路径计算 根据邻居距离更新 根据拓扑计算最短路径树
网络变化 可能收敛较慢 通常收敛较快
典型问题 路由环路、计数到无穷 拓扑维护与计算开销

6.路由表生成与路由表查询的区别

这两个概念很容易混淆:

路由表生成:通过直连信息、静态配置或动态路由协议,计算并形成路由条目.

路由表查询:当数据包到达路由器时,根据目的IP查找路由,通常遵循最长前缀匹配原则.

例如,路由表同时包含 192.168.0.0/16 和 192.168.1.0/24,目标地址为 192.168.1.10 时,会优先匹配更具体的 /24 路由,而不是简单选择代价最小的 /16 路由.

核心记忆:

  • RIP:问邻居,基于距离向量更新路由.
  • OSPF:看地图,使用 Dijkstra 计算最短路径.
  • BGP:看经过哪些自治系统,依据路径属性和策略选路.
  • 路由表生成负责找出可用的路,数据包转发负责按照选定的路逐跳前进.

2.10公⽹构建全流程

阶段 参与主体 核心职责 典型成果案例
物理基础设施 设备制造商(华为/思科) 生产光缆/路由器/服务器 单模光纤衰减 ≤0.18dB/km
物理基础设施 能源供应商 保障数据中心7×24供电 Tier IV级数据中心(99.995%可用性)
协议标准 IETF 制定TCP/IP/HTTP等协议 RFC 793(TCP协议规范)
协议标准 IEEE 制定802.3/802.11标准 100G以太网标准(802.3ba)
地址分配 ICANN 全球IP/域名根管理 IPv6 ::/12地址块分配
地址分配 APNIC/RIPE NCC 区域IP分配与回收 中国203.0.113.0/24地址段
骨干网络 Tier1运营商(中国电信) 跨洋光缆建设与维护 亚太直达海缆(108Tbps容量)
骨干网络 IXP(DE-CIX) 提供网络交换节点 法兰克福交换中心峰值18Tbps
接入服务 ISP(Comcast/中国联通) 部署FTTH/5G接入网 XGS-PON万兆光纤入户
监管合规 工信部/FCC 频谱分配与网络政策制定 中国IPv6普及率35%(2023)
监管合规 CERT 网络安全事件响应 Log4j漏洞全球应急处理
应用服务 AWS/阿里云 提供云计算与CDN服务 全球边缘节点超2300个
应用服务 Netflix/抖音 内容分发与流量优化 自适应码率(ABR)技术
终端连接 手机厂商(苹果/小米) 实现协议栈与天线优化 WiFi6实测速率1.2Gbps

三、IP分⽚和组装的具体过程

• 16位标识(id): 唯⼀的标识主机发送的报⽂.如果IP报⽂在数据链路层被分⽚了,那么每⼀个⽚⾥⾯的这个id都是相同的.

• 3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1表示禁⽌分⽚,这时候如果报⽂⻓度超过MTU,IP模块就会丢弃报⽂.第三位表⽰"更多分⽚",如果分⽚了的话, 最后⼀个分⽚置为0,其他是1.类似于⼀个结束标记.

• 13位分⽚偏移(framegament offset): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表示当前分⽚在原报⽂中处在哪个位置.实际偏移的字节数是这个值除以8得到的.因此除了最后⼀个报⽂之外(之前如果都是8的整数倍,最后⼀⽚的偏移量也⼀定是8的整数倍),其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).

• 注意:⽚偏移(13位)表示本⽚数据在它所属的原始数据报数据区中的偏移量(以8字节为单位)


3.1分⽚与组装的过程

IP分片

IP分片是指:当一个IPv4数据报太大,超过下一段网络允许传输的最大长度(MTU)时,如果允许分片,就将数据报拆成多个较小的数据报分别传输,最后由目标主机重新组装.

可以把 IP 分片理解成:一个大包裹无法装进快递车,就拆成几个小包裹分别运送,最后在收件人那里重新组合.

1.为什么需要IP分片?

不同网络允许传输的数据包大小可能不同.

例如:

  • 原始 IP 数据报:4000 字节
  • 以太网 MTU:1500 字节
  • IPv4 首部:20 字节

因为4000大于1500,一个IP数据报无法直接通过该链路.如果DF=0,允许分片,就可以将其拆成三个较小的数据报.

2.IP分片的工作过程

3.IP分片涉及的三个重要字段

1.16位标识(Identification)

用于标识原始 IP 数据报.当一个数据报分成多个分片时,这些分片具有相同的标识值,方便接收端判断哪些分片属于同一个原始数据报.

2.3位标志(Flags)

主要包括两个重要标志:

  • DF(Don't Fragment):DF = 1 表示禁止分片.如果数据报太大而需要分片,路由器会将其丢弃,通常返回 ICMP 差错信息.
  • MF(More Fragments):MF = 1 表示后面还有分片;MF=0表示没有后续分片.

3.13位片偏移(Fragment Offset)

表示当前分片的数据在原始数据部分中的位置,单位为8字节.

实际偏移字节数 = 片偏移 × 8 \text{实际偏移字节数}=\text{片偏移}\times8 实际偏移字节数=片偏移×8

例如,上面的分片情况:

分片 数据长度 片偏移 MF
第1片 1480 0 1
第2片 1480 185 1
第3片 1020 370 0

三个分片的标识字段相同.接收端根据标识、片偏移等信息恢复原始数据报.

4.IP分片的注意事项

第一,分片以后,每一片都有自己的IP首部.因此分片会产生额外的传输开销.

第二,分片可以通过不同路径到达目的主机.到达顺序也可能不同,接收端根据偏移位置重组,而不是简单按照到达顺序拼接.

第三,重组通常由目标主机完成.如果某一个分片丢失,原始IP数据报就无法完整重组.

第四,IPv6 路由器不会进行分片.IPv6 的分片由源主机负责.

一句话总结:IPv4 分片就是把超过 MTU 的大数据报拆成多个小数据报,通过标识、MF 标志和片偏移三个字段实现分片管理,最终由目标主机重新组装.


IP分片重组

IP 分片重组是指:当一个 IPv4 数据报被拆分成多个分片后,目标主机根据分片的标识、片偏移和标志位,将这些分片重新组合成原始IP数据报的过程.

可以理解为:一个大包裹被拆成三个小包裹运输,虽然三个包裹可能先后到达、顺序不同,但收件人可以根据编号和位置将它们重新拼成完整的包裹.

1.IP 分片重组的工作过程

继续使用前面的例子:原始IPv4数据报为4000字节,其中IP首部为20字节,数据部分为3980字节.

2.IP 分片重组依靠哪些字段?

字段 作用
标识(Identification) 判断哪些分片属于同一个原始数据报
标志(MF) 判断后面是否还有分片
片偏移(Fragment Offset) 判断分片在原始数据中的位置
总长度(Total Length) 判断当前分片的长度

接收端还会结合源 IP 地址、目的 IP 地址和协议号等信息来区分不同的原始数据报.

例如:

分片 数据字节范围 片偏移 MF
分片 1 0~1479 0 1
分片 2 1480~2959 185 1
分片 3 2960~3979 370 0

其中:

起始位置 = 片偏移 × 8 \text{起始位置}=\text{片偏移}\times8 起始位置=片偏移×8

第三个分片 MF = 0,表示这是最后一个分片.结合偏移和数据长度,接收端可确定原始数据部分的结束位置.

3.如果分片丢失怎么办?

假设三个分片中,第二个分片丢失:

  • 分片 1:收到.
  • 分片 2:丢失.
  • 分片 3:收到.

虽然收到了第一片和最后一片,但中间数据不完整,所以无法重组出整个原始数据报.

接收端会在重组超时后丢弃相关分片.如果上层使用TCP,通常由TCP的可靠传输机制处理数据丢失并进行必要的重传,而不是IPv4自己重新发送丢失分片.

4.分片与重组的区别

对比 IP 分片 IP 重组
主要目的 将大数据报拆小 将多个分片恢复成原始数据报
发生位置 IPv4 源主机或允许分片的中间路由器 通常是目的主机
关键依据 MTU、DF、片偏移、MF 标识、片偏移、MF 等
结果 多个独立 IP 分片 一个完整 IP 数据报

3.2分⽚与组装过程的示意图

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!


敬请期待下一篇文章内容


每日心灵鸡汤: 当你快要坚持不住时,困难也快撑不住了!

你觉得迷茫吗?不是你当初咬牙坚持,说要走这条路的吗?怎么连你自己也开始质疑起你自己来了?少年,你要止步于此了吗?我告诉你:当你快要坚持不住的时候,困难也快要坚持不住了!坚持,加油!!!

相关推荐
橘色的喵1 小时前
嵌入式Linux编程,如何把硬件中断交给用户态--UIO 的机制
linux·mcu·isr·中断·uio
~城南花已开~1 小时前
Redfish 事件接收服务搭建指南(Ubuntu Server 实测)
linux·服务器·python·ubuntu
倔强的石头1062 小时前
【Linux指南】进程通信系列(四):命名管道 FIFO —— 让陌生进程按名字见面
linux·服务器·网络
段一凡-华北理工大学2 小时前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章03:热风炉烧炉与风温的决定因素
大数据·linux·人工智能·能源·热风炉·高炉能源优化
_小许_2 小时前
Linux 常用命令速查:CentOS 与 Ubuntu 双线对照
linux·ubuntu·centos
码农客栈2 小时前
mt7601u移植
linux·运维·服务器
2601_949847752 小时前
io-ts 跨端三方库仓颉适配全流程
linux·运维·ubuntu
局部有解10 小时前
计算机网络:概论知识点整理
计算机网络
readhere13 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205