【Linux第二十四章】IP协议

前言 🚀

学到 IP 协议时,很多人会觉得它不像 TCPHTTP 那样"有明显流程",反而像是一堆分散概念:IP 地址、子网划分、路由表、TTL、分片、ARPNATICMP、代理、内网穿透......每个词单独看都能理解一点,但一旦放到完整通信过程里,就容易混乱:到底谁负责找路,谁负责找机器,谁负责找网卡,谁负责跨网,谁负责一跳,谁又只是辅助排错?

其实这部分内容有一条非常清晰的主线:IP 协议要解决的核心问题,是如何让数据跨越多个网络,从源主机一路送到目标主机。 为了完成这件事,它必须同时处理地址表达、路径选择、报文寿命、分片重组,以及与链路层、传输层之间的协作关系。

这篇文章就围绕这条主线,把这份《IP协议》笔记重新整理起来:先看 IP 在协议栈中的职责,再看 IP 报头与地址结构,接着把子网、路由、ARPNATICMP、代理和内网穿透这些内容串到同一个通信框架里。


一. IP 协议到底在负责什么 🧠

IP 属于网络层协议,它最核心的能力不是"可靠传输",也不是"端口管理",而是:

把数据包从源主机跨网络送到目标主机。

也就是说,IP 关心的是"数据该往哪里走 ",而不是"数据一定按顺序到达"或"交给哪个进程"。后两者分别是 TCP/UDP 和端口号所关心的问题。

1.1 协议栈中的分工

从协议栈角度看,通信过程大致是这样协作的:

  • 应用层:产生真正的业务数据
  • 传输层:用 TCPUDP 封装,提供不同传输语义
  • 网络层:加上 IP 头,负责跨网络寻址与路由
  • 数据链路层:完成某一跳上的帧传输

所以你可以把 TCP/UDPIP 的关系理解成:

  • TCP/UDP 解决"怎么把数据组织成可传输的上层单元"
  • IP 解决"这些单元跨多个网络时应该怎么被送过去"

1.2 TCP 是策略,IP 是能力边界上的基础支撑

笔记中有一句很有代表性的表述:tcp是策略,从A可靠的传输到B是能力

更准确地说,TCP 是在 IP 提供的网络可达能力之上,继续叠加可靠性、确认、重传、流控等机制;而 IP 本身只负责让数据尽量按目标地址被转发,不承诺可靠性。

💡 避坑指南:

不要把 IPTCP 混成一层逻辑。
IP 负责"送到目标主机",TCP 负责"尽量可靠地送到目标主机上的目标进程"。


二. IP 地址为什么要由网络号和主机号组成 🧱

如果网络里只有几台机器,那直接给每台主机一个全局编号也许还能勉强管理;但真实互联网规模极大,不可能靠"平铺编号"完成高效寻址。

于是,IP 地址被设计成两部分:

  • 网络号:表示主机属于哪个网络
  • 主机号:表示主机在该网络中的具体身份

2.1 为什么要这样拆

这种拆分的好处是,路由器在转发时可以先按"网络"做粗粒度定位,而不必一开始就关心每台具体主机。等数据进入目标网络之后,再由更接近终点的设备继续处理更细粒度的投递问题。

这个思想非常像"城市 + 景点"的关系:

  • 城市对应网络号
  • 景点对应主机号

先确定数据应该去哪个"城市",再进一步找到城市里的具体"景点"。

2.2 主机一定属于某个子网

任何一台主机都不可能脱离网络直接存在,它一定归属于某一个子网。也正因为如此,子网是 IP 网络中最基本的归属单元


三. IP 报头在表达什么信息 🔍

IP 协议要让路由器知道"这包是什么、从哪来、到哪去、还能活多久、需不需要分片",就必须把这些控制信息写进报头。

3.1 IPv4 报头中的关键字段

从这份笔记来看,IPv4 报头里最重要的字段包括:

  • 版本
  • 首部长度
  • 服务类型 TOS
  • 总长度
  • 标识
  • 标志
  • 片偏移
  • TTL
  • 协议
  • 首部校验和
  • IP
  • 目的 IP

3.2 版本与首部长度

版本字段用于标识当前是 IPv4 还是其他版本协议。首部长度字段则说明 IP 报头有多长,单位是 4 字节

标准 IPv4 报头通常是 20 字节,如果带选项字段,则会更长。

3.3 总长度与协议字段

