Linux 网络(6)

数据链路层

  • 网络层(第三层) :管 "去哪",负责跨网段的端到端通信,用 IP 地址,靠路由表规划全局路线。
  • 数据链路层(第二层) :管 "怎么去下一站",负责同一链路内的一跳传输,用 MAC 地址,靠 ARP 找到下一跳的物理地址。

1.以太网

以太网 " 不是一种具体的网络 , 而是一种技术标准 ;
既包含了数据链路层的内容 , 也包含了一些物理层的
内容 . 例如 : 规定了网络拓扑结构 , 访问控制方式 , 传输速率等 ;
例如以太网中的网线必须使用双绞线 ; 传输速率有 10M, 100M, 1000M 等 ;
以太网是当前应用最广泛的局域网技术 ; 和以太网并列的还有令牌环网 , 无线 LAN 等 ;

这张图里的 "IP 数据报" 部分,需要从两个层面理解:

  1. 承载它的以太网帧(整个大框) :属于数据链路层的封装,包括目的 MAC、源 MAC、类型字段(0800)、数据段和 CRC 校验,都是链路层的内容。
  2. "IP 数据报" 本身(数据段里的内容) :属于网络层的协议数据单元(PDU),是网络层(IP 协议)的核心内容,被链路层封装在以太网帧中进行传输。

简单说:

  • 以太网帧(含 MAC 头、类型、CRC)是链路层的 "快递盒";
  • IP 数据报是网络层的 "包裹内容",被装进链路层的 "快递盒" 里传输。

