IP协议——网络层协议

目录

一、宏观视角下的TCP与IP

二、IP报头与分片机制(⭐⭐⭐)

[1. 核心报头字段解析](#1. 核心报头字段解析)

[2. 分片机制深度学习(⭐⭐⭐)](#2. 分片机制深度学习(⭐⭐⭐))

[2.1 为什么要分片?](#2.1 为什么要分片?)

[2.2 接收方的拼装还原](#2.2 接收方的拼装还原)

[2.2.1 识别"同一个包裹"的碎片](#2.2.1 识别“同一个包裹”的碎片)

[2.2.2 分片的排序与重组逻辑](#2.2.2 分片的排序与重组逻辑)

[2.2.2.1 找到"火车头"(首片)](#2.2.2.1 找到“火车头”(首片))

[2.2.2.2 寻找"车厢"并无缝拼接(中间片)](#2.2.2.2 寻找“车厢”并无缝拼接(中间片))

[2.2.2.3 确认"车尾"(尾片)](#2.2.2.3 确认“车尾”(尾片))

[2.2.2.4 向上层交付](#2.2.2.4 向上层交付)

[2.3 异常处理机制(重组失败)](#2.3 异常处理机制(重组失败))

三、IP地址的演进

[1. 按类划分](#1. 按类划分)

[2. CIDR (无类别域间路由)](#2. CIDR (无类别域间路由))

[3. 私有IP与公网IP的诞生逻辑(⭐⭐⭐)](#3. 私有IP与公网IP的诞生逻辑(⭐⭐⭐))

[3.1 公网IP(外网IP)](#3.1 公网IP(外网IP))

[3.2 私有IP(内网IP)](#3.2 私有IP(内网IP))

[4. 解决IP耗尽的方案](#4. 解决IP耗尽的方案)

[4.1 动态分配IP (DHCP)](#4.1 动态分配IP (DHCP))

[4.2 NAT (网络地址转换) 技术 (⭐⭐⭐)](#4.2 NAT (网络地址转换) 技术 (⭐⭐⭐))

[4.2.1 NAT的基本原理](#4.2.1 NAT的基本原理)

[4.2.2 NAPT (网络地址端口转换)](#4.2.2 NAPT (网络地址端口转换))

[4.3 IPv6](#4.3 IPv6)

[4.3.1 地址容量](#4.3.1 地址容量)

[4.3.2 IPv6带来的技术变革](#4.3.2 IPv6带来的技术变革)

[4.3.3 为什么还没完全普及?](#4.3.3 为什么还没完全普及?)

五、路由器的工作原理与路由表

[1. 路由器的多重身份(⭐⭐⭐)](#1. 路由器的多重身份(⭐⭐⭐))

[2. 工作原理](#2. 工作原理)

六、扩展学习

[1. IP的按类划分](#1. IP的按类划分)

[1.1 A类地址:巨无霸网段](#1.1 A类地址:巨无霸网段)

[1.2 B类地址:中坚力量](#1.2 B类地址:中坚力量)

[1.3 C类地址:遍地开花](#1.3 C类地址:遍地开花)

[1.4 D类地址:特殊的群发机制](#1.4 D类地址:特殊的群发机制)

[1.5 E类地址:未来的预留](#1.5 E类地址:未来的预留)

[1.6 计算主机数都要减 2(⭐⭐⭐)](#1.6 计算主机数都要减 2(⭐⭐⭐))

[2. 路由算法简述](#2. 路由算法简述)

[2.1 静态路由](#2.1 静态路由)

[2.2 动态路由](#2.2 动态路由)

[2.2.1 距离矢量算法 (Distance Vector) ------ "道听途说的传话筒"](#2.2.1 距离矢量算法 (Distance Vector) —— “道听途说的传话筒”)

[2.2.2 链路状态算法 (Link State) ------ "人人手持GPS全局地图"](#2.2.2 链路状态算法 (Link State) —— “人人手持GPS全局地图”)

[2.3 BGP (边界网关协议)](#2.3 BGP (边界网关协议))


一、宏观视角下的TCP与IP

在网络传输中,TCP和IP总是形影不离,但它们的职责有着本质的区别。

  • TCP的作用是"提供可靠性策略":它像是一个在幕后统筹规划的高管,负责制定超时重传、流量控制、拥塞控制等策略,确保数据"安全、无误"地送达。

  • IP协议的作用是"执行跨网络的数据交付":它像是一个使命必达的快递员,负责将数据从主机A实际运送到主机B。它不管数据丢不丢(那是TCP的事),它只负责"尽力而为"地赶路。

为了完成交付,IP协议需要解决两个核心问题:

  1. 源IP和目标IP:必须明确数据从哪里来,要发给全网唯一的谁。

  2. 定位逻辑IP地址 = 目标网络号 + 目标主机号。IP协议会先根据"网络号"把数据送到目标所在的子网,再根据"主机号"在子网内找到具体的那台电脑。

二、IP报头与分片机制(⭐⭐⭐)

为了实现上述功能,IP协议会在数据的前面加上一个专属的"报头"(Header)。这个报头包含了快递的详细物流信息。

1. 核心报头字段解析

  • 4位首部长度 :规定了IP报头的大小。和TCP一样,IP报头也有选项字段。它的取值范围是 01011111(即5-15),单位是4字节,所以IP报头长度在 20 到 60 字节之间。

  • 4位版本号:指明IP协议的版本,对于目前广泛使用的IPv4,这个值就是4。

  • 8位服务类型 (TOS):其中4位用来表示请求的服务类型(最小延时、最大吞吐量、最高可靠性、最小成本)。这4个状态一般互相冲突,只能选其一。路由器在进行路径选择时,会参考这个字段来优化转发策略。

  • 16位总长度:表示整个IP报文(报头 + 有效载荷)的总字节数。

  • 8位生存时间 (TTL, Time To Live):防止迷路的报文在网络中无限循环。报文每经过一个路由器,TTL减1,减到0时该报文会被直接丢弃。网络中绝对不允许存在永远不消失的"游离报文"占用资源。

  • 8位协议:指明了IP的有效载荷应该交给上层的哪个协议(例如,值为6代表TCP,17代表UDP)。

  • 16位首部检验和:用于校验报头在传输过程中是否发生位反转等错误。

  • 32位源IP & 32位目的IP:报文中最重要的信息,决定了数据包的路径选择。

2. 分片机制深度学习(⭐⭐⭐)

在报头中,有三个字段专门为分片服务:16位标识3位标志13位片偏移

  • 16位标识:同一个大报文切出来的所有小片,标识号是一样的。

  • 3位标志 :其中有一位叫 MF (More Fragments),如果为1,说明后面还有分片;为0说明这是最后一片。

  • 13位片偏移:记录当前这个小片在原始大报文中的相对位置,确保接收端能按正确顺序拼接。

2.1 为什么要分片?

IP报文在网络层组装好后,并不能直接飞跃网线,而是必须继续向下交给数据链路层 (如MAC帧)。而数据链路层有**最大传输单元(MTU)**的限制(以太网通常是1500字节)。 如果网络层丢下来的IP报文比MTU大,数据链路层就会"咽不下去"。此时,IP层就必须将这个大报文切分成多个小片段,分别加上IP报头发送。接收端的IP层收到这些碎片后,再利用上述三个字段把它们重新拼装还原。

2.2 接收方的拼装还原

2.2.1 识别"同一个包裹"的碎片

IP协议首先要解决的问题是:分别哪些碎片是属于同一个原始大报文。

答案是提取四个核心维度的信息进行匹配:

(1)源IP地址 (2)目的IP地址

(3)8位协议 (比如都是交给TCP的)(4)16位标识(Identification)

只要这四个字段完全一致,接收方就可以100%确定:这些碎片来自于同一个被切割的原始大报文。接收方会在内存中为这个标识号开辟一个"重组缓冲区",把属于它的碎片都先暂存进来。

2.2.2 分片的排序与重组逻辑

接收方必须依靠 片偏移(Fragment Offset)标志位(Flags) 来排序。

2.2.2.1 找到"火车头"(首片)

接收方会在缓冲区里寻找一个特殊的碎片:它的 片偏移量必须为 0

偏移量为0,意味着这是原始报文的第一个切片。它包含了完整的、最原始的IP层以上的报头(比如TCP/UDP报头)。

2.2.2.2 寻找"车厢"并无缝拼接(中间片)

找到首片后,接收方通过计算首片中有效载荷的长度(总长度 - 报头长度),就能知道下一个碎片应该从哪里开始拼接。

  • 注意一个细节 :13位片偏移的单位是 8字节

  • 假设首片的有效载荷是 1400 字节。那么下一个碎片的片偏移字段值就必须是 1400 / 8 = 175

  • 接收方通过不断对比:当前碎片的偏移量 == 前一个碎片的偏移量 + (前一个碎片的有效载荷长度 / 8),将后面乱序到达的碎片像拉链一样严丝合缝地扣在一起。

2.2.2.3 确认"车尾"(尾片)

接收方通过3位标志 中的 MF (More Fragments) 来判断是否全部集齐 。

  • 只要碎片的 MF = 1,说明后面还有分片,继续等。

  • 当收到一个 MF = 0 的碎片时,接收方就知道:"这就是最后一块拼图了!"

  • 如果从偏移量为0的首片,一直到 MF=0 的尾片,中间的偏移量全部能无缝衔接,没有任何空隙,就宣告重组成功

2.2.2.4 向上层交付

重组成功后,接收方会剥离掉所有后续碎片的IP报头,只保留首片的IP报头。然后修改首片IP报头的"总长度"字段,清除"分片标识"和"偏移量",恢复成它被切割前的样子,最后根据"8位协议"字段,将完整的数据载荷潇洒地交给上一层(如TCP/UDP)。

2.3 异常处理机制(重组失败)

在真实的工程实现中,必须考虑网络丢包的情况。如果一个原始报文被切成了5片,其中第3片在网络中丢失了,接收方的做法。

  1. 重组定时器(Reassembly Timer):当接收方收到第一个分片(不一定是首片,只要是这组分片的任意一个)时,就会启动一个定时器。

  2. 超时丢弃 :如果在定时器超时之前,没有收齐所有的分片(比如一直等不到偏移量能填补空缺的那个片),IP层会极其果断地将目前收集到的所有属于该报文的分片全部丢弃!

  3. 不负责重传 :IP协议只提供"尽力而为"的服务,它没有重传机制

这引发了一个极其重要的网络性能问题:分片的代价是昂贵的! 只要有一个小分片丢失,整个巨大的IP报文就彻底作废,接收方全部丢弃。这会导致上层的TCP协议迟迟收不到确认,最终触发TCP的超时重传,把整个大报文重新发一遍(然后再次面临分片和丢包的风险)。所以在实际开发中,TCP协议会竭尽全力避免IP层进行分片!

三、IP地址的演进

IP地址本质上是一种有限的数字资源(IPv4总量约43亿)。如何分配这些资源,经历过一次巨大的变革。

1. 按类划分

早期,IP地址被简单粗暴地分为 A、B、C、D、E 五类。例如A类地址网络号只有8位,主机号高达24位,能容纳上千万台主机。 弊端:极度浪费。一个公司如果申请了B类地址,即使只有几百台电脑,也会独占6万多个IP,导致其他急需IP的人无址可用。

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

为了缓解浪费,引入了 32位子网掩码 (Subnet Mask)

  • 现在的模式是:IP地址 + 子网掩码

  • 子网掩码中连续为 1 的部分代表网络号,连续为 0 的部分代表主机号。

  • 这样就可以打破原有的ABC类限制,灵活地按需划分网段大小。这就好比原本只能论"栋"卖楼,现在可以按"平米"精确切割了。

3. 私有IP与公网IP的诞生逻辑(⭐⭐⭐)

在早期,每一台接入互联网的设备都渴望拥有一个全球唯一的IP地址。但IP地址有限,为了省着点用,规定了"内外有别"的策略。

3.1 公网IP(外网IP)

  • 定位:互联网上的"真实身份",全球唯一。

  • 特性:能在互联网的骨干路由器上被识别和转发。如果把互联网比作全球快递网,公网IP就是能在全球地图上查到的精确地址(如某市某街道某号)。需要向运营商(ISP)花钱申请。

3.2 私有IP(内网IP)

为了让局域网内部也能通信,RFC 1918 专门划出了几段特殊的IP地址,供大家免费在内部使用。

  • 常见私有网段

    • 10.0.0.0 - 10.255.255.255 (大型企业常用)

    • 172.16.0.0 - 172.31.255.255 (Docker等虚拟化常用)

    • 192.168.0.0 - 192.168.255.255 (家庭路由器最常见)

  • 核心规则私有IP绝对不允许出现在公网的路由表中! 一旦运营商的路由器看到目标地址是私有IP,会直接丢弃。

  • 特性 :因为上不了公网,所以私有IP可以在不同的局域网中重复使用 。你家电脑可以是 192.168.1.100,我家电脑也可以是它,只要不在同一个局域网内就不会冲突。

4. 解决IP耗尽的方案

4.1 动态分配IP (DHCP)

即使划分了私有IP,很多时候公网IP还是不够分。这时候,DHCP 就站了出来。

核心思想:时间复用,谁上网给谁用,不上网就收回。

工作机制:DHCP本质是一个自动分配IP地址的服务。当你拿着手机连上WiFi,或者把网线插上电脑时,你的设备会向局域网大喊一声:"谁能给我一个IP?"(DHCP Discover)。路由器上的DHCP服务器听到后,就会从地址池里"租"给你一个IP(包含子网掩码、网关、DNS等信息),租期到了或者你断网了,这个IP就会被回收,分配给下一个接入的人。

4.2 NAT (网络地址转换) 技术 (⭐⭐⭐)

4.2.1 NAT的基本原理

当内网主机(私有IP)向公网发送数据包时,作为网关的路由器,会把数据包IP报头中的"源IP(私有IP)"替换成路由器自己的"WAN口IP(公网IP)",然后再发出去。服务器回包时,路由器再把目标IP从"公网IP"替换回内网的"私有IP"。

4.2.2 NAPT (网络地址端口转换)

如果局域网里有10台电脑同时访问百度,百度把数据返回给路由器的公网IP时,路由器怎么知道这数据该还给内网的哪台电脑呢?这就需要结合传输层的端口号(Port) 来做区分,这就是 NAPT(Network Address Port Translation)

完整的工作流程(以实际数据包为例):

  1. 出发 :内网主机A(192.168.1.100)用端口 5555 向百度发请求。
  2. 转换 :报文到达路由器。路由器将其修改为:源IP为路由器的公网IP(例如 203.0.113.5),并且分配一个新的端口(例如 10001)。
  3. 记录 :路由器在自己的NAT映射表 里记下一笔:192.168.1.100:5555 <---> 203.0.113.5:10001
  4. 回应 :百度收到请求,以为是 203.0.113.5 发来的,于是把网页数据回传给这个公网IP的 10001 端口。
  5. 反转 :路由器收到数据,查阅刚才的NAT表,发现 10001 端口对应的是内网的主机A。于是把目标IP修改回 192.168.1.100:5555,成功交还给主机A。

意义:通过NAPT,一个公网IP可以利用其65535个端口,理论上让内网数万台设备同时共享这一个公网IP上网。

4.3 IPv6

NAT虽然好用,但它打破了互联网最初设计的"端到端通信"理念 。因为内网主机躲在路由器后面,外网无法直接主动发起连接 去寻找内网主机(这也导致了早期的P2P下载、联机游戏常常遇到"NAT穿透"的难题)。为了彻底解决地址不够和NAT带来的副作用,IPv6 诞生了。

4.3.1 地址容量

IPv4地址是32位,而IPv6直接将地址长度扩展到了128位 。 它的容量高达 个。网络界有一句名言:"IPv6可以给地球上的每一粒沙子都分配一个IP地址。"

4.3.2 IPv6带来的技术变革

一旦IP地址不再稀缺,之前的很多妥协都可以被抛弃:

  • 消灭NAT:不再需要复杂的内外网转换,每一台手机、每一台智能电视都可以拥有真正的公网IP,实现真正的"万物互联"和端到端直接通信。
  • 内建安全性 :IPv6在设计之初就考虑了安全,原生支持IPsec,让数据在网络层的传输自带加密和身份认证
  • 更高效的路由:IPv6简化了报头结构(去掉了IPv4中一些不常用、需要路由器额外计算的字段,比如去掉了头部校验和分片机制的大修),让路由器的转发速度更快。
4.3.3 为什么还没完全普及?

因为IPv6和IPv4是不兼容的。要过渡到IPv6,需要全球的运营商、所有的路由器、各种操作系统、所有的应用软件全部进行升级或重构。这是一项长达数十年的浩大工程,目前我们正处于IPv4和IPv6双栈共存的漫长过渡期。

五、路由器的工作原理与路由表

没有联网的机器不需要IP地址;IP地址的本质是网络通信的坐标。 如前所述,IP地址 = 网络号 + 主机号。在同一个网段(子网)内,所有主机的网络号必须相同,但主机号必须唯一。

1. 路由器的多重身份(⭐⭐⭐)

了解IP,就绕不开路由器。路由器不仅仅是一个发WiFi的盒子

  1. 它也是一台主机:路由器作为网络节点,同样配置有自己的IP地址。

  2. 它是跨网段的桥梁:一台路由器至少要连接两个以上的子网(比如家里的局域网和运营商的公网)。因此,它必须配置多个IP地址,每个接口对应一个子网。

  3. 它是子网的"第一人" :通常,路由器在一个子网中会占用第一个有效的IP地址(例如 192.168.1.1),也就是我们常说的"默认网关"。

  4. 它的综合管理功能:除了核心的IP报文转发,现代路由器还能构建局域网,并充当DHCP服务器,自动给新接入的设备分配主机号。

2. 工作原理

1.提取目标IP:设备会查看报文的目标IP。

2.匹配网段:用目标IP与路由表中的每一条子网掩码进行按位与运算,对比是否在已知的目标网段内。

3.给出下一跳 (Next Hop)

(1)命中:如果知道路怎么走,路由表会给出具体下一跳路由器的MAC地址,报文被精准投递到下一个站点。

(2)未命中 :如果路由器翻遍了表格也不知道这个IP在哪里,它就会使用默认路由 (Default Route, 通常是 0.0.0.0)。也就是把包裹丢给同一网段中级别更高、视野更广的上一级路由器(这就叫转入默认路由)。

4.循环往复:一跳接一跳,一直到达拥有目标IP所在子网的入口路由器,最终投递给目标主机。

六、扩展学习

1. IP的按类划分

1.1 A类地址:巨无霸网段

  • 前导码识别 :最高位固定为 0

  • 结构划分8位网络号 + 24位主机号

  • 地址范围0.0.0.0127.255.255.255

  • 默认子网掩码255.0.0.0

  • 容量与特点 :A类地址的网络号极少(只有120多个),但每个网络能容纳的主机数量极为夸张,高达 (约1677万)台主机。通常只有跨国级的超大型网络或骨干网才会使用。

1.2 B类地址:中坚力量

  • 前导码识别 :最高两位固定为 10

  • 结构划分16位网络号 + 16位主机号

  • 地址范围128.0.0.0191.255.255.255

  • 默认子网掩码255.255.0.0

  • 容量与特点 :B类地址有1万多个网络,每个网络可以容纳 (即65534)台主机。一般分配给大型企业、高校或政府机构。

1.3 C类地址:遍地开花

  • 前导码识别 :最高三位固定为 110

  • 结构划分24位网络号 + 8位主机号

  • 地址范围192.0.0.0223.255.255.255

  • 默认子网掩码255.255.255.0

  • 容量与特点 :C类网络数量极其庞大(超过200万个),但每个网络只能容纳(即254)台主机。我们日常接触最多的公网IP大多属于这一类。

1.4 D类地址:特殊的群发机制

  • 前导码识别 :最高四位固定为 1110

  • 地址范围224.0.0.0239.255.255.255

  • 核心用途多播/组播(Multicast)地址 。它没有网络号和主机号的划分!它不指向某一台特定的计算机,而是指向"一组"计算机。当向一个D类地址发送数据时,加入该组的所有主机都能收到。常用于视频直播、路由协议更新(如OSPF)等场景。

1.5 E类地址:未来的预留

  • 前导码识别 :最高四位固定为 1111

  • 地址范围240.0.0.0255.255.255.255

  • 核心用途:保留为科学研究和未来扩展使用。在一般的网络配置中,如果你试图将网卡的IP配置为E类地址,操作系统通常会报错拒绝。

  • 特殊保留255.255.255.255 是一个特殊的受限广播地址,代表"当前局域网内的所有主机"。

1.6 计算主机数都要减 2(⭐⭐⭐)

  • 主机号全为 0 的地址 :代表网络本身(网络号) ,不能分配给具体的主机。比如 192.168.1.0 代表这个C类网段本身。

  • 主机号全为 1 的地址 :代表定向广播地址 。向这个地址发数据,该网段内的所有主机都会收到。比如 192.168.1.255

2. 路由算法简述

2.1 静态路由

  • 原理 :网络管理员登录到路由器后台,一行一行手工敲入命令:"去往 192.168.2.0 网段,请走 10.0.0.2 这个接口"。

  • 特点:绝对可靠,不占用网络额外带宽。

  • 缺点:只适合极小型的网络。如果网络拓扑一变(比如某根网线断了),网管就得半夜爬起来重新改配置,在庞大的互联网中根本行不通。

2.2 动态路由

为了应对复杂的互联网,工程师们发明了动态路由协议。路由器之间会互相发送消息,自动学习并计算出最佳路径,生成路由表。主流的算法分为两大门派:

2.2.1 距离矢量算法 (Distance Vector) ------ "道听途说的传话筒"

代表协议:RIP (路由信息协议)

  • 工作机制:每个路由器只知道自己和邻居的距离。它会定期把自己的"整张路由表"抄送给相邻的路由器。

  • 生活类比:就像村口的情报传递。

    • 路由器B告诉路由器A:"我到北京的距离是 2跳(经过2个路由器)"。

    • 路由器A心里一算:"B是我的邻居(距离1跳),那经过B到北京就是 跳。记录下来:去北京,走B,距离3跳。"

  • 优缺点:算法非常简单,适合小网络。但由于是"道听途说",如果网络出现故障,坏消息传得很慢,容易产生"路由环路"(A以为B能到,B以为A能到,数据包在A和B之间死循环)。

代表协议:OSPF (开放式最短路径优先)

  • 工作机制 :每个路由器不再发送整张路由表,而是向全网广播"自己的邻居是谁,网线状态好不好,带宽是多少"(这就叫链路状态)。

  • 生活类比:就像所有路由器都在朋友圈发了一个定位:"我旁边是张三和李四,路况畅通"。

    • 全网每个路由器收集齐所有人的"朋友圈"后,就能在自己的内存里画出一张完整的、1:1的真实网络拓扑图(上帝视角)。

    • 然后,每个路由器以自己为起点,在本地运行迪杰斯特拉 (Dijkstra) 最短路径算法,计算出到达每一个目的地的最优路线,最后写入路由表。

  • 优缺点:收敛极快(一断网大家立刻知道),绝对不会产生环路,是目前企业内网和中大型网络的主流。缺点是对路由器的CPU和内存要求比较高(因为要在脑海里推演全网地图)。

2.3 BGP (边界网关协议)

刚才说的都是一个公司或一个组织内部的算法(IGP)。但在广袤的互联网中,是无数个大企业、大运营商连在一起的。

在不同运营商之间(比如中国电信和中国联通的边界路由器),使用的是 BGP 协议 。在这里,寻找"最短路径"不再是第一要务,最重要的是"策略与商业利益"(比如电信的数据不能随便走到联通的骨干网里去白嫖带宽)。BGP 是一种基于路径矢量的算法,是支撑整个现代互联网路由体系的基石。

相关推荐
wait a minutes2 小时前
【大模型】本地怎么通过kilo code调用Qwen免费模型
linux·运维·服务器
badwomen__2 小时前
硬件预取:让CPU提前把数据准备好
服务器·性能优化
江畔何人初2 小时前
Argo CD 的核心架构组件与作用
linux·服务器·云原生·kubernetes
CDN3602 小时前
中小站安全方案|360高防服务器+CDN搭配使用,防护效果翻倍
运维·服务器·安全
铭哥的编程日记2 小时前
DNS解析 HTTP TCP/IP ICMP/NAT/NAPT相关知识点
网络协议·tcp/ip·http
人工干智能2 小时前
科普:OpenClaw、大模型、通道及云端养虾
网络·人工智能·llm
草莓熊Lotso2 小时前
Linux 进程间通信之命名管道(FIFO):跨进程通信的实用方案
android·java·linux·运维·服务器·数据库·c++
草莓熊Lotso2 小时前
MySQL 表约束核心指南:从基础约束到外键关联(含实战案例)
android·运维·服务器·数据库·c++·人工智能·mysql
chenzhuyu2 小时前
海康NAS R1新版下载引擎
运维·服务器·nas