《Linux网络编程》8.网络层IP原理

💡Yupureki:个人主页

✨个人专栏:《C++》 《算法》《Linux系统编程》《高并发内存池》《MySQL数据库》

《个人在线OJ平台》《Linux网络编程》《CMake自动化构建工具》《Redis数据库》


🌸Yupureki🌸的简介:


目录

[1. IP报头格式](#1. IP报头格式)

[2. IP协议的传输工作](#2. IP协议的传输工作)

[2.1 寻址与路由](#2.1 寻址与路由)

[2.2 数据封装](#2.2 数据封装)

[2.3 分片与重组](#2.3 分片与重组)

[3. 网段划分](#3. 网段划分)

[3.1 子网的由来](#3.1 子网的由来)

[3.1.1 早期因特网的困境](#3.1.1 早期因特网的困境)

[3.1.2 初代方案:子网划分与子网掩码](#3.1.2 初代方案:子网划分与子网掩码)

[3.1.3 现代方案:CIDR 无类别域间路由](#3.1.3 现代方案:CIDR 无类别域间路由)

[3.2 公网与私网](#3.2 公网与私网)

[3.2.1 私有IP地址](#3.2.1 私有IP地址)

[3.2.2 NAT](#3.2.2 NAT)

[3.3 重点概念的重新认识](#3.3 重点概念的重新认识)

[3.3.1 以太网](#3.3.1 以太网)

[3.3.2 子网](#3.3.2 子网)

[3.3.3 私网](#3.3.3 私网)

[3.3.4 公网](#3.3.4 公网)

[3.3.5 因特网](#3.3.5 因特网)

[3.3.6 万维网](#3.3.6 万维网)

[4. 路由](#4. 路由)

[4.1 路由的概念](#4.1 路由的概念)

[4.2 公网和路由的关系](#4.2 公网和路由的关系)

[5. 一个数据包的"出国旅行"](#5. 一个数据包的“出国旅行”)


1. IP报头格式

IP协议(这里主要指IPv4 )的报头格式如下,通常为20~60字节,由固定部分和可选字段组成。

各字段含义

  • 版本(4位)

    IP协议版本号,IPv4的值为 4

  • 首部长度(4位)

    表示IP报头的长度,以4字节 为单位。最小值为 5(即5×4 = 20字节),最大为 15(60字节)。

    因为可选项的存在,报头长度可变。

  • 服务类型/区分服务(8位)

    早期用于指定优先级、延迟、吞吐量等

  • 总长度(16位)

    整个IP数据报(报头+数据)的长度,以字节为单位。最大65535字节,但通常受链路层MTU限制(如以太网1500字节)。

  • 标识(16位)

    用于唯一标识一个数据报的所有分片。当数据报被分片后,同一原始数据报的所有分片具有相同的标识值,便于接收方重组。

  • 标志(3位)

    • 第0位:保留,必须为0。

    • 第1位:DF,置1时禁止分片,若数据报超过MTU则丢弃并返回ICMP差错报文。

    • 第2位:MF,置1表示后续还有分片;最后一个分片该位为0。

  • 片偏移(13位)

    表示该分片在原始数据报中的相对位置,以8字节为单位。用于接收方按序重组分片。

  • 生存时间 TTL(8位)

    限制数据报经过的最大跳数(路由器数)。每经过一个路由器TTL减1,减到0时丢弃数据报并回送ICMP超时消息。防止数据报无限循环。

  • 协议(8位)

    指明数据部分使用的上层协议,如 6(TCP)、17(UDP)、1(ICMP)等。用于到达目的地后交给正确的协议处理。

  • 首部校验和(16位)

    只对IP报头 计算校验和(不包括数据部分)。每经过一跳路由器,因TTL变化,校验和会被重新计算。

    计算方式:将报头按16位分段,求反码和后再取反。

  • 源IP地址(32位)

    发送方的IPv4地址。

  • 目的IP地址(32位)

    接收方的IPv4地址。

  • 可选字段(长度可变)

    可选功能,如记录路由、时间戳、严格/宽松源路由等,很少使用。

    长度以4字节为单位,不足时用全0的填充字节补全,使报头长度为4字节的整数倍。

  • 填充

    用于确保报头结束于32位边界。

2. IP协议的传输工作

首先,理解IP协议的两个基本设计哲学至关重要:

  • 无连接:在发送数据包之前,IP协议不会像打电话那样先建立一个固定的端到端连接。每个数据包都是独立的个体,并可能走不同的路。

  • 不可靠,但尽力而为 :IP协议不保证数据包一定能送达、不保证按序到达、也不保证数据不重复。它只承诺尽最大努力去投递,这种机制被称为"尽力而为的服务"(best-effort delivery)。端到端的可靠性,需要由它的"搭档"------TCP协议来保证。

2.1 寻址与路由

这是IP协议最核心的功能,它就像物流系统中的地址和导航:

  • IP地址 :是网络中每个设备的唯一逻辑地址,就像"xx省xx市xx区xx路xx号"。在IPv4中,它是一个32位的数字,通常写成4组,例如 192.168.1.1

  • 子网划分 :为了方便管理,IP地址被分为"网络号"(标识所在的网络区域)和"主机号"(标识区域内的具体设备)两部分。通过子网掩码 (如 255.255.255.0)来区分这两部分。

  • 路由选择 :当数据包从A发往B时,沿途的路由器 会检查数据包的目的IP地址,然后查询自己的路由表,为数据包选择一条通往目的地的"下一跳"路径。这个过程是逐跳(hop-by-hop)进行的,直到数据包最终抵达目标网络。

2.2 数据封装

发送数据时,IP协议会从传输层(TCP/UDP)接收数据,然后在数据前面添加一个IP报头 ,形成一个IP数据包。这个报头就是物流"快递单",包含了所有关键信息:

  • 源IP地址和目的IP地址:寄件人和收件人的全球唯一地址。

  • 报文标识、标志、片偏移:用于后续的分片和重组。

  • TTL生存时间:数据包在网络中能经过的最大跳数(比如最多经过64个路由器),防止数据包在网络中无限循环。

  • 上层协议:指明包裹里装的是哪种货物,比如是TCP(6)、UDP(17)还是ICMP(1)。

  • 首部校验和:用于检查"快递单"本身是否在运输中损坏。

2.3 分片与重组

不同的物理网络有不同的最大传输单元(MTU),就像不同运输工具对包裹尺寸有限制。例如,以太网的MTU通常是1500字节。

如果一个IP数据包"超重",超过了链路的MTU,IP协议就会将其"化整为零":

  1. 分片Fragmentation:在发送端或中间路由器,将数据部分切成多个小片,以适配即将经过网络的MTU。

  2. 贴标签:每个分片都带有一个IP报头,其中:

    • 标识 字段相同,表示它们属于同一个原始数据包。

    • 标志(MF,More Fragments) 字段指示后面是否还有更多分片。

    • 片偏移 字段记录了该分片在原始数据包中的位置。

  3. 重组Reassembly只有在最终目的地,才会进行重组。目的主机利用这些标签,将收到的所有分片重新拼接成完整的数据包。

为何要"避免分片"?

分片会带来性能损耗和丢包风险,因为一旦一个分片丢失,整个数据包就作废了。因此,现代网络通常会采用路径MTU发现等技术,在发送端就探测并避免分片。

3. 网段划分

要讲网段划分,我们就必须回顾互联网的发展史,为什么要网段划分?

3.1 子网的由来

3.1.1 早期因特网的困境

在互联网的雏形ARPANET时期,为了方便管理,IP地址被设计为"有类地址",即按规模大小分为A、B、C等类别:

类别 网络数 主机数 适用场景 问题
A类 126个 超1670万台 国家级网络 地址空间巨大,几乎无法管理
B类 约1.6万个 65534台 大型机构 对多数机构过多,造成浪费
C类 约200万个 254台 小型公司 对多数机构过少,不够灵活

这种"一刀切"的方式导致两大严重问题:

  1. IP地址严重浪费:一个仅有几十人的小公司若申请B类地址,会导致数万个IP被闲置。

  2. 路由表爆炸式增长:每个物理网络都需在互联网主干路由表中占一条记录,C类小型网络极多,导致路由表规模失控,严重影响路由器的效率和速度。

这就像给一个几十人的小公司分配了一栋能容纳数百人的办公楼,造成了资源的巨大闲置和浪费。

3.1.2 初代方案:子网划分与子网掩码

为了解决上述问题,工程师们在1985年左右提出了子网划分子网掩码的方案。

子网划分的思路

子网划分的核心是向主机位"借"位,来创建新的"子网位"。这相当于把一个大型的、难以管理的网络大院,内部分隔成多个独立的小院落(子网)。这一过程仅在机构内部可见,对外,整个机构仍表现为一个统一的网络。

子网划分将IP地址从"网络号 + 主机号"变成了"网络号 + 子网号 + 主机号"的三级结构。

子网掩码扮演的角色

这就引出了一个关键问题:当一个数据包到达时,路由器如何知道它应该去往内部的哪个子网呢?

答案就是子网掩码 。它是一把精密的标尺,定义了IP地址中哪些位是网络标识(包括子网位),哪些是主机标识。

  • 规则 :掩码中连续的1 对应网络位,**连续的0**对应主机位。

  • 工作方式 :网络设备将IP地址与子网掩码进行"逻辑与"运算,如果两个地址的运算结果相同,就说明它们属于同一个子网,可直接通信;如果不同,则需将数据包发送给网关,由路由器进行转发。

子网掩码就是为了配合子网划分而诞生,它告诉了网络设备如何去理解一个IP地址的内部结构。

3.1.3 现代方案:CIDR 无类别域间路由

子网划分非常成功,催生了更彻底的解决方案------无类别域间路由 (CIDR)

CIDR于1993年被提出,它的核心思想是彻底打破A、B、C类的固定边界 。它采用"斜线记法"(如 /24)来直接指示网络前缀的长度。

CIDR带来了两大革命性优势:

  1. 灵活的地址分配 :允许网络管理员使用可变长子网掩码 (VLSM),根据实际需求精确分配任意大小的地址块,极大地提升了地址利用率。

  2. 路由聚合(超网):可以将多个连续的小地址块"打包"成一个大的路由通告,使全球路由表条目数从数万条骤降到数千条,有效遏制了路由表的爆炸式增长。

3.2 公网与私网

在技术演进的同时,另一场危机也在悄然降临:IPv4地址即将耗尽。子网划分和CIDR虽然提升了利用率,但无法改变42亿个绝对地址的上限。为应对此危机,催生了两个相互配合的关键技术:私有IP地址网络地址转换 (NAT)

3.2.1 私有IP地址

1996年,IETF在RFC 1918中划定了几段专用地址,任何组织都可以无限制地重复使用:

类别 IP地址范围 默认掩码
A类私网 10.0.0.0 ~ 10.255.255.255 255.0.0.0 (/8)
B类私网 172.16.0.0 ~ 172.31.255.255 255.240.0.0 (/12)
C类私网 192.168.0.0 ~ 192.168.255.255 255.255.0.0 (/16)

这些地址可以被世界上无数个家庭和企业同时在内部使用,极大地缓解了对公网地址的消耗。

3.2.2 NAT

NAT技术于1994年提出,它是连接使用私有IP地址的内部网络与使用公有IP地址的全球互联网的唯一桥梁

它的核心工作机制如下:

  1. 建立映射:家中的路由器(NAT设备)会维护一个NAT转换表。

  2. 地址替换 :当内网设备向外网发起请求时,路由器会将数据包中的私有源IP地址替换为自己WAN口的公有IP地址,并分配一个唯一的端口号。

  3. 记录状态:转换记录("私有IP:端口"↔"公有IP:端口")会存入NAT表。

  4. 逆向转换:当外网数据返回时,路由器根据接收到的公有IP和端口号,查询NAT表,并将这个公网IP替换回原先的私有IP和端口,最终送达给发起请求的设备。

关键点 :需要明确,这个通信过程必须由内部主机首先发起。NAT技术像一个智能门卫,没有内部预先登记的外来者,无法直接访问内部主机,这在客观上也为内部网络提供了一定的安全防护

3.3 重点概念的重新认识

有很多"网":公网 私网 子网 以太网 因特网 万维网这些概念都有什么关系和区别?

一图理清:

bash 复制代码
+-----------------------------------------------------------------------+
|                          万  维  网  (WWW)                            |
|              HTTP / HTTPS 协议驱动的全球超媒体应用系统                 |
|              (你正在看的网页、视频、API 接口都在这里)                  |
+---▲-------------------------------------------------------------------+
    |        依赖
+---▼-------------------------------------------------------------------+
|                                                                       |
|                      因  特  网  (Internet)                           |
|              =  全球所有使用 TCP/IP 协议族互联的网络集合              |
|                                                                       |
|   +----- 核心寻址体系 ----------------------------------------------+ |
|   |                                                                  | |
|   |    +----- 公 网 (Public IP) -----------+  你的运营商给你的地址   | |
|   |    |  全球唯一,可直接路由             |  比如 1.2.3.4          | |
|   |    |  IANA 统一分配                    |                        | |
|   |    |  如: 8.8.8.8, 203.0.113.0/24    |                        | |
|   |    +-----------------------------------+                        | |
|   |              ▲                                                  | |
|   |              |  通过 NAT 转换                                   | |
|   |              ▼                                                  | |
|   |    +----- 私 网 (Private IP) ---------+  你的家庭/公司内部地址   | |
|   |    |  不可在公网直接路由               |  比如 192.168.1.5      | |
|   |    |  可被无数组织重复使用             |                        | |
|   |    |  如: 192.168.x.x, 10.x.x.x      |                        | |
|   |    +-----------------------------------+                        | |
|   |                                                                  | |
|   +------ 子网划分 (Subnetting) 贯穿其间 ---------------------------+ |
|   |                                                                  | |
|   |   无论公网还是私网,都可以通过子网掩码进一步划分为更小的子网:   | |
|   |                                                                  | |
|   |   ┌─ 公网 203.0.113.0/24 ─┐    ┌─ 私网 192.168.1.0/24 ────┐   | |
|   |   │  ├─ 203.0.113.0/25    │    │  ├─ 192.168.1.0/26  (客厅)│   | |
|   |   │  └─ 203.0.113.128/25  │    │  └─ 192.168.1.128/26(卧室)│   | |
|   |   └───────────────────────┘    └────────────────────────────┘   | |
|   |                                                                  | |
|   +------------------------------------------------------------------+ |
|                                                                       |
|   运转依赖:OSPF / BGP 路由协议、IP协议、NAT、DNS 等                  |
+---▲-------------------------------------------------------------------+
    |        依赖
+---▼-------------------------------------------------------------------+
|                       以  太  网  (Ethernet)                          |
|        局域网物理/链路层标准,定义了帧格式、MAC地址、交换机规则        |
|        日常用的网线、Wi-Fi 骨干、交换机端口,都是以太网的范畴          |
+-----------------------------------------------------------------------+

3.3.1 以太网

定义 :一种局域网(LAN)技术标准,定义了数据在物理线缆 (网线、光纤)和链路层上的传输规则。它规定了数据帧的格式和物理地址(MAC地址)的使用。

  • 层次:物理层和数据链路层。

  • 关键 :它是硬件基础,是我们日常插网线、连Wi-Fi(以以太网为骨干)所依赖的技术。你电脑的网卡、交换机端口都遵循以太网标准。

  • 关系以太网是承载IP数据包的最主要物理和链路层技术。你可以把它理解为"货车"和"本地马路"。

3.3.2 子网

定义 :一个逻辑概念,是网络管理员在IP网络(网络层)上,通过子网掩码把一个大的IP地址空间划分成的独立小网络。

  • 层次:网络层。

  • 关键 :它是一个逻辑规划工具,用于隔离广播域、提高安全性和便于管理。子网的划分完全由管理员通过修改子网掩码来决定,与物理位置没有绝对关系。

  • 关系 :无论是公网还是私网地址,都可以在其中进一步规划子网。子网定义了一个IP网段内主机可以直接通信的范围。

3.3.3 私网

定义 :根据RFC 1918规定,预留出三块在互联网上不可直接路由、供内部自由重复使用的IP地址范围。

  • 层次:网络层(地址范畴)。

  • 关键 :它是解决公网IPv4地址不足的核心手段。地址块包括:

    • 10.0.0.0/8

    • 172.16.0.0/12

    • 192.168.0.0/16

  • 关系 :你家里的Wi-Fi路由器给手机、电脑分配的就是私网IP。这些设备要上网,必须通过NAT技术 ,把私网IP转换成路由器的公网IP。在一个私网内部,又可以继续划分出更多子网。

3.3.4 公网

定义 :由IANA(互联网号码分配局)统一分配,在全球互联网上唯一且可直接路由的IP地址。

  • 层次:网络层(地址范畴)。

  • 关键 :它是互联网通信的唯一"身份证"。全球的骨干路由器上,路由表里记录的全是公网IP段。公网IP非常稀缺,需要向ISP(互联网服务提供商)申请购买或租用。

3.3.5 因特网

定义:指全球范围内,通过TCP/IP协议族互相连接起来的庞大计算机网络集合。它的名字Internet就是"互联的网络"之意。

  • 层次:网络层及以上(整个网络实体)。

  • 关键 :它是一个物理与逻辑交织的全球网络实体 。它将无数以太网、光纤网、无线网连接起来,底层依赖公网IP进行全球寻址和路由,让世界各地的公网设备都能互相找到。

  • 关系因特网是"网络"本身

3.3.6 万维网

定义 :构建在因特网之上的一种分布式应用服务系统。通过HTTP/HTTPS协议,将无数的网页、图片、视频等超媒体资源链接在一起。

  • 层次:应用层。

  • 关键 :它是应用服务 ,不是网络本身。我们通过浏览器输入www.example.com访问的就是万维网。

  • 关系万维网是因特网上最流行、最广泛使用的信息服务。除了万维网,因特网上还运行着电子邮件(SMTP)、文件传输(FTP)等无数其他应用。我们常说的"上网",很多时候指的就是使用万维网。

4. 路由

4.1 路由的概念

路由,简单来说,就是数据包在网络中寻找最佳路径,从源地址一跳一跳地最终抵达目的地址的过程。它由无数台路由器协作完成,就像全球邮政系统的分拣中心一样。

每个路由器内部都维护着一张路由表 ,它记录了"去往某个网络,下一跳应该交给谁"。一个数据包到达路由器后,路由器会检查它的目的IP地址,在路由表里查找匹配的条目,然后把它从相应的接口转发出去。如果路由表里没有匹配的条目,包就会被丢弃。

这个过程是逐跳的,每个路由器只负责把包送到下一个离目标更近的节点,而不需要知道完整的路径。

4.2 公网和路由的关系

这两者的关系,可以从三个层面来理解:

1. 公网地址是"可被路由"的,私网地址不是

这是最根本的区别。全球互联网中的骨干路由器,它们路由表里存放的全部是公网IP网段的条目 。比如你的运营商拥有 1.2.0.0/16 这个公网地址块,它就会通过BGP这样的路由协议,向全世界宣告"这些地址在我这里,请把去往它们的数据包都送给我"。

10.x.x.x192.168.x.x 这类私有地址段,是永远不会被写入公共路由表的。任何一个骨干路由器,如果遇到了目标是私有地址的数据包,它会直接丢弃,因为这在地球上不是唯一的地址,无法确定到底要投递到哪个"192.168.1.1"。所以,私网地址天生就是不可以在公网上直接路由的。

2. 公网路由系统是地址聚合(CIDR)的最大受益者

早期的有类路由表,有几十万条杂乱的小网络条目。正是CIDR的引入,让全球的路由器可以把连续的公网地址块"打包"成一条大的路由条目。比如,谷歌拥有 8.8.0.0/16 这个公网段,全球的路由器只需要记住一条"去 8.8.0.0/16 找某条路"即可,而不用记256条C类路由。如果没有公网地址的层次化分配和路由聚合,今天的全球路由表早已大到任何设备都无法承载。

3. 私网通过NAT"借用"公网身份接入路由系统

那么,我们用私网地址的设备,是如何上网的呢?关键就在于NAT网络地址转换。当你的电脑(192.168.1.100)访问一个网站时,数据包会先到达家庭路由器。路由器把私网源IP换成自己WAN口上的公网IP 1.2.3.4,并记下一个转换记录,然后再把这个包发出去。

从互联网上这个网站的回包,其目的地址就是公网IP 1.2.3.4。全球的路由系统会通力合作,根据路由表把包一级一级地送到你的运营商,最终送到你的路由器上。路由器拿到这个包,查询自己的NAT转换表,发现这是属于 192.168.1.100 的,就把目的地址替换回去,最终将数据交付给你。

整个过程,你的私有地址对外是不可见的,互联网上其他主机看到、并实际与之通信的,始终是你的那个唯一的公网IP。

5. 一个数据包的"出国旅行"

举个例子完整串联一下:

  1. 假设你家的公网IP是运营商的 1.2.3.4,你在家用电脑(私网IP 192.168.1.5)访问某个网站(公网IP 8.8.8.8)。

  2. 你发出的包,源地址是 192.168.1.5,目的地址是 8.8.8.8

  3. 数据包到达你的路由器,NAT将其源地址改为 1.2.3.4:12345(加了个端口号)。现在,这个包变成了源地址 1.2.3.4,目的地址 8.8.8.8

  4. 你的路由器把包送入互联网。和你家路由器直连的运营商路由器,查路由表发现去 8.8.0.0/16 的下一跳应该发往另一个城市的节点,于是转发出去。

  5. 经过十几跳,沿途所有路由器都用这条聚合的路由条目(8.8.0.0/16),一步步把包送到了谷歌服务器。

  6. 谷歌服务器收到后,回复一个包,源地址写 8.8.8.8,目的地址写你的公网IP 1.2.3.4

  7. 回程依然依赖于全球路由系统:沿途路由器都认识 1.2.0.0/16 这个公网前缀,知道它归属于你的运营商。它们再次接力,把包送回你的路由器。

  8. 你的路由器收到回包,看到目的端口 12345,查NAT表,确定这是发给 192.168.1.5 的,于是将地址还原,最终把数据交给你。

可以看到,整个旅程中,全球路由系统只认公网IP,用公网IP来寻址、转发。而私网IP只在你的家庭内部有意义。NAT则是这两套寻址系统之间的转换界面。

相关推荐
大厂数码评测员1 小时前
免费菜谱管理小程序怎么做才顺手:从情侣、个人、家庭三类场景拆需求和实现
服务器·小程序·apache
yyuuuzz1 小时前
aws亚马逊入门常见认知误区
运维·服务器·网络·云计算·github·aws
剑锋所指,所向披靡!1 小时前
计算机网络概述
网络·计算机网络
Je1lyfish2 小时前
CMU15-445 (2025 Fall/2026 Spring) Project#3 - QueryExecution
linux·c语言·开发语言·数据结构·数据库·c++·算法
DeepFlow 零侵扰全栈可观测2 小时前
运动战:AI 时代 IT 运维的决胜之道——DeepFlow 业务全链路可观测性的落地实践
运维·网络·人工智能·arcgis·云计算
林叔聊渠道分销3 小时前
saas产品运营案例 | 联盟营销计划如何帮助企业提高销售额?
运维·产品运营·sass·流量运营·用户运营
eucalyptus-DE4 小时前
Nova 计算节点故障排查指南
服务器·openstack
志栋智能4 小时前
告别报告堆砌:超自动化巡检的智能分析与洞察
运维·服务器·网络·人工智能·自动化
xyy_4965 小时前
wsl-localhost
linux