总长度表示整个 IP 报文的总字节数,也就是:

IP 首部 + 有效载荷

而协议字段则告诉接收方:这个 IP 报文里封装的是哪种上层协议。例如:

  • TCP
  • UDP
  • ICMP

这样,接收方网络层在解出 IP 报文后,才能继续把数据交给正确的上层模块。

3.4 TTL 为什么必须存在

TTL(生存时间)本质上是限制报文在网络中最多还能经过多少跳。

每经过一个路由器,TTL 通常减 1。一旦减到 0,报文就会被丢弃。

这样设计的目的非常直接:防止报文因为路由错误或环路而在网络中无限转发。

💡 避坑指南:
TTL 不是为了"估算距离",它最核心的作用是防止报文在网络里死循环


四. 子网划分:为什么一张大网还要继续切小 🗺️

如果所有主机都放在一个大广播域里,网络管理、查找、广播开销和安全性都会越来越差。因此,实际网络都会继续做子网划分。

4.1 子网划分在做什么

所谓子网划分,就是在原本的地址空间中,再拿出更多位作为"网络位",从而把一个较大的网络切成多个更小的子网。

这样做的结果是:

  • 每个子网内部更容易管理
  • 广播范围更小
  • 地址利用率更高
  • 路由定位更高效

4.2 子网掩码在表达什么

子网掩码的作用,就是明确告诉系统:

  • 哪些位属于网络号
  • 哪些位属于主机号

例如:

  • /24 对应 255.255.255.0
  • 表示前 24 位是网络位,后 8 位是主机位

4.3 一个具体例子

笔记中给出了这样一个例子:

  • IP140.252.20.68
  • 子网掩码:255.255.255.240
  • 也就是 /28

由于 /28 表示前 28 位是网络位,那么最后 4 位属于主机位。把 IP 和子网掩码按位与,就能得到网络号:

140.252.20.64

因为主机位只有 4 位,所以整个子网地址范围共有 2^4 = 16 个地址,从 140.252.20.64140.252.20.79


五. 私有 IP、公网 IP 与 CIDR:地址到底是怎么组织起来的 🧩

5.1 私有 IP 为什么存在

IPv4 地址有限,不可能给每台家庭设备、企业内网设备都直接分一个全球可达的公网地址。因此专门保留了一些地址段,供局域网内部使用。

根据笔记中的整理,常见私有地址范围有三类:

  • 10.0.0.0/8
  • 172.16.0.0/12172.31.255.255
  • 192.168.0.0/16

这些地址只能在局域网内部使用,不能直接作为公网可路由地址在互联网中传输。

5.2 公网 IP 的特点

除了私有地址范围之外的可全球路由地址,可以理解为公网 IP。它们在公网环境里需要具备全局唯一性,才能让数据真正被互联网中的路由器逐级转发到正确位置。

5.3 CIDR 为什么重要

现代 IP 地址分配已经不再只靠传统 A/B/C 类网络,而更多依赖 CIDR(无类别域间路由)这种更灵活的前缀表示方式。

CIDR 的价值在于:

  • 可以按需划分大小不同的地址块
  • 可以做路由聚合
  • 提高地址利用效率
  • 降低路由表规模

例如:

  • /8 表示非常大的地址块
  • /16 表示更细一层
  • /20/24 又可以继续细分

六. 路由表:IP 报文到底如何一步步找到路 🧱

仅有目标 IP 地址还不够,网络层还必须回答另一个现实问题:

当前这台主机或路由器,应该把报文先交给谁?

6.1 路由表的作用

路由表就是用来回答"下一跳该走哪"的。系统会根据目标地址和路由表中的条目进行匹配,找到最合适的下一跳或出口接口。

6.2 缺省路由是什么

当目标地址没有命中任何更具体的路由条目时,系统会使用缺省路由(default)作为兜底方案。

它的含义不是"万能直接到达",而是"我不知道更具体的路径了,那就先交给默认网关,让它继续处理"。

6.3 特定网络路由是什么

如果目标地址明确属于某个已知网络,例如 192.168.10.0/24,那就可以通过对应的接口直接在该网络范围内通信,而不必先交给默认网关。

6.4 路由聚合为什么能简化路由表

如果多个更小的子网连续且可以归并,那么就可以聚合成更大的前缀块,从而减少路由表项数量。

例如多个 /20 子网可以在合适条件下聚合成 /16,这样路由器记忆和匹配路径的成本就会降低。


