【Linux网络】网络层IP协议

主机与主机通信时,传输层只是保证数据传输的可靠性,但是主机A如何找到一条正确的路径到达主机B,就需要依靠网络层

文章目录

  • [1. 理解传输层VS网络层](#1. 理解传输层VS网络层)
  • [2. IP协议](#2. IP协议)
    • [2.1 基本概念](#2.1 基本概念)
    • [2.2 IP协议头格式](#2.2 IP协议头格式)
    • [2.3 子网划分](#2.3 子网划分)
    • [2.4 特殊的IP地址](#2.4 特殊的IP地址)
    • [2.5 IP地址的数量限制](#2.5 IP地址的数量限制)
    • [2.6 私有IP地址和公网IP地址](#2.6 私有IP地址和公网IP地址)
    • [2.7 尝试理解公网](#2.7 尝试理解公网)
    • [2.8 路由](#2.8 路由)
  • [3. IP分片和组装的具体过程](#3. IP分片和组装的具体过程)
    • [3.1 分片](#3.1 分片)
    • [3.2 组装](#3.2 组装)
    • [3.3 分片组装场景](#3.3 分片组装场景)

1. 理解传输层VS网络层

示例

假设张三的上层是张三爸爸,张三爸爸是学校的校长,张三成绩很好,有考满分的能力,那张三就一定能考满分吗?不一定!!!如果张三在一次数学考试中考了147分/满分150,没有考到满分,那张三爸爸要如何可靠的保证张三考满分呢?重考一次,没考到满分就重考,直到考到满分,这就保证了张三100%能考满分

网络中,数据可是要100%发给对方的!如何保证呢?

TCP/IP协议是互联网的基础通信协议栈,它通过分层设计实现了高效、可靠的网络通信。其中, 传输层(TCP)‍ 和 网络层(IP)‍ 共同协作,解决了"如何100%可靠地发送数据"的核心问题。

  • IP层(Internet Protocol)‍ :负责数据包的寻址和路由,即"把数据送到哪里去"。它提供的是尽力而为(best-effort)的服务,不保证数据是否送达、是否完整、是否按序到达。因此,IP层可以被比喻为"张三",具备基本的"能力",但缺乏保障机制。

  • TCP层(Transmission Control Protocol)‍ :运行在IP层之上,负责建立连接、数据分段、流量控制、拥塞控制、确认重传等机制,确保数据可靠、有序、无差错地传输。它相当于"张三爸爸",制定并执行"策略",以弥补IP层的不足。


2. IP协议

IP协议提供一种把数据报从主机A跨网络送到主机B的能力,只是有非常大的概率能做到,要想100%做到就需要依靠传输层TCP协议。

但是要想传输数据报,就需要标识通信两端双方主机的唯一性,IP协议解决的是主机到主机的问题,而上层TCP解决的是进程到进程的问题(因为有端口号),所以要有方式来标识主机的唯一性,因此每台主机都必须设置IP地址(公网IP,但不仅仅是公网IP)

类比:

我想去故宫玩,就需要先去北京;我先去看兵马俑,就需要先去陕西

数据传输也是类似的,想要从主机A到主机B,就需要先找到主机B所在的局域网

2.1 基本概念

节点 : 网络中的任何一个设备,是主机和路由器的统称。
主机 : 网络的"终点",通常是产生或消费数据的设备(如个人电脑、服务器、手机)。它配有IP地址,并且有基本的路由控制能力(例如,判断一个数据包是发往本地网络还是外部网络)。
路由器: 网络的"中转站",主要功能是在不同网络之间转发数据。它配有多个IP地址(每个接口一个),并且拥有复杂的路由控制能力,通过路由表决定数据包的最佳路径

注意:当代路由器已经是一台小型计算机了,是可以工作在应用层的

IP = 目标网络 + 目标主机

  • IP地址:唯一标识网络中设备的地址,如 172.18.45.153。
  • 子网掩码:用于区分IP地址中的网络部分和主机部分,如 255.255.255.0 表示前24位为网络地址,后8位为主机地址。
  • 网络地址:IP地址与子网掩码按位与运算的结果,标识设备所属的网络,例如 172.18.45.0。
  • 主机地址:IP地址中网络部分之后的部分,标识网络中的具体设备,如 153(即 .153)。

路由的本质理解:路由的时候,本质,是从一个子网,进入另一个子网


2.2 IP协议头格式

  1. 第一行(32位/4字节)
  • 4位版本

    • 作用:指明IP协议的版本号。

    • 详解:对于IPv4,这个字段的值是 4。路由器通过检查这个字段来判断该如何解析这个数据包的首部。如果值是 6,则代表是IPv6数据包。

  • 4位首部长度

    • 作用:表示IP协议头的总长度。

    • 详解:这个字段的单位是4字节。因为它只有4位,能表示的最大值是15(二进制1111)。所以,IP头的最小长度是5(二进制0101)*4=20字节(即没有选项的情况)。最大长度是15*4=60字节。这个字段的存在主要是为了处理可变长度的"选项"字段。

  • 8位服务类型(TOS)

    • 作用:用于指示数据包所需的服务质量。

    • 详解:可以用来指定数据包的优先级(如低延迟、高吞吐量、高可靠性等)。例如,VoIP语音通话需要低延迟,可以设置相应的TOS位;而大文件传输则需要高吞吐量。但在实际中,它的使用并不广泛,现在更多被DiffServ(差分服务)等新标准所重新定义。

  • 16位总长度

    • 作用:指整个IP数据报的总长度,包括头部和数据部分。

    • 详解:单位是字节。由于该字段是16位,最大值为2^16-1=65535字节。这意味着一个IPv4数据包的最大长度不能超过64KB。这也是为什么需要"分片"机制的原因之一。

  1. 第二行(32位/4字节) - 分片相关字段
    这一行的三个字段共同用于处理数据包的 分片重组。当一个大的数据包要经过一个最大传输单元较小的网络时(如以太网的MTU通常是1500字节),路由器需要将它分割成多个更小的"分片"。
  • 16位标识

    • 作用:唯一标识一个原始数据包的所有分片。

    • 详解:发送主机为每个要发送的数据包生成一个唯一的标识符。如果这个数据包被分片,那么所有属于它的分片都拥有相同的标识值。接收方根据这个标识符和源IP地址,就能判断哪些分片是属于同一个原始数据包的,从而正确地重组它们。

  • 3位标志

    • 作用:控制数据包的分片行为。

    • 详解:目前只使用了2位:

      • 第一位(最高位):保留,必须为0。

      • 第二位(DF位 - Don't Fragment):为1时表示"禁止分片"。如果数据包长度超过路径上的MTU,路由器会丢弃它,并返回一个ICMP错误消息。

      • 第三位(MF位 - More Fragments):为1时表示"还有更多分片",即这个分片不是原始数据包的最后一个分片。为0时,表示这是最后一个分片。

  • 13位片偏移

    • 作用:指示当前分片在原始数据包中的位置。

    • 详解:单位是8字节。例如,如果一个分片的片偏移量为0,表示它承载着原始数据包从第0字节开始的数据。如果偏移量为100,则表示它从原始数据包的第800字节(100*8)开始。接收方根据这个偏移量就可以像拼图一样把分片按正确顺序组装起来。

  1. 第三行(32位/4字节) - 数据包生命周期和内容信息
  • 8位生存时间(TTL)

    • 作用:防止数据包在网络中无限循环。

    • 详解:数据包每经过一个路由器(即一跳),这个值就减1。当TTL值减到0时,路由器会丢弃该数据包,并通常向发送方发送一个ICMP超时消息。这有效地限制了数据包在网络中能经过的最大跳数。初始值通常为64、128或255。

  • 8位协议

    • 作用:指示IP数据部分所承载的上层协议类型。

    • 详解:接收方(通常是目的主机或防火墙)根据这个字段来决定将数据部分交给哪个上层协议处理。例如:

      • 1-> ICMP(网络控制报文)

      • 6-> TCP(传输控制协议)

      • 17-> UDP(用户数据报协议)

  • 16位首部检验和

    • 作用:用于校验IP协议头在传输过程中是否出现错误。

    • 详解:发送方会计算头部的校验和并填入此字段。每个路由器在转发数据包之前,都会重新计算校验和。如果计算出的结果与字段值不符,说明头部在传输中受损,路由器会直接丢弃该数据包。注意:此校验和只针对IP头部,不校验数据部分(数据的校验由TCP/UDP等上层协议负责)。

  1. 地址信息(64位/8字节)
  • 32位源IP地址

    • 作用:发送数据包的主机的IP地址。
  • 32位目的IP地址

    • 作用:接收数据包的主机的IP地址。

    • 详解:这两个字段是IP通信的基础,指明了数据的来源和目的地。路由器主要就是根据目的IP地址来查询路由表,决定数据包的下一跳方向。

  1. 选项和数据
  • 选项

    • 作用:提供一些可选的扩展功能。

    • 详解:长度可变,从0到40字节不等。可用于记录路由、时间戳、源路由等功能,但现在很少使用,因为会降低路由器的处理效率。

  • 数据

    • 作用:IP协议真正要传送的有效载荷。

    • 详解:这就是从上层(如TCP、UDP、ICMP)传递下来的完整报文。IP协议头的所有工作,都是为了将这个数据段安全、准确地送达目的地。


2.3 子网划分

先来建立一个共识:网络建设,是经历了几十年的规划建设的。也就是说网络是被设计过的

报文路由的时候,最核心的是理解网络是如何被设计的

那为什么要进行子网划分呢?

举个例子:

  • 学校场景:如果一个学校有上万名学生,所有学生都在一个巨大的名单里。张三捡到一个学号为"06105"的钱包,他根本无法快速知道这个学生是谁、在哪个学院。他只能把失物信息上报给学校总部,再由总部逐级查找,效率极低。

  • 网络场景:如果一个大型网络中的所有设备(主机)都在同一个网络段内,任何一台设备发送的"广播"消息(比如问"谁的IP是192.168.1.105?")都会传递给网络里的所有设备,造成巨大的网络拥堵和低效。路由器也无法快速定位到目标设备。

解决方案:引入分层结构(子网划分)

  • 学校解决方案:将学校划分为多个学院(子网),如"01-计算机学院"、"02-理学院"。每个学院管理自己的学生。学号结构变为 学院编号+ 班级+ 学号(如 01123)。

  • 网络解决方案:将一个大的IP网络地址段划分成多个小的子网。例如,将 192.168.1.0/24这个网络划分为几个更小的子网。


关键角色类比

  • 学院(子网):就像一个独立的网络单元。学院内部的事务(如班级活动)只在学院内部进行,不会影响到其他学院。

  • 学生(主机):就是网络中的计算机,拥有唯一的IP地址(学号)。

  • 学生会主席(路由器):是连接不同学院(子网)的关键。张三(源主机)只需把信息交给本院主席(默认网关/路由器),主席负责将信息转发到其他学院(路由)。这样,通信被限制在必要的路径上,而不是广播给所有人。

学校是我们在上大学之前就已经设计好的,网络也是如此,那网络是被谁设计的呢?运营商!

所以为什么需要子网划分呢?

"未来找目标主机,先必须查找目标网络",这正是子网划分的核心价值:

  • 提高查找效率:在全校范围内找一个人(主机),如果直接遍历所有学生,效率极低。但若先根据"学院"(网络号)缩小范围,再在学院内找"学号",效率大幅提升。
  • 减少广播域:每个子网是一个独立的广播域,避免广播风暴。
  • 优化路由表:路由器只需知道目标子网(网络号),无需记录每台主机,节省资源。
  • 增强安全性与管理性:不同子网可独立配置安全策略、访问控制等。

查找目标网络,本质就是淘汰其他网络

所以路由报文,本质就是查找主机的问题,而查找的本质是淘汰的过程。


网络号: 标识一个逻辑网络。所有在同一物理网络下的设备,其IP地址的网络号部分必须相同。

主机号: 在同一个网络内部,唯一地标识一台特定主机。

  • 不同的子网其实就是把网络号相同的主机放到一起.
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一 致,但是主机号必须不能和子网中的其他主机重复.

路由器器至少要配两套IP,而且这两个IP地址必须位于不同的网段(即具有不同的网络号)。

我们电脑中的IP从哪来的?

我们电脑中的IP地址来源主要有两种方式:手动配置和自动获取。
手动配置(静态IP地址)

由网络管理员或用户手动设置固定的IP地址、子网掩码、网关和DNS服务器。这种方式适用于网络设备数量不多,且需要固定IP地址的场景,比如服务器、打印机等。

自动获取(动态IP地址)

大多数家庭网络和办公网络中的电脑、手机等设备通常通过动态主机配置协议(DHCP)自动获取IP地址。工作过程如下:

  • 当设备连接到网络时,它会广播一个DHCP发现(DHCP Discover)消息。

  • 网络中的DHCP服务器(通常集成在路由器中)收到发现消息后,会从地址池中选择一个可用的IP地址,并向该设备发送一个DHCP提供(DHCP Offer)消息。

  • 设备收到提供消息后,会发送一个DHCP请求(DHCP Request)消息,表示接受这个IP地址。

  • DHCP服务器收到请求后,发送一个DHCP确认(DHCP Acknowledge)消息,正式将IP地址分配给设备,并同时提供子网掩码、默认网关、DNS服务器等网络配置信息。

此外,如果设备无法通过DHCP获取IP地址(例如没有DHCP服务器),操作系统可能会自动分配一个169.254.x.x(IPv4)或fe80::(IPv6)的链路本地地址(Link-Local Address),这样设备只能在同一本地网络段内进行通信,无法连接互联网。


过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类,如下图所示(该图出自 [TCPIP])。

  • A类 0.0.0.0到127.255.255.255
  • B类 128.0.0.0到191.255.255.255
  • C类 192.0.0.0到223.255.255.255
  • D类 224.0.0.0到239.255.255.255
  • E类 240.0.0.0到247.255.255.255

子网划分的本质:把32位比特位进行划分,确定网络号有多少位

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址;

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

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

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个32位的正整数,通常用一串 "0" 来结尾;
  • 将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

例子1的详细解释

  • IP地址:140.252.20.68(十六进制:8C FC 14 44)

  • 子网掩码:255.255.255.0(十六进制:FF FF FF 00)

  • 网络号:140.252.20.0(十六进制:8C FC 14 00)

  • 子网地址范围:140.252.20.0到 140.252.20.255

思路:

网络号是通过将IP地址和子网掩码进行按位与(AND)操作得到的。例如:

  • IP地址 140.252.20.68的二进制:10001100.11111100.00010100.01000100

  • 子网掩码 255.255.255.0的二进制:11111111.11111111.11111111.00000000

  • AND操作后:10001100.11111100.00010100.00000000,即 140.252.20.0。

子网地址范围由网络号确定:网络号是子网的起始地址,结束地址是网络号加上主机位全1(本例中主机位为8位,所以范围是256个地址,但第一个地址为网络号,最后一个为广播地址)。

例子2的详细解释

  • IP地址:140.252.20.68(十六进制:8C FC 14 44)

  • 子网掩码:255.255.255.240(十六进制:FF FF FF F0)

  • 网络号:140.252.20.64(十六进制:8C FC 14 40)

  • 子网地址范围:140.252.20.64到 140.252.20.79

思路:

  • 子网掩码 255.255.255.240的二进制为 11111111.11111111.11111111.11110000,表示前28位是网络位,后4位是主机位。

  • 按位与操作:

    • IP地址二进制:10001100.11111100.00010100.01000100

    • 子网掩码二进制:11111111.11111111.11111111.11110000

    • AND操作后:10001100.11111100.00010100.01000000,即 140.252.20.64。

  • 子网地址范围计算:主机位有4位,所以每个子网有 2^4 =16个地址。网络号是 140.252.20.64,结束地址是网络号加15(因为从0到15),即 140.252.20.79。

子网划分通过调整子网掩码来分割IP地址空间,从而创建更小的子网。


2.4 特殊的IP地址

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

当一台计算机需要发送一个数据包时,系统会首先判断这个数据包的目的地是否就是本机自身。如果是,则数据包不会进入物理网络,而是通过"环回"机制直接交给本机的接收程序处理。

环回设备的作用:它是一个虚拟的网络接口,用于实现本机内部进程间的网络通信。它使得访问本机服务(如localhost或127.0.0.1)就像访问远程服务器一样,无需经过物理网络,从而更加高效和安全。


2.5 IP地址的数量限制

我们知道,IP地址(IPv4)是一个4字节32位的正整数,那么一共只有 2的32次方 个IP地址,大概是43亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址.

这意味着,一共只有43亿台主机能接入网络么?

实际上,由于一些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址.

CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加), 仍然不是很够用,这时候有三种方式来解决:

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中, 得到的IP地址不一定是相同的;
  • NAT技术:允许一个局域网内的多个设备共享一个公网IP地址,通过端口映射来区分不同的设备。(后面会重点介绍);
  • IPv6:IPv6并不是IPv4的简单升级版,这是互不相干的两个协议,彼此并不兼容;IPv6用16字节128位来表示一个IP地址;但是目前IPv6还没有普及;

另外,IPv6是根本的解决方案,它提供了几乎无限的地址空间(2^128个地址),但由于兼容性、成本和技术迁移的难度,目前仍在逐步推广中。


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

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址

包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP);

公网 : 内网(子网/局域网) = 1 :n,即一个公网IP对应多个内网设备。

私有IP地址的作用

私有IP地址是专用于局域网(LAN)或内部网络的地址,由RFC 1918定义,目的是:

  • 节省公网IP资源:全球IPv4地址有限,通过私有地址可以在内部网络中大量使用,而无需每个设备都申请一个公网IP。
  • 提高安全性:私有IP地址不被路由到互联网,外部无法直接访问内网设备,形成天然防火墙。

为什么私有IP不能出现在公网上?

核心原因:路由不可达 + 回程路径缺失

当一个数据包从内网设备发出,其源IP是私有IP(如 192.168.1.100),目标IP是公网IP(如 8.8.8.8),这个数据包会被发送到 网关 (通常是路由器)‍ 。路由器会执行 NATNetwork Address Translation,网络地址转换)‍:

  • 将源IP替换为公网IP(如 203.0.113.5);
  • 同时记录映射关系(如 192.168.1.100:50000 → 203.0.113.5:60000);
  • 将数据包发往公网。

此时,公网上的服务器收到请求后,会将响应发送回 203.0.113.5:60000。路由器接收到该响应后,根据NAT表将目标IP还原为 192.168.1.100:50000,并转发给内网设备。

如果私有IP直接出现在公网上会发生什么?

假设某台设备使用私有IP 192.168.1.100 直接向公网发送数据包:

  • 公网路由器不会知道如何处理这个地址------因为没有全局路由条目指向 192.168.1.100;
  • 更重要的是,即使数据包能到达某个路由器,它也无法返回,因为回程路径上没有任何设备知道 192.168.1.100 是谁,也没有NAT表可以做反向转换。

⚠️ 这就是"因为回不来!!!"的原因。

📌 总结:私有IP地址不是全球唯一的,也不被公网路由器识别,因此不能直接用于公网通信。

我们普通人接触的是"内网"

"我们任何普通人,直接接触的,根本不是公网,我们直接接触的是,都是内网,局域网、子网"。

  • 我们家里的电脑、手机、路由器等都处于一个内网中,它们之间通信用的是私有IP(如 192.168.x.x);
  • 当需要访问互联网时,通过路由器进行NAT转换,使用公网IP与外部通信;
  • 外部访问我们的设备时,也必须通过公网IP + 端口映射(如端口转发)才能实现。
  • 一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP).
  • 路由器LAN口连接的主机,都从属于当前这个路由器的子网中.
  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了.
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了.
  • 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP,这种技术称为NAT(Network Address Translation,网络地址转换).
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买.

地区或者国家IP的分布:https://zh-hans.ipshu.com/country-list

网络结构分层解析

整个网络可以分为三个清晰的层级:

  1. 互联网(公网)
  • 设备:一台服务器。

  • IP地址:122.77.241.3/24。这是一个公网IP地址,全球唯一,可以直接在互联网上被访问。

  1. 运营商网络(内网)
  • 设备:两个运营商路由器(可能代表不同的ISP,如电信和联通)。

  • IP地址:

    • WAN口:连接互联网的公网IP(图中未具体标明,但逻辑上存在)。

    • LAN口:10.1.1.1/24。这是一个私有IP地址段(A类私有地址),用于运营商内部网络。运营商通过NAT技术,让整个内网用户共享一个或几个公网IP出口。

  1. 家庭/本地网络(内网)
  • 设备:多个家用路由器,每个路由器下连接两台电脑。

  • IP地址:

    • WAN口:例如 10.1.1.2。这个地址是从运营商路由器(10.1.1.1)通过DHCP获取的,属于运营商内网地址。

    • LAN口:192.168.1.1/24。这是另一个私有IP地址段(C类私有地址),用于家庭或小型局域网。

    • 电脑:192.168.1.200/24和 192.168.1.201/24。这些地址由家庭路由器分配,属于家庭内网地址。

关键技术与概念

  1. 多层NAT(网络地址转换):
  • 这是本图最重要的知识点。当家庭网络中的电脑(192.168.1.200)访问互联网服务器(122.77.241.3)时,IP地址会经历两次转换:

    • 第一次NAT(在家庭路由器):将电脑的私有IP(192.168.1.200)转换为运营商内网IP(10.1.1.2)。

    • 第二次NAT(在运营商路由器):将运营商内网IP(10.1.1.2)转换为公网IP(即运营商路由器的WAN口地址)。

  • 服务器看到的请求源IP是运营商路由器的公网IP,从而实现了"隐藏"内部网络结构、节约公网IP地址的目的。

  1. 私有IP地址段:
  • 图中使用了两个标准的私有地址段:10.0.0.0/8和 192.168.0.0/16。这些地址不能在互联网上直接路由,只能在私有网络内部使用。
  1. 路由:
  • 箭头指示了数据流的可能路径。数据包根据目的IP地址,通过路由器进行层层转发。

举例说明通信过程

  1. 假设左下角IP为 192.168.1.200的电脑要访问服务器 122.77.241.3:

  2. 电脑将数据包发送给它的网关------家庭路由器(192.168.1.1)。

  3. 家庭路由器进行SNAT(源地址转换),将数据包源IP从 192.168.1.200改为自己的WAN口IP 10.1.1.2,然后发给运营商路由器(10.1.1.1)。

  4. 运营商路由器再次进行SNAT,将数据包源IP从 10.1.1.2改为自己的公网IP,然后发往互联网上的服务器。

  5. 服务器回复的数据包目的IP是运营商路由器的公网IP。

  6. 运营商路由器根据NAT会话表,将数据包目的IP改回 10.1.1.2,并转发给家庭路由器。

  7. 家庭路由器再次根据NAT会话表,将数据包目的IP改回 192.168.1.200,并转发给电脑。


2.7 尝试理解公网

真实的网络结构非常复杂,即涉及到划分公网IP的组织,ICANN,还要在全球范围内进行区域划分,比如亚太,北美,欧洲等,又要考虑各个国家内部的ISP代理,整体拓扑非常复杂,我们简化所有过程,简单理解公网即可

运营商的角色

如果把互联网比作一个庞大的数字国家,那么运营商就是它的基础设施建造者、道路规划者、交通管理者和"户籍"管理部门。

他们远不止是"拉网线"那么简单。以下是运营商扮演的四个关键角色:

  1. 物理网络的建设与维护者(筑路者)
  • 铺设"信息高速公路":负责建设和维护骨干光缆、蜂窝基站(4G/5G)、海底电缆、数据中心等物理基础设施。

  • 提供"最后一公里"接入:将网络从骨干节点延伸到每个家庭、企业和移动终端。您家的光纤、网线、Wi-Fi信号,最终都连接到了运营商的本地接入机房。

  1. IP地址的分配与管理机构(户籍官)
  • 公网IP资源的持有者和分配者:运营商从全球IP地址管理机构(如APNIC)批量获取公网IP地址池。

  • 向用户分配IP:当您开通宽带或使用移动数据时,运营商的DHCP服务器会为您的路由器WAN口或手机分配一个公网IP(或经过运营商级NAT转换的地址)。您家庭网络的那个公网IP,就是运营商"发放"的临时身份证。

  1. 互联网路由的核心枢纽(交通总局)
  • 运行自治系统(AS):每个大型运营商都有一个或多个唯一的AS编号。他们通过 BGP 协议,与其他运营商的AS交换全球路由信息,共同绘制出互联网的"全球地图"。

  • 决定数据包的跨国、跨省路径:当您访问一个国外网站时,数据包如何从您家出发,经过哪些运营商网络(中国电信 -> 德国电信),最终到达目标服务器,这个路径主要由运营商之间的路由协议协商决定。

  1. 网络服务的提供与管理者(综合服务商)
  • 提供连接服务:销售宽带、移动数据、专线等接入服务。

  • 实施网络管理:

    • QoS(服务质量):保障关键业务(如语音、视频)的流畅。

    • 安全防护:在网络入口设置防火墙,过滤部分网络攻击。

    • 策略管理:依法进行内容管理。

  • 运营支撑系统:计费、认证、用户管理(决定您能否上网、用了多少流量)。


公网的理解

公网(Public Network)是指面向全球开放、可被互联网任意节点访问的网络空间。公网IP(Public IP Address)是分配给网络设备、服务器或服务的全球唯一标识符,用于在互联网上进行通信。

公网IP由国际组织(如IANA)统一分配给区域互联网注册管理机构(RIRs),例如:

  • APNIC(亚太地区)
  • ARIN(北美)
  • RIPE NCC(欧洲、中东、中亚)
  • LACNIC(拉丁美洲和加勒比海)
  • AFRINIC(非洲)

这些RIRs再将IP地址块分配给国家或地区或地区的ISP(互联网服务提供商)或大型企业。

注意:

  • ICANN:协调全球DNS根服务器、IP地址分配和政策制定。

  • RIRs:根据ICANN的政策,在本区域内分配IP地址块给ISP和其他组织。

  • 域名注册商:向公众提供域名注册服务(需获得ICANN认证)。

✅ 因此,分配不是以"国家"为单位,而是以"地区"为单位,再结合实际需求(如网民数量、业务规模)进行分配。

各国运营商向所在地区的RIR申请公网IP资源:

  • 用于搭建公共网络基础设施(如骨干网、数据中心、CDN等)。
  • 用于为用户提供可访问互联网的服务(如家庭宽带、企业专线)。

一个地区或国家或地区的网络能力(如可承载的网站数量、云服务规模、物联网设备连接数)直接受限于其拥有的公网IP地址池大小。

例如:

  • 中国拥有大量公网IP(主要通过APNIC申请),支撑了庞大的互联网生态。
  • 某些小国或地区因IP资源有限,可能需依赖NAT(网络地址转换)技术,导致大量内网设备共用少量公网IP。

注意:但我们下面为了方便理解和讲解,就简单认为公网IP以国家分配。


核心架构:分层与互联

整个网络可以划分为几个清晰的层级,体现了网络设计中的"分级汇聚"原则:

  1. 国际骨干层(核心层)
  • 节点:图中顶部的俄罗斯、美国等国家的网络模块。

  • 作用:这是网络的最高层级,负责跨国、跨洲的高速数据交换和互联互通。可以理解为网络的"中枢"或"主干道"。

  1. 国内骨干层(汇聚层)
  • 节点:图中的陕西、河南等省份节点。

  • 作用:承接来自国际骨干层的数据,并在国内各个主要区域之间进行数据汇聚和转发。这一层负责将流量有效地分发到更具体的区域。

  1. 省内/区域层(接入层)
  • 节点:虽然图中未明确标出市级节点,但根据层级排版逻辑,在省份节点之下应有市级或园区级的接入节点。

  • 作用:作为网络的"最后一公里",直接连接最终用户(如企业分支机构、办公室、数据中心等)。

IP地址规划详解

  1. 国家层:首8位作为国家或地区网络号(/8)‍

示例:

  • 中国:5.0.0.0/8
  • 美国:2.0.0.0/8
  • 俄罗斯:1.0.0.0/8
  • 英国:3.0.0.0/8
  • 法国:4.0.0.0/8
  • 意大利:6.0.0.0/8

✅ 意义:每个国家拥有一个独立的 /8 网段(约1677万IP),用于标识其国家级骨干网络。这是国际层面的路由基础。

  1. 省级层:次8位作为省网络号(/16)‍

在中国 5.0.0.0/8 基础上,再划分子网:

  • 陕西:5.1.0.0/16
  • 河南:5.2.0.0/16
  • 浙江:5.3.0.0/16
  • 吉林:5.4.0.0/16
  • 河北:5.5.0.0/16

✅ 意义:每个省获得一个 /16 子网(约6.5万IP),构成"国内骨干网"的一部分,省际路由器通过BGP交换路由信息。

  1. 市级层:再细分4位(/20)‍

以陕西为例:5.1.0.0/16 可再划分为多个市级子网:

  • 西安:5.1.16.0/20 (即 5.1.16.0 ~ 5.1.31.255)
  • 延安:5.1.32.0/20
  • 咸阳:5.1.64.0/20

✅ 意义:每个城市分配一个 /20 子网(约4096个IP),满足城市级网络需求,同时避免IP浪费。

  1. 企业/本地网络层:使用私有IP(内网)‍

例如西安本地网络:

  • WAN口(对外):5.1.16.1/20 (连接省级骨干网)
  • LAN口(对内):10.1.1.1/24 (公司内部网络)

✅ 关键点:

  • 公网IP唯一:每个子网的WAN口IP必须全球唯一。
  • 内网IP可复用:不同城市的LAN可以都用 10.1.1.1/24,互不影响。
  • NAT机制:出口路由器通过NAT将内部私有IP转换为公网IP,实现访问互联网。

路由原理与路径选择

  1. BGP协议作用
  • 在国际和国内骨干网中,路由器通过BGP动态学习路由表。
  • BGP是路径向量协议,考虑AS路径、策略等,选择最优路径。
  1. 路由表结构示例(以中国节点为例)‍
网络地址 子网掩码 下一跳地址 说明
1.0.0.0 255.0.0.0 1.0.0.1 俄罗斯
2.0.0.0 255.0.0.0 2.0.0.1 美国
3.0.0.0 255.0.0.0 3.0.0.1 英国
4.0.0.0 255.0.0.0 4.0.0.1 法国
5.0.0.0 255.0.0.0 5.0.0.1 中国(自己)
5.1.0.0 255.255.0.0 5.1.0.1 陕西
5.1.16.0 255.255.240.0 5.1.16.1 西安

✅ 路径查找逻辑:

报文到达中国路由器 → 查找目标IP属于哪个子网 → 转发至下一跳。

问题1:俄罗斯访问目标地址 5.1.16.X 的路径

✅ 具体步骤:

  1. 俄罗斯路由器查表:5.1.16.X 属于中国(5.0.0.0/8),下一跳指向中国骨干网入口。
  2. 中国骨干网查表:5.1.16.X 属于陕西(5.1.0.0/16),下一跳指向陕西路由器。
  3. 陕西路由器查表:5.1.16.X 属于西安(5.1.16.0/20),下一跳指向西安出口路由器。
  4. 西安路由器接收后,根据内部路由(如ARP)转发至目标主机。

问题2:河北报文如何发送至 5.1.16.X

✅ 具体步骤:

  1. 河北路由器查表:5.1.16.X 属于陕西(5.1.0.0/16),下一跳指向国内骨干网。
  2. 国内骨干网路由器根据BGP路由,将报文转发至陕西方向。
  3. 陕西路由器查表,发现目标在西安(5.1.16.0/20),转发至西安出口。
  4. 西安本地路由器完成最终交付。

2.8 路由

在复杂的网络结构中,找出一条通往终点的路线;

路由的过程,就是这样一跳一跳(Hop by Hop) "问路" 的过程.

所谓 "一跳" 就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.

IP数据包的传输过程也和问路一样.

  • 当IP数据包,到达路由器时,路由器会先查看目的IP;
  • 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器;
  • 依次反复,一直到达目标IP地址;

那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

  • 路由表可以使用route命令查看
  • 如果目的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路由器根据它的路由表决定下一跳地址;

3. IP分片和组装的具体过程

第二行(32位/4字节) - 分片相关字段

这一行的三个字段共同用于处理数据包的 分片 ​ 和 重组。当一个大的数据包要经过一个最大传输单元较小的网络时(如以太网的MTU通常是1500字节),路由器需要将它分割成多个更小的"分片"。

  • 16位标识

    • 作用:唯一标识一个原始数据包的所有分片。

    • 详解:发送主机为每个要发送的数据包生成一个唯一的标识符。如果这个数据包被分片,那么所有属于它的分片都拥有相同的标识值。接收方根据这个标识符和源IP地址,就能判断哪些分片是属于同一个原始数据包的,从而正确地重组它们。

  • 3位标志

    • 作用:控制数据包的分片行为。

    • 详解:目前只使用了2位:

      • 第一位(最高位):保留,必须为0。

      • 第二位(DF位 - Don't Fragment):为1时表示"禁止分片"。如果数据包长度超过路径上的MTU,路由器会丢弃它,并返回一个ICMP错误消息。

      • 第三位(MF位 - More Fragments):为1时表示"还有更多分片",即这个分片不是原始数据包的最后一个分片。为0时,表示这是最后一个分片。

  • 13位片偏移

    • 作用:指示当前分片在原始数据包中的位置。

    • 详解:单位是8字节。例如,如果一个分片的片偏移量为0,表示它承载着原始数据包从第0字节开始的数据。如果偏移量为100,则表示它从原始数据包的第800字节(100*8)开始。接收方根据这个偏移量就可以像拼图一样把分片按正确顺序组装起来。

3.1 分片

为什么需要分片?

当一个IP数据报的大小超过了网络的MTU(最大传输单元)限制时,就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据长度。

例如,以太网MTU通常为1500字节(含IP头),若IP数据报长度为1550字节,则需分片。

注意:分片发生在发送端或中间路由器,重组只在接收端进行。

分片带来的核心问题

任何一个分片丢失,都表示该报文整体丢失!!!

  • 高丢包率:​ 假设一个报文被分成10片,每个分片有5%的独立丢失概率,那么整个报文成功送达的概率会急剧下降。结论:"如果过多分片,就会导致丢包率!"

  • 性能低下:​ 即使只丢失一个分片,整个原始报文的所有分片都需要重传,效率非常低。

分片不是主流,被逼为之

如何减少分片?

减少分片的本质,在哪一层?传输层!!!

解决方案:MSS(最大报文段长度)

MSS是TCP层的概念,它定义了TCP一次能发送的最大数据块大小。

TCP在三次握手时会协商双方的MSS值。理想的MSS值应为:MSS = MTU - IP首部(20) - TCP首部(20) = 1460字节(对于标准以太网)。

通过设置合适的MSS,TCP可以保证它交给IP层的报文,即使加上IP首部,总长度也不会超过MTU。这样,IP层就完全不需要进行分片了。

另外,滑动窗口是TCP的流量控制机制,它允许发送方在没有收到确认的情况下连续发送多个TCP段。这些TCP段的大小由MSS决定,所以它们不会导致IP分片。如果TCP不进行分段,而是发送非常大的数据块,那么这些数据块在IP层就很可能被分片,从而带来上述问题。

因此,TCP分段(分成一段一段的)和滑动窗口机制是相辅相成的:

  • 分段是为了避免IP分片,将数据分成适合网络传输的块(每个块不超过MSS)。每个TCP段是独立的、有序列号和确认机制的。丢失后只需重传丢失的段。

  • 滑动窗口则允许发送方连续发送多个段,提高网络利用率,而不必每发送一个段就等待一个确认。

TCP之所以要分段,本质是为了将"何时分片、如何分片"的控制权掌握在自己手中,而不是交给不可控的IP层。

如何分片

  1. 检查MTU限制:
  • 当一个IP数据报的大小超过了网络的MTU(最大传输单元)限制时,就需要进行分片。
  1. 分割数据报:
  • IP层将原始的IP数据报分割成多个较小的片段。
  • 对于每个片段,IP层会设置相应的标识(Identification)偏移量(Fragment Offset)标志位(Flags) 等字段。
  • 标识字段用于标识属于同一个数据报的不同分片,确保所有分片能够被正确地重新组装。
  • 偏移量字段指示了当前分片相对于原始数据报的起始位置,以8字节为单位。
  • 标志位字段包含了3个位,其中 MF(More Fragment) 位用于指示是否还有更多的分片,DF(Do Not Fragment) 位用于指示数据报是否允许进行分片。
  1. 添加IP头部:
  • 每个分片都会加上自己的IP头部,与完整IP报文拥有类似的IP头结构,但 MFFragment Offset 等字段的值会有所不同。
  1. 发送分片:
  • 分片在传输过程中独立传输,每个分片都有自己的IP头部,并且各自独立地选择路由。

3.2 组装

接收方如何判断一个数据报是否被分片?

依据"标志"字段中的MF位:

  • 如果 MF == 1 → 表示该分片后还有其他分片。
  • 如果 MF == 0 且 片偏移 > 0 → 表示这是最后一个分片。
  • 只有 MF == 0 且 片偏移 == 0 的报文,才是未经分片的完整报文。

如果 片偏移 != 0,则说明这个报文的数据部分在原始报文中的起始位置不是0,它肯定是一个分片(可能是中间或最后一个分片)。

简单总结:只要 MF位为1 或 片偏移不为0,接收方就知道当前收到的是一个分片。

同时,所有分片具有相同的"标识"字段(即16位标识字段),用于区分不同报文的分片。

接收方如何确认所有分片都已收到?

接收端通过以下步骤确认:

  1. 收集:​ 首先,接收方会根据IP头中的 "16位标识"​ 字段,将所有标识符相同的分片归为一组(因为同一个原始数据报的所有分片标识符相同)。

  2. 判断收全的关键:​ 等待并检查是否收到了 "更多分片位 MF = 0"​ 的那个分片(即最后一个分片)。

  3. 连续性检查:​ 收齐不仅仅是收到首尾,还要保证中间没有缺失。接收方会将所有分片按照 "13位片偏移"​ 进行排序,并检查数据是否连续。一个分片的结束位置可以通过 片偏移 * 8 + 当前分片长度计算得出,这个值应该等于下一个分片的片偏移起始位置。

如果出现以下三种情况之一,则表示没有收全,重组会失败:

  • 第一片丢失:​ 没有收到片偏移为0的分片。

  • 中间丢失:​ 排序后,某个分片的结束位置不等于下一个分片的起始位置。

  • 结尾丢失:​ 一直没有收到 MF=0的最后一个分片。

若某个分片丢失(如第一片或中间某片),则整个报文无法重组,会被丢弃。

接收方如何组合形成完整的报文?

  1. 分组:将属于同一原始报文的分片(标识符相同)归为一组。

  2. 排序:​ 将所有属于同一分组的分片,按照 "13位片偏移"​ 从小到大的顺序进行排序。

  3. 组装:​ 按排序后的顺序,将每个分片的数据部分拼接起来。IP首部只在第一个分片(片偏移为0的那个)中有用,其他分片的IP首部在重组时会被丢弃,但需要修改总长度为原始数据报的总长度,并清除分片相关的标志(MF和分片偏移)。

  4. 上交:​ 组装完成后,就恢复了原始的、完整的IP数据报,然后将其交付给上层协议(如TCP或UDP)进行处理。


3.3 分片组装场景



假设在IP层,有一个大小为3000字节的报文,如何分片?如何组装呢?

IP数据报的分片过程

IP分片的核心,是依靠IP头部中的三个字段来协同工作:16位标识、3位标志、13位片偏移。

  • 16位标识:如同身份证号,同一个原始数据报的所有分片都拥有相同的标识符,这样接收方才能知道哪些分片是一家人。

  • 3位标志:其中最关键的是MF位。MF=1表示"还有更多分片",MF=0则表示"这是最后一个分片"。此外还有DF位,若DF=1则表示该报文禁止分片。

  • 13位片偏移:指明当前分片的数据在原始数据报中的起始位置。其基本单位是8字节。因此,每个分片的数据长度(除最后一个外)都必须是8字节的倍数。

对于一个总长度为3000字节(其中IP头部20字节,数据部分2980字节)的报文,在MTU为1500字节的链路上分片后,每个分片的情况如下表所示:

分片 总长度 (字节) 数据长度 (字节) MF 标志 片偏移 偏移量计算 (字节)
1 1500 1480 1 0 0 × 8 = 0
2 1500 1480 1 185 185 × 8 = 1480
3 40 20 0 370 370 × 8 = 2960

具体分片步骤如下:

  • 第一次分片:取出前1480字节数据,加上20字节的新IP头部,构成第一个分片(总长1500字节)。由于其后方还有数据,故设置MF=1;它是起始分片,故片偏移=0。

  • 第二次分片:继续取出1480字节数据,同样构成一个1500字节的分片。此时后方仍有数据,故MF仍为1。其数据起始位置是1480字节,除以8得到片偏移=185。

  • 第三次分片:剩余数据为2980 - 1480 - 1480 = 20字节,加上20字节IP头部,总长40字节。这是最后的分片,故MF=0。其数据起始位置是2960字节,除以8得到片偏移=370。

每个分片都将作为一个独立的数据报进行传输,它们可能经由不同的路径到达目的地。

接收端的分片组装

接收端的IP层负责将这些"碎片"重新拼凑完整,其过程如下:

  1. 识别分片:当收到一个IP数据报,接收方会检查MF标志和片偏移。

    • 如果 MF=1,说明这是一个分片且后面还有。

    • 如果 MF=0 但片偏移 > 0,说明这是最后一个分片。

    • 只有 MF=0 且片偏移=0 的报文才是未分片的完整报文。

  2. 分组与排序:接收方通过16位标识字段,将所有标识相同的分片归为一组。然后,按照片偏移从小到大的顺序进行排序。

  3. 判断是否收全:这是组装的关键。接收方需要确保:

    • 首片未丢:存在片偏移为0的分片。

    • 中间无丢失:将分片排序后,检查每个分片的"结束位置"(其片偏移×8 + 本分片数据长度)是否等于下一个分片的片偏移×8。若相等,则中间无缺失。

    • 尾片收到:存在MF=0的最后一个分片。

  4. 数据重组:当确认所有分片均已到达后,接收方会依照排序后的顺序,将每个分片的数据部分(去掉IP头部)拼接起来,还原出原始的、长度为3000字节的完整IP数据报,然后上交传输层处理。若在重组计时器超时前仍有分片未到达,接收方将丢弃所有已收到的该数据报的分片。上层协议(如TCP)会触发整个数据报的重传。

相关推荐
Evan芙1 小时前
Rocky Linux 9 双网卡 bond0 绑定
linux·服务器·网络
哈里谢顿1 小时前
使用tcp协议的常用端口号
tcp/ip
保持低旋律节奏1 小时前
linux——vim编辑器
linux·编辑器·vim
weixin_307779131 小时前
Jenkins Bootstrap 5 API插件:现代化Jenkins界面的开发利器
开发语言·前端·网络·bootstrap·jenkins
init_23611 小时前
【BGP入门专题-6】bgp联盟与路由优选规则
网络
-曾牛1 小时前
渗透测试信息收集全流程:从被动探测到主动挖掘
网络·安全·web安全·渗透测试·信息收集·原理解析·信息挖掘
Molesidy1 小时前
【Embedded Development】【TCP-IP】关于TCP-IP网络协议的学习记录以及基于TCP-IP网络协议的上层协议的初步理解
网络协议·学习·tcp/ip
麦麦鸡腿堡1 小时前
Java_网络上传文件与netstat指令
java·服务器·网络
python百炼成钢1 小时前
49.Linux音频驱动
android·linux·音视频
TangGeeA1 小时前
Linux CFS(完全公平调度器)全面总结
java·linux·服务器