Linux之网络基础(二)

局域网 络传输流程图

封装的本质
1. 核心定义

封装:发送端自上而下,每层在上层交付的有效载荷 (payload) 前追加本层协议报头 (header),数据逐层打包。 完整报文通用公式: 完整报文 = 本层报头(header) + 上层交付的有效载荷(payload)

2.协议 = 结构体,报头 = 结构体变量

在 C 语言视角理解(网络内核底层实现):

  • 每一层协议(TCP、IP、以太网协议)本质都是提前定义好的结构体,规定报头里面有哪些字段(源地址、目标地址、长度、校验和等)
  • 发送数据时,内核创建这个结构体变量,填充各项控制信息,这个结构体实例就是报头
  • 报头后面拼接上层传来的数据(有效载荷),组合成本层完整报文

举例:IP 协议就是内核定义的 struct iphdr 结构体,发送数据包时填充这个结构体,拼上 TCP 报文段,组成完整 IP 数据包。

3. 每层协议必须完成两件核心工作
  1. 分离报头和有效载荷 收到报文之后,能够区分:哪一部分是本层协议的控制报头,哪一部分是交给上层的数据载荷。依靠结构体固定大小 + 长度字段解析。
  2. 识别上层协议,交付给正确上层协议 本层剥离报头后,要知道这个载荷该交给上层哪一个协议处理。

例子:IP 报头里面有协议字段,标识载荷是 TCP (6) 还是 UDP (17),内核根据这个字段,把数据交给 TCP 模块或 UDP 模块。

协议本质是一个结构体类型

而报头就是一个结构体变量

跨网络传输的流程

IP
一、IP 协议版本区分

IP 协议存在两大版本:IPv4、IPv6 课件约定:若无特殊说明,提到 IP 默认指代 IPv4

  • IPv4:32 位(4 字节),目前广泛使用,但公网地址资源枯竭
  • IPv6:128 位(16 字节),用来解决 IPv4 地址耗尽问题,逐步推广
二、IPv4 地址核心知识点
1. IP 地址作用

IP 地址工作在网络层,用来在整个互联网范围内,唯一标识一台主机。 MAC 只管局域网内相邻设备;IP 负责跨网段全网寻址。

2. IPv4 地址格式
  1. 底层本质:32 位二进制整数(4 字节)
  2. 人类可读写法:点分十进制 写法范例:192.168.0.1 规则:使用小数点分割 4 段数字,每一段代表 1 字节(8bit),取值范围 0 ~ 255 举例拆解:192.168.0.1 分为 4 个字节:192、168、0、1

底层存储是完整 32 位整数,点分十进制只是方便人阅读的展示形式,程序内部传输使用二进制。

IP侧重点更多是:标识公网中唯一一台主机(类似于学生的学号)

MAC vs IP

两套地址

1.src: 东土大唐 dst:西天 ---->从哪来到哪去 ---->IP地址

2.last_src:车迟国 last_dst:女儿国 ----->上一站从哪来,下一站到哪去 -------MAC地址

  1. IP 地址(网络层)
  • 作用 :在整个互联网范围内,标识通信的起点主机和终点主机
  • 特点 :数据包从发送方到接收方的全过程中,源 IP 和目的 IP 始终保持不变
  • 类比:唐僧的出发地「东土大唐」和目的地「西天」,不管中间经过多少国家,起点终点不变。
  1. MAC 地址(数据链路层)
  • 作用 :在同一个局域网内 ,标识相邻两个设备,完成这一跳的数据交付。
  • 特点 :数据包每经过一个路由器(每一跳),源 MAC 和目的 MAC 都会被重新改写
  • 类比:唐僧当前这一段路,是从「车迟国」走到「女儿国」;走完这段,下一段就变成从「女儿国」走到「火焰山」------ 每一段路的起止点都在变。

为什么需要两套地址?只用一套不行吗?

核心原因:两套地址分工不同,缺一不可

只用 IP 地址行不行?

不行。IP 地址是逻辑地址,可以动态变化(比如手机从家里 WiFi 切到校园网,IP 就变了)。 而数据链路层(网卡、交换机)只认识 MAC 地址,不认识 IP。交换机靠 MAC 地址把帧送到正确的设备,没有 MAC,局域网内部根本无法交付数据
只用 MAC 地址行不行?

也不行。MAC 地址是网卡出厂固化的,48 位扁平地址,没有层次结构,无法用来做路由选路。 互联网有几十亿台设备,如果靠 MAC 地址寻址,每台路由器都要记住全世界所有 MAC,路由表会爆炸。 而 IP 地址是分层的(网络号 + 主机号),路由器可以按网络号聚合路由,大大减小路由表规模。

路由器核心处理流程