七. 一跳通信和端到端通信不是同一回事 🔍

这份笔记里有一个非常关键的区分:

  • 数据链路层负责一跳
  • IP 层负责端到端

7.1 数据链路层只解决当前链路

数据链路层关心的是"当前这一段物理或逻辑链路怎么传",比如主机到交换机、交换机到路由器、路由器到路由器之间。

7.2 IP 层解决跨多个网络的投递

IP 层不关心每一跳的具体物理细节,它关心的是:从源主机出发,跨越多个路由器后,最终是否能到达目标主机所在网络,并继续投递过去。

所以,端到端不是"一次发过去",而是依赖很多次一跳转发拼出来的。


八. MACIP 为什么要同时存在 💻

很多初学者刚接触网络时,最容易混淆的就是:既然已经有 IP 地址了,为什么还要 MAC 地址?

8.1 IP 负责全路径定位

IP 地址用于网络层定位目标主机,源和目的 IP 在绝大多数转发过程中都保持不变,用来表达"最终要从哪到哪"。

8.2 MAC 负责当前这一跳交付

MAC 地址工作在数据链路层,主要用于当前链路中的帧交付。每经过一个网络设备,帧头都会被重新封装,因此源和目的 MAC 会随着每一跳而变化。

8.3 可以把它理解成两套坐标体系

  • IP:从哪里来,到哪里去
  • MAC:当前在这一跳里,要交给谁

💡 避坑指南:
IP 表示终点,MAC 表示当前这一跳的下一站。

这两套地址不冲突,反而是分层设计中最典型的配合关系。


九. ARP:局域网里如何从 IP 找到 MAC 🧩

在局域网内,要把以太网帧真正发出去,最终还是得知道目标设备的 MAC 地址。可应用层和网络层通常只知道目标 IP,不知道对方网卡地址,这就需要 ARP 来做映射。

9.1 ARP 的核心作用

ARP 是一种用来把 IP 地址解析成 MAC 地址的协议。它本质上解决的是:

已知对方 IP,怎么拿到对方当前的 MAC

9.2 ARP 请求流程

笔记中给出的标准流程非常典型:

  1. 主机 A 要找 ipE 对应的 MAC
  2. 先发一个广播 ARP 请求
  3. 目标 IPipE 的主机收到后,单播回 ARP 应答
  4. 主机 A 记录下 ipE -> macE 的映射

9.3 请求与应答在帧层面的表现

ARP 请求通常表现为:

  • 目的 MACFF:FF:FF:FF:FF:FF
  • MAC:请求方 MAC
  • 类型:0806

ARP 应答则是单播回请求方:

  • 目的 MAC:请求方 MAC
  • MAC:应答方 MAC
  • 类型:0806

9.4 ARP 缓存为什么要有过期时间

如果每次发包前都重新广播问一次 MAC,效率会很差,所以主机会把解析结果缓存起来。

但缓存不能永久有效,因为:

  • 设备可能更换网卡
  • 网络结构可能变化
  • IP-MAC 绑定关系可能更新

所以 ARP 缓存既要提高效率,又必须具备过期刷新能力。


十. ARP 欺骗为什么能成为中间人攻击入口 ⚠️

ARP 的设计很实用,但也存在一个明显弱点:它本身并不验证应答的真实性。

10.1 欺骗是怎么发生的

攻击者可以伪造 ARP 应答,谎称:

  • 路由器的 IP 对应自己的 MAC
  • 某台主机的 IP 对应自己的 MAC

一旦两边都相信了这个假映射,原本应该直达或经网关转发的数据,就会先流到攻击者机器上。

10.2 本质问题是什么

本质上,ARP 欺骗并不是"把协议玩坏了",而是利用了 ARP 缺乏身份认证的天然弱点,从而篡改局域网里的 IP-MAC 映射关系,改变正常的数据转发路径。


十一. NAT:私网为什么也能访问公网 🗺️

私有 IP 无法直接出现在公网中,但现实里家庭、企业内网设备明明都可以访问互联网,这就依赖 NAT(网络地址转换)。

11.1 NAT 在做什么

当内网设备把数据发到路由器时,路由器会把原本的:

  • 源私有 IP
  • 甚至源端口

替换成自己的公网 IP 和某个可区分的端口,再把报文继续发向外网。

11.2 为什么有时端口也要改