所以,"IP 数据报" 这几个字代表的是网络层 的内容,而它所在的整个以太网帧结构是链路层的封装。

  1. 以太网帧结构:整个以太网帧都属于链路层封装,包括:

    • 目的 MAC 地址、源 MAC 地址(6 字节)

    • 类型字段(2 字节,标识上层协议)

    • 数据段(46~1500 字节,承载上层数据)

    • CRC 校验码(4 字节,链路层错误检测)

  2. MAC 地址:48 位硬件地址,用于标识链路内相邻节点,是链路层的专属地址。

  3. 链路层协议载体

    • ARP 请求 / 应答(类型0806

    • RARP 请求 / 应答(类型8035)(注:ARP/RARP 报文封装在以太网帧中,属于链路层承载的内容,为网络层服务)

mac地址和ip地址的区别 前面提过

Linux 网络(1)-CSDN博客


2.MTU

一、MTU(最大传输单元)核心概念

MTU(Maximum Transfer Unit)是数据链路层对帧中 "数据段" 的最大长度限制,相当于快递包裹的尺寸上限,由不同物理链路的标准决定。

  • 以太网 MTU:数据段最小 46 字节、最大 1500 字节;ARP 包长度不足 46 字节时,需填充(PAD)到 46 字节。

  • 跨链路分片 :若数据包从 MTU 较大的链路(如 FDDI,MTU=4352)进入 MTU 较小的链路(如以太网,MTU=1500),且长度超过后者 MTU 时,必须进行分片(fragmentation)

  • 不同链路 MTU 不同:以太网 1500、FDDI 4352 等,标准各异。


二、MTU 对 IP 协议的影响

IP 层需根据 MTU 对大包进行分片处理,核心规则如下:

  1. 分片规则

    • 将大 IP 包拆分为多个小包,每个小包的 IP 首部 16 位标识(ID)相同,表示属于同一个原始包。

    • IP 首部 3 位标志字段:

      • 第 2 位(DF 位):0表示允许分片,1表示禁止分片(若包超过 MTU 则直接丢弃);

      • 第 3 位(MF 位):0表示是最后一个小包,1表示还有后续小包。

  2. 重组与丢包

    • 接收端会按顺序重组分片,但任意一个分片丢失,重组就会失败

    • IP 层不负责重传丢失的分片,丢包需由上层协议(如 TCP)处理。


三、MTU 对 UDP 协议的影响

UDP 本身无重传机制,受 MTU 影响更明显:

  • 当 UDP 携带的数据超过 1472 字节(以太网 MTU 1500 - 20 字节 IP 头 - 8 字节 UDP 头)时,会在网络层被分片为多个 IP 数据报。

  • 任意一个分片丢失,都会导致整个 UDP 数据报重组失败,因此 UDP 在网络层分片时,丢包概率大幅增加


四、MTU 对 TCP 协议的影响

TCP 通过 MSS 协商避免分片,提升可靠性:

  1. MSS(最大段大小) :TCP 单个数据报的最大消息长度,受 MTU 限制,理想值为 MSS = MTU - IP头(20) - TCP头(20)(以太网 MTU1500 时,MSS=1460)。

  2. MSS 协商过程

    • TCP 建立连接(SYN 包)时,双方会在 TCP 首部写入自己能支持的 MSS 值;

    • 最终选择双方 MSS 中较小的那个作为通信的 MSS,确保数据不被分片。

  3. MSS 位置:记录在 TCP 首部的 40 字节变长选项中(kind=2)。

在 Linux 系统中,使用ifconfig命令可查看:

mtu :当前网卡的 MTU 值;

ether :网卡的 MAC 地址;

inet :网卡的 IP 地址。

example

|-------|------|------|--------------------|
| 分片 | 片偏移值 | MF 位 | 含义 |
| 1(前部) | 0 | 1 | 原始包的起始位置,还有后续 |
| 2(中部) | 10 | 1 | 接在偏移 0 的分片后,还有后续 |
| 3(最后) | 20 | 0 | 接在偏移 10 的分片后,是最后一个 |

先明确:怎么判断分片是否属于同一个原始包?

核心只有一个:看 IP 首部的 16 位标识(ID)

怎么判断缺失 / 不连续?

  1. 缺前部(分片 1 丢失):只收到分片 2(偏移 10)、分片 3(偏移 20)。→ 依据:同 ID 的分片里,没有「片偏移 = 0」的起始分片(原始包得从 0 开始),直接判定缺失起始部分,不连续。

  2. 缺中部(分片 2 丢失):只收到分片 1(偏移 0)、分片 3(偏移 20)。→ 依据:同 ID 的分片偏移值从 0 直接跳到 20,中间缺了 10 这个 "位置序号",数值不连续,判定缺失中间部分。

  3. 缺最后部(分片 3 丢失):只收到分片 1(偏移 0,MF=1)、分片 2(偏移 10,MF=1)。→ 依据:所有收到的分片 MF 位都是 1(表示还有后续),且始终没收到「同 ID 里片偏移最大、且 MF=0」的分片,等待超时后判定缺失最后部分。

MTU = 网络一次最多能发多大的一包数据 。包超过 MTU → 必须拆成小碎片发。碎片只要丢一个,整包就废。


  1. MTU 对 TCP 的影响

TCP 是乖孩子、老司机

  • 它会自动探测 MTU ,主动把包压到 MTU 以内,尽量不被分片

  • 就算真被分片、丢了碎片,TCP 会重传整个包,保证数据不丢。

MTU 对 TCP 的影响:

  • MTU 太小 → TCP 只能发小包 → 速度慢、效率低。

  • MTU 正常 → TCP 跑满,稳得一批。

总结:MTU 影响 TCP 快慢,但不影响可靠性。


  1. MTU 对 UDP 的影响

UDP 是愣头青、不管不顾

  • 根本不看 MTU,你让它发多大,它就发多大。

  • 超过 MTU → 必被分片。

  • 分片后只要丢任意一小片整个 UDP 包直接丢掉,且不重传、不通知

MTU 对 UDP 的影响:

  • MTU 越小 → UDP 越容易被分片 → 越容易丢包。

  • 分片 = UDP 高危时刻。

总结:MTU 直接决定 UDP 稳不稳定,大了直接炸。


  1. 两者最核心的区别(超级好记)
  • TCP:会躲 MTU,丢了会重传,稳但慢一点。

  • UDP:不躲 MTU,丢了直接没,快但容易崩。


用比喻秒懂

MTU = 马路最大限宽

  • TCP:知道限宽,自动把车改小,不超宽;撞坏了就重新拉货。

  • UDP:不管限宽,超宽就被拆成几截;丢一截,整批货全没,还不补货。

3.ARP协议

建立主机 IP 地址 ↔ MAC 地址 的映射关系。

  • 应用层知道目的 IP 和端口,但网卡处理数据包时,需要硬件地址(MAC)才能正确投递。

  • 如果网卡收到的数据包目的 MAC 与本机不符,会直接丢弃,因此通讯前必须获取目的主机的 MAC 地址。


  1. 工作流程(结合图示)

  2. 发起请求:主机 A(172.20.1.1)要和主机 B(172.20.1.2)通信,先查 ARP 缓存表,若没有 B 的 MAC,就发送 ARP 请求。

  3. 广播请求 :ARP 请求包中,目标 IP 是 172.20.1.2,MAC 地址填 "?",并以广播形式(目的 MAC 为FF:FF:FF:FF:FF:FF)发送到本网段。

  4. 接收响应 :主机 B 收到广播,发现目标 IP 与自己一致,就发送 ARP 响应包,把自己的 MAC 地址(08:00:20:74:CE:EC)和 IP 地址一起发给 A。

  5. 更新缓存:主机 A 收到响应后,将 B 的 IP-MAC 映射关系存入 ARP 缓存表。


  1. ARP 缓存表
  • 每台主机都维护一张 ARP 缓存表,用 arp -a 命令查看(如图中示例)。

  • 表项有过期时间(一般为 20 分钟),若 20 分钟内未再次使用该表项,表项失效,下次通讯需重新发起 ARP 请求。


  1. 思考题解答

  2. **为什么要有缓存表?**避免每次通讯都发送 ARP 请求,减少网络广播,提升通讯效率。

  3. **为什么表项要有过期时间?**网络拓扑可能变化(如主机更换网卡、IP 地址变更),过期后重新请求能保证 IP-MAC 映射关系的准确性,避免通讯失败。

  4. ARP 数据报格式(核心字段)

二、各字段含义(按顺序)
部分 字段 长度 含义
以太网首部 目的 MAC 地址 6 字节 接收方 MAC(请求时为广播FF:FF:FF:FF:FF:FF,应答时为请求方 MAC)
源 MAC 地址 6 字节 发送方 MAC 地址
帧类型 2 字节 标识上层协议,ARP 为0x0806
ARP 核心部分 硬件类型 2 字节 链路层网络类型,以太网为1
协议类型 2 字节 要转换的地址类型,IPv4 为0x0800
硬件地址长度 1 字节 MAC 地址长度,以太网为6字节
协议地址长度 1 字节 IP 地址长度,IPv4 为4字节
op(操作码) 2 字节 1=ARP 请求,2=ARP 应答
发送端 MAC 地址 6 字节 发送方 MAC 地址
发送端 IP 地址 4 字节 发送方 IP 地址
目的 MAC 地址 6 字节 接收方 MAC(请求时为全 0,应答时为请求方 MAC)
目的 IP 地址 4 字节 目标 IP 地址

注意:在以太网中,源 / 目的 MAC 在首部和 ARP 部分重复出现,这是为了兼容其他链路层协议(如令牌环),在以太网场景下属于冗余设计。

单例子:主机 A 找主机 B

假设:

  • 主机 A:IP = 192.168.1.10,MAC = AA:AA:AA:AA:AA:AA
  • 主机 B:IP = 192.168.1.20,MAC = BB:BB:BB:BB:BB:BB
1. ARP 请求(主机 A 发送)

主机 A 不知道主机 B 的 MAC,发送广播请求:

  • 以太网首部

    • 目的 MAC:FF:FF:FF:FF:FF:FF(广播)
    • 源 MAC:AA:AA:AA:AA:AA:AA
    • 帧类型:0x0806(ARP)
  • ARP 核心部分

    • 硬件类型:1(以太网)
    • 协议类型:0x0800(IPv4)
    • 硬件地址长度:6
    • 协议地址长度:4
    • op:1(请求)
    • 发送端 MAC:AA:AA:AA:AA:AA:AA
    • 发送端 IP:192.168.1.10
    • 目的 MAC:00:00:00:00:00:00(未知)
    • 目的 IP:192.168.1.20
2. ARP 应答(主机 B 回复)

主机 B 收到请求,发现 IP 匹配,单播回复:

  • 以太网首部

    • 目的 MAC:AA:AA:AA:AA:AA:AA(主机 A 的 MAC)
    • 源 MAC:BB:BB:BB:BB:BB:BB(主机 B 的 MAC)
    • 帧类型:0x0806(ARP)
  • ARP 核心部分

    • 硬件类型:1(以太网)
    • 协议类型:0x0800(IPv4)
    • 硬件地址长度:6
    • 协议地址长度:4
    • op:2(应答)
    • 发送端 MAC:BB:BB:BB:BB:BB:BB
    • 发送端 IP:192.168.1.20
    • 目的 MAC:AA:AA:AA:AA:AA:AA
    • 目的 IP:192.168.1.10
  1. 发送 ARP 请求时(主机 A → 全网)
  • 以太网首部目的 MACFF:FF:FF:FF:FF:FF(广播地址,因为不知道主机 B 的 MAC,所以发给所有人)

  • ARP 数据报目的 MAC00:00:00:00:00:00(全 0,因为此时确实不知道)

  • ARP 数据报目的 IP192.168.1.20(明确要找的主机 B 的 IP)

  1. 收到 ARP 应答时(主机 B → 主机 A)
  • 以太网首部源 MACBB:BB:BB:BB:BB:BB(主机 B 的真实 MAC,这就是我们要找的地址)

  • 以太网首部目的 MACAA:AA:AA:AA:AA:AA(主机 A 的 MAC,单播回复)

  • ARP 数据报发送端 MACBB:BB:BB:BB:BB:BB(主机 B 的 MAC,直接告诉主机 A)

  • ARP 数据报目的 MACAA:AA:AA:AA:AA:AA(主机 A 的 MAC,确认回复对象)

一句话总结

  • 请求时:因为不知道对方 MAC,所以用广播地址FFFF和全 0 来占位。

  • 应答时:对方把自己的真实 MAC 填回来,作为 "源 MAC" 发给你,而你的 MAC 则变成了 "目的 MAC"。

这样一来一回,主机 A 就成功拿到了主机 B 的 MAC 地址,并存入了 ARP 缓存表。

4.DNS

. 背景:从 hosts 文件到 DNS

  • 早期方案

    • IP 地址难记,人们用主机名(字符串)代替,并通过 hosts 文件记录主机名与 IP 的对应关系。

    • 最初由 SRI-NIC 统一管理 hosts 文件,新设备接入或 IP 变更需到中心申请更新,其他设备也需定期下载新版文件才能上网,维护成本极高。

  • DNS 诞生 :为解决 hosts 文件的维护痛点,DNS 系统应运而生。

  1. DNS 工作方式
  • 由组织的系统管理机构维护本组织内主机名与 IP 的对应数据库。

  • 新设备接入网络时,将自身信息注册到该数据库。

  • 用户输入域名时,系统自动向 DNS 服务器发起查询,服务器检索数据库并返回对应 IP 地址。

com: 一级域名 . 表示这是一个企业域名 . 同级的还有 "net"( 网络提供商 ), "org"( 非盈利组织 ) 等 .
baidu: 二级域名 , 公司名 .
www: 只是一种习惯用法 . 之前人们在使用域名时 , 往往命名成类似于 ftp.xxx.xxx/ www.xxx.xxx 这样的格 式, 来表示主机支持的
使用dig工具分析DNS过程

安装 dig 工具

bash 复制代码
yum install bind-utils

之后就可以使用 dig 指令查看域名解析过程了

cpp 复制代码
dig www.baidu.com

5.ICMP****协议

  1. 协议定位

ICMP(Internet 控制报文协议)是一个网络层协议,它基于 IP 协议工作,但本身不提供传输层功能,因此仍归为网络层协议。

  • IPv4 网络使用 ICMP

  • IPv6 网络使用 ICMPv6

  1. 核心功能

ICMP 主要解决 IP 协议 "不可靠" 的问题,提供以下关键能力:

  • 确认可达性:验证 IP 包是否成功到达目标地址。

  • 错误通知:当 IP 包在传输中被丢弃时,通知源主机丢弃的原因(如目标不可达、超时等)。

  1. 工作流程示例(目标不可达场景)

假设主机 A 要向已关机的主机 B 发送数据包:

  1. 主机 A 发送数据包,经路由器 1 转发到路由器 2。

  2. 路由器 2 需要主机 B 的 MAC 地址,开始发送 ARP 请求。

  3. 由于主机 B 已关机,多次 ARP 请求均无响应。

  4. 路由器 2 判定无法到达主机 B,向主机 A 返回一个 ICMP 目标不可达(Destination Unreachable) 报文,告知传输失败。

报文格式


ICMP 大概分为两类报文 :
一类是通知出错原因
一类是用于诊断查询

注意 , 此处 ping 的是域名 , 而不是 url! 一个域名可以通过 DNS 解析成 IP 地址 .
ping 命令不光能验证网络的连通性 , 同时也会统计响应时间和 TTL(IP 包中的 Time To Live, 生存周期 ).
ping 命令会先发送一个 ICMP Echo Request 给对端 ;
对端接收到之后 , 会返回一个 ICMP Echo Reply

telnet 是 23 端口 , ssh 是 22 端口 , 那么 ping 是什么端口 ?
ping 命令基于 ICMP, 是在网络层 . 而端口号 , 是传输层的内容 . 在 ICMP 中根本就不关注端口号这样的信息 .
traceroute 命令
也是基于 ICMP 协议实现 , 能够打印出可执行程序主机 , 一直到目标主机之前经历多少路由器

6.NAT

前面讲过NAT 和NAPT

在私有ip和公网ip那部分

Linux 网络(5)-CSDN博客

NAT技术就是公网ip和私有ip的转换

NAPT 的本质是一种 "IP + 端口" 的地址转换技术
那么问题来了 , 如果局域网内 , 有多个主机都访问同一个外网服务器 , 那么对于服务器返回的数据中 , 目的 IP 都是相同
的 . 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机 ?
这时候 NAPT 来解决这个问题了 . 使用 IP+port 来建立这个关联关系
NAT 技术的缺陷
由于 NAT 依赖这个转换表 , 所以有诸多限制 :
无法从 NAT 外部向内部服务器建立连接 ;
装换表的生成和销毁都需要额外开销 ;
通信过程中一旦 NAT 设备异常 , 即使存在热备 , 所有的 TCP 连接也都会断开
6.代理服务器
正向代理(Forward Proxy)

  • 核心逻辑 :代理代表客户端向服务器发起请求,服务器不知道真实客户端是谁。

  • 生活例子:你让在日本的表姐帮你买花王尿不湿,超市看到的买家是表姐,不知道真正想买的是你。

  • 典型场景:翻墙绕过网络限制、客户端访问受限资源。

  • 特点:客户端明确知道代理的存在,代理隐藏了客户端的身份。

  1. 反向代理(Reverse Proxy)
  • 核心逻辑 :代理代表服务器响应客户端请求,客户端不知道真实服务器是谁。

  • 生活例子:表姐囤了大量尿不湿在家,有人找她代购时,她直接从家里发货,不用再去超市。客户端以为货源在表姐家,不知道真正的货源是日本超市。

  • 典型场景:服务器负载均衡、内容缓存、隐藏后端服务器。

  • 特点:客户端不知道真实服务器的存在,代理隐藏了服务器的身份。

1. NAT vs 代理服务器
维度 NAT 代理服务器
应用定位 网络基础设备,核心解决 IPv4 地址不足 贴近具体应用,如翻墙、游戏加速、负载均衡
工作层级 网络层,直接对 IP 地址进行替换 应用层,对应用层数据(如 HTTP 请求)进行处理
部署范围 一般部署在局域网出口(如家庭 / 公司路由器) 可在局域网、广域网,甚至跨网络部署
实现形式 集成在路由器、防火墙等硬件设备中 以软件程序形式部署在独立服务器上

相关推荐
Starry_hello world1 小时前
Linux 网络(5)
linux·网络·智能路由器
S-码农2 小时前
Linux——线程
linux
刘孬孬沉迷学习2 小时前
路由算法学习( Dijkstra 算法 Bellman-Ford方程算法)
网络·学习·智能路由器·信息与通信·dijkstra算法·路由算法·bellman-ford算法
i建模2 小时前
通过Hyprland事件查看器(如`wev`)修改物理按键的扫描码
linux·运维
2501_918126912 小时前
stm32能做次声波发射器吗?
linux·stm32·嵌入式硬件·学习·个人开发
_OP_CHEN2 小时前
【Linux系统编程】(三十八)进程信号拓展:可重入函数 /volatile/SIGCHLD 全解析
linux·运维·进程·c/c++·信号·可重入函数·volatile
2501_918126912 小时前
stm32能做哪些程序?
linux·stm32·单片机·嵌入式硬件·个人开发
楼田莉子2 小时前
CMake学习:CMake在二进制工程场景上应用
linux·c++·vscode·学习·软件构建
『往事』&白驹过隙;2 小时前
瑞芯微(RK平台)调试指令常用整理
linux·arm开发·驱动开发