路由器不会完整解封装到传输层 / 应用层,只解封装到网络层

  1. 收到以太网帧:剥离以太网二层头部(以太网帧头、CRC),取出里面的 IP 数据包
  2. 读取 IP 报头的目的 IP,查询路由表,确定转发下一跳
  3. 重新封装二层帧 :因为对端是令牌环网络,不再使用以太网帧,改用令牌环帧头封装 IP 数据包
  4. 通过令牌环链路,转发给目标局域网内的 FTP 服务器

路由器转发时:IP 数据包整体保留(源 IP、目的 IP 不变),二层帧完全重封装,适配不同底层链路 这也是路由器可以连接以太网、令牌环、PPP 等多种异构网络的根本原因

场景

用户 A(IP:192.168.2.2,MAC:macA)要给用户 B(IP:172.168.2.2)发数据:你好

网络层的核心判断

网络层不知道主机具体是谁,但可以知道:当前报文是发给「自己局域网」还是「其他网络」。

网络层拿到目的 IP 172.168.2.2,和自己的 IP 192.168.2.2 对比,发现不在同一个网段

路由决策

路由:发现不是发给自己局域网主机的报文,就推送给路由器。

既然目标不在本局域网,数据链路层封装帧时:

  • 源 MACmacA(自己的网卡)
  • 目的 MACmacLeft(路由器左侧网卡的 MAC,不是目标主机的 MAC!)

关键:跨网段通信时,二层帧的目的 MAC 填的是下一跳路由器的 MAC,不是最终目标主机的 MAC。因为 MAC 只负责相邻设备一跳交付。

同局域网其他主机的反应

交换机把帧广播到局域网所有主机,其他主机(192.168.2.3192.168.2.4)收到帧后,对比目的 MAC,发现不是自己的 MAC,直接丢弃。只有路由器左侧网卡匹配 MAC,接收这个帧

路由器的处理流程

路由器不会把数据完整解封装到应用层,只解封装到网络层

  1. 解封装二层 :剥离以太网帧头(src:macA, dst:macLeft),取出里面的 IP 数据包。
  2. 读 IP 头部 :查看目的 IP 172.168.2.2,查询路由表,确定下一跳是右侧局域网,从右侧网卡转发。
  3. 重新封装二层帧 (课件标注:「向下交互要重新封装」):
    • 源 MAC :改为路由器右侧网卡的 MAC macRight
    • 目的 MAC :改为目标主机 B 的 MAC macB
    • IP 数据包整体原封不动src:192.168.2.2, dst:172.168.2.2, data:你好

✨ 核心结论:

  • IP 层:源 IP、目的 IP 全程不变(网络层收发的是同一个报文)
  • 二层帧:源 MAC、目的 MAC 每经过一跳路由器就重新封装

目标主机 B 接收

B 的网卡收到帧,对比目的 MAC macB,匹配成功,接收帧;逐层解封装,最终把你好交给应用层。

局域网标准并不统一 → 标准不同,实现方式不同 → 会阻碍互联网发展

现实中存在多种局域网技术:以太网、令牌环、Wi-Fi...... 它们的帧格式、MAC 寻址方式都不一样。如果没有统一的上层标准,不同局域网之间根本无法互通。

IP 协议的作用:屏蔽底层差异

IP 网以上标准统一

IP 协议在网络层提供了一套统一的地址格式(IP 地址)和统一的报文格式(IP 数据包)。 不管底层是以太网还是令牌环,到了网络层以上,全部用统一的 IP 报文交互。

路由器的地位

路由器是实现 IP 通信的最重要硬件

IP地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)

Mac地址一直在变

目的IP是一种长远目标,Mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网 转发的重要依据

相关推荐
今儿敲了吗1 小时前
CN——网络层(上)
网络·笔记
莫浅子2 小时前
Day 4:USB 2.0 时序与带宽预算
linux·运维·网络
ly76892 小时前
Linux 从入门到实践:系统架构、常用命令、服务管理与故障排查详解
linux·运维·系统架构
新手unity自用笔记2 小时前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
小雪崩2 小时前
嵌入式学习 day27:标准IO
linux·c语言·学习
XUEYUAN52122 小时前
Cloudflare 防护机制深度剖析与跨境数据采集工程化实践
服务器·网络·网络协议·tcp/ip·http
Arnold.Shen3 小时前
Dell Storage SC - 如何发送SupportAssist,并启用安全控制台
linux·安全
青瓦梦滋3 小时前
IP/MAC帧/ARP协议
运维·服务器·网络·网络协议·tcp/ip
wunaiqiezixin3 小时前
MIT 6.S081 xv6 源码精读(Scheduling):sched、scheduler
linux·unix·os·xv6·mit6.s081