如果多个内网主机同时访问外部同一个服务,仅靠替换源 IP 还不够,因为它们都被映射成了同一个公网出口地址。这时就必须进一步用不同端口把各自连接区分开来。

11.3 为什么 NAT 能把回包再找回来

因为路由器内存里会维护一张 NAT 映射表,记录:

  • 内网地址与端口
  • 对应映射出去的公网地址与端口

当响应报文回来时,路由器就能根据这张表再把数据正确转发回原来的内网主机。

11.4 NAT 解决了什么现实问题

最直接的现实意义就是:缓解公网 IP 不足问题,让多个私网设备共享一个或少量公网地址。

💡 避坑指南:
NAT 不只是"改个 IP",很多时候还是 IP + 端口 的双重转换


十二. ICMPping:网络层如何反馈问题 🧱

网络传输失败时,总得有人出来说清楚到底出了什么问题。这个"反馈机制"很多时候就依赖 ICMP

12.1 ICMP 的定位

ICMP 位于网络层,主要负责传递:

  • 网络错误信息
  • 控制信息
  • 状态诊断信息

它不是像 TCP/UDP 那样承载常规应用业务数据的协议,而更像网络层的"诊断与反馈通道"。

12.2 ping 为什么没有端口号

ping 使用的是 ICMP 请求 / 应答报文,它直接封装在 IP 报文里,不经过传输层,所以没有端口号这个概念。

12.3 ICMP 在排错中的价值

当数据报文无法正常到达时,中间路由器或目标网络边界设备可能会返回 ICMP 应答,告诉源端:

  • 目标不可达
  • 超时
  • 路径有问题

这也是为什么 pingtraceroute 这类工具在网络排障中非常常见。


十三. 分片机制:为什么 IP 报文有时必须拆开 🔍

网络层还有一个特别重要、也特别容易考的点:分片

13.1 为什么会发生分片

因为下层链路会有限制,也就是 MTU(最大传输单元)。如果一个 IP 报文太大,超过了当前链路允许承载的最大帧大小,就必须拆成多个分片,分别传输。

13.2 分片发生在哪一层,重组发生在哪一层

这份笔记明确给出的结论是:

  • 分片发生在网络层
  • 重组发生在对方的网络层

13.3 分片报头里的关键字段

为了支持分片与重组,IP 报头里专门准备了三组关键字段:

  • 标识(id) :属于同一原始报文的所有分片,id 相同
  • 标志位:控制是否允许分片,以及是否还有后续分片
  • 片偏移:说明当前分片在原始报文中的相对位置

13.4 为什么片偏移要按 8 字节为单位

片偏移字段记录的不是直接字节数,而是以 8 字节为单位的偏移值。因此,除了最后一个分片外,其他分片的数据长度通常都需要是 8 的整数倍,便于正确定位与拼接。

13.5 一个典型分片例子

笔记里给了一个很直观的例子:一个 3000 字节的 IP 报文,在 MTU = 1500 的链路上会被拆成多个分片。由于每个分片都必须带自己的 IP 首部,所以实际可装的数据量要扣掉首部空间。

13.6 为什么分片要尽量避免

分片会带来两个明显问题:

  1. 丢任意一个分片,整份报文就可能无法正确重组
  2. 增加协议处理复杂度和网络开销

也正因为如此,实际系统往往会尽量通过上层控制报文大小,减少 IP 分片出现的概率。


十四. MSSMTU:为什么 TCP 不会无限制往下塞数据 💻

笔记里特别提到:TCP 在发送报文时,不能只盯着接收方窗口,还得考虑下层链路是否会导致分片。

14.1 MTU 是链路层限制

MTU 决定单个链路层帧最多能承载多少字节。

14.2 MSS 是传输层为了适配 MTU 而做的约束

例如在典型以太网环境里:

  • MTU = 1500
  • IP 首部约 20
  • TCP 首部约 20

那么 TCP 常见的 MSS 就会取:

1460

这样做的目的就是:让单个 TCP 数据段尽量一次就能被下层完整承载,而不是交给 IP 再去拆分。


十五. 从浏览器输入 URL 到页面出现:这些协议是怎么协作的 🧩

笔记后半部分专门把"浏览器输入 URL 后发生的事"串起来了,这正好能把 IP 放回完整网络通信流程中理解。

整个过程可以概括为:

  1. URL 解析:浏览器拆出协议、域名、路径
  2. DNS 解析 :把域名解析成目标 IP
  3. 建立连接
    • HTTPTCP 三次握手
    • HTTPSTCP 基础上再做 TLS 握手
  4. 发送请求:请求报文经传输层、网络层、链路层层层封装发送
  5. 服务器处理:返回响应报文
  6. 浏览器渲染 :解析 HTML/CSS/JS 并显示页面

在这个过程中,IP 层始终承担"跨网送达"的基础职责,而 MACARP、路由表、NATTCPDNS 等则共同配合完成完整访问链路。


十六. 代理、反向代理、VPN 与内网穿透:这些和 IP/NAT 有什么关系 ⚠️

16.1 正向代理

正向代理位于客户端和目标服务器之间,代理客户端向外部服务器发请求。客户端需要主动配置代理信息。

它的典型作用包括:

  • 代替客户端访问外部资源
  • 隐藏客户端真实 IP
  • 缓存外部资源
  • 对访问行为做控制与审计

16.2 反向代理

反向代理则位于客户端和后端真实服务器之间,对外表现为统一入口。客户端通常感知不到后端真实服务器的存在。

它的价值主要包括:

  • 合理调度内网资源
  • 隐藏后端真实结构
  • 做负载均衡
  • 增加安全防护

16.3 NAT 和代理不是一回事

虽然两者都可能"隐藏真实地址",但它们不在同一层次:

  • NAT 更偏底层网络地址转换
  • 代理更偏应用层中间转发与控制

16.4 VPN 在这里可以怎么理解

按这份笔记的表述,VPN 利用加密与代理通道把外部访问流量重新包起来,从而绕过中间路径上的直接可见性,可以视作一种更复杂的正向代理形态。

16.5 内网穿透与 frp

当内网主机无法直接暴露到公网时,可以借助具备公网 IP 的中间服务器建立映射关系,把外部请求再转发回内网服务。

笔记里用 frp 做了说明:

  • frps:部署在公网服务器上,负责入口与映射
  • frpc:部署在内网主机上,把本地服务暴露给 frps
  • 外部访问者访问 frps 的公网地址和映射端口
  • frps 再把请求转给对应的 frpc
  • 最终打到内网服务

这类方案本质上就是:借助公网中介和既有连接,把本来无法从公网直接访问的内网服务重新"引出来"。


总结 📝

IP 协议这一章真正要建立起来的,不是"背下几个字段名字",而是一条完整主线:

网络层负责让数据跨网络到达目标主机。

围绕这个目标,IP 需要做的事情依次展开:

  • IP 地址表达"在哪个网络里的哪台主机"
  • 用子网与掩码提高地址管理与路由效率
  • 用路由表决定下一跳
  • TTL 防止死循环
  • 用分片机制适配下层 MTU
  • ARP 在局域网内把 IP 映射成 MAC
  • NAT 让私网设备共享公网出口
  • ICMP 反馈网络层错误与状态
  • 再与 TCP/UDPDNS、代理和内网穿透方案一起,拼成完整通信链路

所以,从学习角度看,IP 不是一个只会"贴地址标签"的简单协议,而是:

整个跨网络通信体系的基础转发层。

当这条主线建立起来之后,后面再看路由器转发、抓包分析、ping/tracerouteNAT 设备行为、代理与内网穿透,就不会觉得它们是散乱的专题,而会自然落到同一套网络层理解框架里。

相关推荐
志栋智能2 小时前
超自动化巡检:构筑业务连续性的第一道智能防线
大数据·运维·网络·人工智能·自动化
llkk星期五2 小时前
ubuntu(24.04)下wayland显示界面带来的影响
linux·ubuntu
hsjcjh11 小时前
Nodemailer使用教程:在Node.js中发送电子邮件
linux·运维·node.js
不怕犯错,就怕不做12 小时前
linux 如何查看自己的帐号密码及samba的帐号和密码
linux·运维·服务器
地下核武12 小时前
Ubuntu 24.04 在线安装 Qt 6.10.2 后 Qt Creator 无法启动问题记录与解决
linux·qt·ubuntu
张32313 小时前
Linux 启动过程
linux·运维
三万棵雪松13 小时前
【Linux 物联网网关主控系统-Linux主控部分(二)】
linux·嵌入式linux
chinesegf13 小时前
ubuntu建虚拟环境制作docker容器
linux·ubuntu·docker
Stack Overflow?Tan9013 小时前
标注软件labelImg在linux下鼠标滚轮闪退解决办法
linux·labelimg