【Linux】数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南

文章目录

    • [数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南](#数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南)
    • 一、数据链路层的作用
      • [1.1 什么是数据链路层](#1.1 什么是数据链路层)
      • [1.2 数据链路层 vs 网络层](#1.2 数据链路层 vs 网络层)
      • [1.3 为什么需要两层地址](#1.3 为什么需要两层地址)
    • 二、以太网技术
      • [2.1 什么是以太网](#2.1 什么是以太网)
      • [2.2 以太网帧格式](#2.2 以太网帧格式)
        • [1. 目的MAC地址(6字节)](#1. 目的MAC地址(6字节))
        • [2. 源MAC地址(6字节)](#2. 源MAC地址(6字节))
        • [3. 类型/长度字段(2字节)](#3. 类型/长度字段(2字节))
        • [4. 数据字段(46-1500字节)](#4. 数据字段(46-1500字节))
        • [5. CRC校验码(4字节)](#5. CRC校验码(4字节))
      • [2.3 以太网的工作原理](#2.3 以太网的工作原理)
        • [1. CSMA/CD(载波侦听多路访问/冲突检测)](#1. CSMA/CD(载波侦听多路访问/冲突检测))
        • [2. 交换机的工作原理](#2. 交换机的工作原理)
    • 三、MAC地址
      • [3.1 认识MAC地址](#3.1 认识MAC地址)
      • [3.2 MAC地址的特点](#3.2 MAC地址的特点)
        • [1. 出厂时固化](#1. 出厂时固化)
        • [2. 通常不能修改](#2. 通常不能修改)
        • [3. 局域网内唯一](#3. 局域网内唯一)
      • [3.3 MAC地址 vs IP地址](#3.3 MAC地址 vs IP地址)
    • 四、MTU(最大传输单元)
      • [4.1 什么是MTU](#4.1 什么是MTU)
      • [4.2 MTU的限制原因](#4.2 MTU的限制原因)
      • [4.3 MTU对IP协议的影响](#4.3 MTU对IP协议的影响)
        • [1. IP分片的过程](#1. IP分片的过程)
        • [2. IP首部的分片字段](#2. IP首部的分片字段)
        • [3. IP分片的问题](#3. IP分片的问题)
      • [4.4 MTU对UDP协议的影响](#4.4 MTU对UDP协议的影响)
        • [1. UDP数据包的大小限制](#1. UDP数据包的大小限制)
        • [2. UDP的最佳实践](#2. UDP的最佳实践)
      • [4.5 MTU对TCP协议的影响](#4.5 MTU对TCP协议的影响)
        • [1. MSS(最大报文段长度)](#1. MSS(最大报文段长度))
        • [2. MSS协商](#2. MSS协商)
        • [3. MSS和MTU的关系](#3. MSS和MTU的关系)
        • [4. TCP避免IP分片](#4. TCP避免IP分片)
    • 五、ARP协议
      • [5.1 为什么需要ARP协议](#5.1 为什么需要ARP协议)
      • [5.2 ARP协议的工作流程](#5.2 ARP协议的工作流程)
        • 场景设定
        • [Step 1:发送ARP请求(广播)](#Step 1:发送ARP请求(广播))
        • [Step 2:接收ARP请求](#Step 2:接收ARP请求)
        • [Step 3:发送ARP应答(单播)](#Step 3:发送ARP应答(单播))
        • [Step 4:接收ARP应答并缓存](#Step 4:接收ARP应答并缓存)
      • [5.3 ARP数据报格式](#5.3 ARP数据报格式)
      • [5.4 ARP缓存表](#5.4 ARP缓存表)
        • [1. 什么是ARP缓存表](#1. 什么是ARP缓存表)
        • [2. ARP缓存表的特点](#2. ARP缓存表的特点)
        • [3. 免费ARP(Gratuitous ARP)](#3. 免费ARP(Gratuitous ARP))
    • 六、ARP实战应用
      • [6.1 ARP协议的完整过程演示](#6.1 ARP协议的完整过程演示)
        • [Step 1:判断目标是否在同一子网](#Step 1:判断目标是否在同一子网)
        • [Step 2:获取网关的MAC地址](#Step 2:获取网关的MAC地址)
        • [Step 3:封装以太网帧](#Step 3:封装以太网帧)
        • [Step 4:网关转发](#Step 4:网关转发)
        • [Step 5:逐跳转发](#Step 5:逐跳转发)
        • [Step 6:到目标](#Step 6:到目标)
      • [6.2 ARP欺骗原理](#6.2 ARP欺骗原理)
        • [1. 什么是ARP欺骗](#1. 什么是ARP欺骗)
        • [2. ARP欺骗的原理](#2. ARP欺骗的原理)
        • [3. 双向ARP欺骗](#3. 双向ARP欺骗)
      • [6.3 ARP欺骗的防范](#6.3 ARP欺骗的防范)
        • [1. 静态ARP绑定](#1. 静态ARP绑定)
        • [2. ARP防护软件](#2. ARP防护软件)
        • [3. 交换机端口安全](#3. 交换机端口安全)
        • [4. 使用加密协议](#4. 使用加密协议)
        • [5. 网络隔离](#5. 网络隔离)
    • 七、本篇总结
      • [7.1 核心要点](#7.1 核心要点)
      • [7.2 容易混淆的点](#7.2 容易混淆的点)

数据链路层与以太网详解:从 MAC 地址到 ARP 的完整指南

💬 开篇 :前面我们学习了网络层的IP协议,它负责跨越多个网络的端到端传输。但在同一个局域网内,数据是如何传输的?两台在同一交换机下的电脑如何找到对方?这就是数据链路层的职责。数据链路层是网络协议栈中非常重要的一层,它定义了物理网络上的数据传输格式(以太网帧)、设备标识(MAC地址)、以及IP地址到物理地址的映射(ARP协议)。理解了数据链路层,你就理解了局域网是如何工作的,也就理解了为什么网络层和数据链路层缺一不可。这一篇会详细讲解以太网帧格式、MAC地址、MTU对各层协议的影响、ARP协议的工作原理,以及ARP欺骗的原理和防范。

👍 点赞、收藏与分享:这篇会把数据链路层讲透,包括以太网帧结构、MAC地址与IP地址的区别、MTU的重要性、ARP协议的完整工作流程,以及ARP欺骗的实战分析。如果对你有帮助,请点赞收藏!

🚀 循序渐进:从数据链路层的作用讲起,到以太网标准,到MAC地址,到MTU的影响,到ARP协议,到ARP实战应用,一步步掌握数据链路层的核心知识。


一、数据链路层的作用

1.1 什么是数据链路层

数据链路层的核心任务

bash 复制代码
在同一个数据链路(局域网)上,将数据从一个设备传输到另一个设备

数据链路的概念

bash 复制代码
数据链路是指在物理层之上建立的,能够在两个或多个节点之间传输数据的通信链路
典型的数据链路:以太网、Wi-Fi、PPP(点对点协议)

类比:唐僧取经的白龙马

bash 复制代码
唐僧要从长安到西天取经:

* 整个旅程:长安 → 西天(网络层负责)
* 每一段路程:驿站A → 驿站B → 驿站C(数据链路层负责)
* 交通工具:白龙马(物理层)

网络通信也是一样:

* 整个通信:北京电脑 → 上海电脑(网络层负责)
* 每一跳:路由器A → 路由器B → 路由器C(数据链路层负责)
* 传输介质:网线、光纤、无线电波(物理层)

1.2 数据链路层 vs 网络层

对比理解

特性 网络层 数据链路层
作用范围 端到端(可跨越多个网络) 点到点(同一数据链路内)
地址类型 IP地址(逻辑地址) MAC地址(物理地址)
寻址范围 全球范围 局域网范围
核心设备 路由器 交换机
典型协议 IP、ICMP 以太网、Wi-Fi
主要功能 选择路径(路由) 帧封装、差错检测

形象理解

bash 复制代码
寄快递的例子:

网络层:

* 写上完整地址:"上海市浦东新区XX路XX号"
* 快递公司规划路线:北京 → 天津 → 济南 → 南京 → 上海
* 这是整体的、端到端的路径规划

数据链路层:

* 每一段具体的运输:"北京分拣中心 → 天津分拣中心"
* 使用具体的车牌号识别车辆
* 每个分拣中心只关心"下一站是哪里"
* 这是局部的、点到点的传输

再举个例子

bash 复制代码
你在北京,要访问上海的一台服务器(180.10.1.100)

网络层(IP协议):

* 你的IP:123.123.123.123
* 目标IP:180.10.1.100
* 路径:你的路由器 → 运营商路由器1 → ... → 上海的路由器

数据链路层(以太网):

* 第一跳:你的电脑(MAC: AA:BB:CC:DD:EE:FF) → 你的路由器(MAC: 11:22:33:44:55:66)
* 第二跳:你的路由器 → 运营商路由器1
* ...
* 最后一跳:上海的路由器 → 目标服务器

每一跳都使用MAC地址来标识源和目的设备

1.3 为什么需要两层地址

问题:既然有了IP地址,为什么还需要MAC地址?

答案:IP地址和MAC地址各有各的用途,缺一不可。

IP地址的特点

bash 复制代码
* 逻辑地址,可以灵活分配
* 描述网络拓扑结构(网络号+主机号)
* 用于全局范围的寻址
* 可以改变(换网络、DHCP重新分配)

MAC地址的特点

bash 复制代码
* 物理地址,出厂时固化
* 不描述网络拓扑结构
* 用于局域网内的直接通信
* 基本不变(除非换网卡)

为什么两者都需要

1. 灵活性

bash 复制代码
如果只用MAC地址:

* 路由表会变得巨大(每个MAC地址一条路由)
* 无法根据网络拓扑优化路由
* 设备移动到新网络,MAC不变,路由无法更新

有了IP地址:

* 路由表只需要记录网络号
* 根据网络拓扑聚合路由
* 设备移动到新网络,获得新IP,路由自动正确

2. 分层解耦

bash 复制代码
网络层只关心"怎么到达目标网络"
数据链路层只关心"怎么在局域网内传输"
两层各司其职,互不干扰

例子

bash 复制代码
你从家里的WiFi换到公司的WiFi:

* MAC地址:不变(网卡没换)
* IP地址:改变(192.168.1.100 → 10.0.0.50)
* 路由器根据新IP正确路由数据包

二、以太网技术

2.1 什么是以太网

以太网(Ethernet)

bash 复制代码
不是一种具体的网络,而是一种技术标准
定义了局域网的工作方式

以太网标准包含的内容

bash 复制代码
1. 数据链路层的内容:

   * 帧格式
   * MAC地址
   * 访问控制方式

2. 物理层的内容:

   * 网线类型(双绞线)
   * 传输速率(10M、100M、1000M、10G)
   * 网络拓扑结构(星型、总线型)

以太网的发展

标准 速率 名称 出现时间
10BASE-T 10 Mbps 以太网 1980年代
100BASE-TX 100 Mbps 快速以太网 1990年代
1000BASE-T 1 Gbps 千兆以太网 2000年左右
10GBASE-T 10 Gbps 万兆以太网 2010年左右

以太网的地位

bash 复制代码
以太网是目前应用最广泛的局域网技术
家庭、公司、学校、数据中心都在用

其他局域网技术:

* 令牌环网(Token Ring):已淘汰
* 无线LAN(Wi-Fi):无线局域网,也遵循类似的标准
* FDDI:光纤局域网,用于骨干网

2.2 以太网帧格式

以太网帧的整体结构

bash 复制代码
┌──────────┬──────────┬──────────┬───────────────┬────────┐
│ 目的MAC6  │ 源MAC6   │ 类型2    │ 数据46~1500   │ FCS/CRC4│
└──────────┴──────────┴──────────┴───────────────┴────────┘
1. 目的MAC地址(6字节)

作用:标识接收方的网卡地址。

格式

bash 复制代码
6个字节,48位
通常用冒号分隔的16进制表示
例如:AA:BB:CC:DD:EE:FF

特殊值

bash 复制代码
FF:FF:FF:FF:FF:FF:广播地址
发送给局域网内所有设备
2. 源MAC地址(6字节)

作用:标识发送方的网卡地址。

格式:与目的MAC地址相同。

3. 类型/长度字段(2字节)

作用:标识上层协议的类型。

常见的类型值

类型值 协议
0x0800 IPv4
0x0806 ARP
0x8035 RARP
0x86DD IPv6

例子

bash 复制代码
如果类型字段=0x0800
说明这个以太网帧的数据部分是一个IP数据包
网卡收到后,会把数据部分交给IP层处理
4. 数据字段(46-1500字节)

最小长度:46字节

bash 复制代码
如果上层协议的数据不足46字节,需要填充(Padding)
例如:ARP数据包只有28字节,需要填充18字节

最大长度:1500字节

bash 复制代码
这个1500字节的限制就是MTU(最大传输单元)
超过1500字节的数据需要在网络层分片

为什么有最小长度限制

bash 复制代码
为了保证冲突检测机制的正常工作,如果帧太短,可能在冲突发生前就已经发送完毕。无法检测到冲突
这部分具体计算涉及到CSMA/CD协议,争用期51.2us,以太网标准传播速率10Mbps。
发送时延必须大于争用期,所以最小发送数据大小为512比特,即64字节

注意:最小帧长 64B 不包含前导码和帧起始定界符;在交换机全双工网络里 CSMA/CD 基本不再使用,但帧格式和最小帧长仍保留。

5. CRC校验码(4字节)

作用:检测传输过程中是否发生错误。

算法

bash 复制代码
CRC-32(循环冗余校验)
接收方重新计算CRC
如果计算结果与接收到的CRC不一致,说明数据损坏,丢弃该帧

注意

bash 复制代码
数据链路层只负责检测错误,不负责纠正错误
如果发现错误,直接丢弃
由上层协议(如TCP)负责重传

2.3 以太网的工作原理

1. CSMA/CD(载波侦听多路访问/冲突检测)

早期以太网的访问控制方式(总线型以太网):

CSMA(Carrier Sense Multiple Access)

bash 复制代码
CS(Carrier Sense,载波侦听):

* 发送前先侦听信道是否空闲
* 如果有其他设备在发送,等待

MA(Multiple Access,多路访问):

* 多个设备共享同一条总线
* 任何设备都可以发送

CD(Collision Detection,冲突检测)

bash 复制代码
即使侦听了,仍可能发生冲突(两个设备同时侦听到空闲,同时发送)
检测到冲突后,立即停止发送
等待随机时间后重试

现代以太网

bash 复制代码
使用交换机而不是总线
每个端口是独立的,不会发生冲突
CSMA/CD已经相对不重要了
2. 交换机的工作原理

交换机维护一个MAC地址表

MAC地址 端口号
AA:BB:CC:DD:EE:FF 1
11:22:33:44:55:66 2
FF:EE:DD:CC:BB:AA 3

学习过程

bash 复制代码
1. 交换机收到一个帧
2. 查看源MAC地址
3. 记录"这个MAC地址在哪个端口"
4. 更新MAC地址表

转发过程

bash 复制代码
1. 交换机收到一个帧
2. 查看目的MAC地址
3. 查找MAC地址表
4. 如果找到,从对应端口发出
5. 如果没找到目的 MAC,交换机会做"未知单播泛洪"(除入端口外向所有端口转发),直到学到该 MAC 所在端口。

例子

bash 复制代码
设备A(MAC: AA:AA:AA:AA:AA:AA,端口1)
发送数据给设备B(MAC: BB:BB:BB:BB:BB:BB,端口2)

交换机的处理:

1. 收到帧,源MAC=AA:AA:AA:AA:AA:AA
2. 记录:AA:AA:AA:AA:AA:AA在端口1
3. 查看目的MAC=BB:BB:BB:BB:BB:BB
4. 查表:BB:BB:BB:BB:BB:BB在端口2
5. 从端口2发出(只发给端口2,不发给其他端口)

这样,端口3、端口4的设备不会收到这个帧
提高了网络效率,增加了安全性

三、MAC地址

3.1 认识MAC地址

MAC(Media Access Control)地址

bash 复制代码
也叫物理地址、硬件地址、以太网地址
用于在数据链路层标识网络设备

长度

bash 复制代码
48位 = 6字节

表示方法

bash 复制代码
16进制,用冒号或短横线分隔

例如:
08:00:27:03:FB:19
08-00-27-03-FB-19
0800.2703.FB19(Cisco格式)

结构

bash 复制代码
┌────────────────────────┬────────────────────────┐
│   厂商标识(OUI)       │   网卡序列号            │
│      24位              │        24位             │
└────────────────────────┴────────────────────────┘

OUI(Organizationally Unique Identifier):

* 由IEEE分配给各个厂商
* 全球唯一
* 例如:

  * 08:00:27 → Oracle VirtualBox
  * 00:1C:42 → Parallels(虚拟机)
  * 00:50:56 → VMware

查看MAC地址

bash 复制代码
# Linux
ifconfig
ip addr

# Windows
ipconfig /all

# macOS
ifconfig

例子

bash 复制代码
$ ifconfig eth0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0
        ether 08:00:27:03:fb:19  txqueuelen 1000  (Ethernet)
        ↑
        这就是MAC地址

3.2 MAC地址的特点

1. 出厂时固化
bash 复制代码
网卡生产时,厂商会给每块网卡分配一个唯一的MAC地址
烧录在网卡的ROM中
理论上全球唯一
2. 通常不能修改
bash 复制代码
物理MAC地址固化在硬件中,不能修改

但是:
1. 某些网卡支持修改MAC地址(修改的是软件层面的,硬件层面不变)
2. 虚拟机的MAC地址可以修改
3. 操作系统可以临时修改MAC地址(重启后恢复)
3. 局域网内唯一
bash 复制代码
同一局域网内,MAC地址必须唯一
否则会发生冲突

但是:
- 不同局域网的MAC地址可以重复(虽然理论上全球唯一,但实际可能重复)
- 虚拟机的MAC地址可能冲突(虚拟机软件随机生成)

3.3 MAC地址 vs IP地址

对比

特性 MAC地址 IP地址
层次 数据链路层 网络层
长度 48位(6字节) 32位(4字节,IPv4)
分配方式 厂商分配,出厂固化 网络管理员分配或DHCP动态分配
作用范围 局域网内 全球范围
是否可变 基本不变 经常变化
是否唯一 理论上全球唯一 私有IP可以重复,公网IP全球唯一
是否有层次结构 无(只有厂商标识和序列号) 有(网络号+主机号)

类比:身份证 vs 地址

bash 复制代码
MAC地址 → 身份证号:
- 出生时分配
- 终身不变
- 全国唯一
- 没有层次结构(不能看出你在哪个省份)

IP地址 → 家庭住址:
- 可以改变(搬家)
- 有层次结构(省/市/区/街道/门牌号)
- 描述了你在网络中的位置

为什么需要两种地址

bash 复制代码
快递的例子:

IP地址:快递面单上的地址
- 描述目的地:"北京市朝阳区XX路XX号"
- 用于长距离路由

MAC地址:快递员的对讲机号
- 在小区内,快递员之间用对讲机联系
- "3号楼的快递员,有你的包裹"
- 用于短距离通信

两者配合:
- 跨城市运输:用地址(IP)
- 小区内投递:用对讲机号(MAC)

四、MTU(最大传输单元)

4.1 什么是MTU

MTU(Maximum Transmission Unit,最大传输单元)

bash 复制代码
数据链路层一次能传输的最大数据包大小

类比:快递包裹尺寸限制

bash 复制代码
快递公司规定:
- 单个包裹最大尺寸:60cm × 40cm × 40cm
- 超过这个尺寸,必须拆分成多个包裹

MTU也是一样:
- 以太网规定:单个帧最大1500字节
- 超过这个大小,必须在网络层分片

不同网络的MTU

网络类型 MTU
以太网 1500字节
PPPoE(宽带拨号) 1492字节
Wi-Fi 通常1500字节
令牌环网 4464字节
FDDI 4352字节

查看MTU

bash 复制代码
# Linux
ifconfig

# Windows
netsh interface ipv4 show interfaces

# 输出示例:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
                                                      ↑
                                                   这是MTU

4.2 MTU的限制原因

为什么要限制MTU

1. 硬件限制

bash 复制代码
网卡的缓冲区大小有限
帧太大,缓冲区放不下

2. 错误恢复

bash 复制代码
帧越大,出错的概率越高
一旦出错,重传的代价越大

小帧的好处:
- 出错概率小
- 重传代价小

3. 公平性

bash 复制代码
如果允许发送巨大的帧
一个设备可能长时间占用信道
其他设备无法发送

4. 延迟

bash 复制代码
帧越大,发送时间越长
增加延迟

例如:
10Mbps的网络,发送1500字节的帧
传输时间 = 1500 × 8 / 10,000,000 = 1.2ms

如果允许发送15000字节的帧
传输时间 = 15000 × 8 / 10,000,000 = 12ms

4.3 MTU对IP协议的影响

问题:如果IP数据包超过MTU怎么办?

答案:IP分片(Fragmentation)。

1. IP分片的过程

场景

bash 复制代码
发送一个数据部分为5000字节的IP数据包
以太网MTU=1500字节
需要分片

分片过程

bash 复制代码
原始IP数据包:
┌────────────┬────────────────────────────────┐
│  IP首部    │        数据(5000字节)         │
│  (20字节)  │                                │
└────────────┴────────────────────────────────┘

分片后:

片1:
┌────────────┬────────────────────────────────┐
│  IP首部    │     数据1(1480字节)          │
│  (20字节)  │                                │
└────────────┴────────────────────────────────┘
总长度:1500字节 ✓

片2:
┌────────────┬────────────────────────────────┐
│  IP首部    │     数据2(1480字节)          │
│  (20字节)  │                                │
└────────────┴────────────────────────────────┘
总长度:1500字节 ✓

片3:
┌────────────┬────────────────────────────────┐
│  IP首部    │     数据3(1480字节)          │
│  (20字节)  │                                │
└────────────┴────────────────────────────────┘
总长度:1500字节 ✓

片4:
┌────────────┬────────────────────┐
│  IP首部    │  数据4(560字节)  │
│  (20字节)  │                    │
└────────────┴────────────────────┘
总长度:580字节 ✓

计算:
1480 + 1480 + 1480 + 560 = 5000字节 ✓
2. IP首部的分片字段

标识字段(16位)

bash所有分片的标识字段都相同 复制代码
用于重组时识别属于同一个数据包

例如:
片1: 标识=12345
片2: 标识=12345
片3: 标识=12345
片4: 标识=12345

标志字段(3位)

bash 复制代码
┌──────┬──────┬──────┐
│ 保留 │  DF  │  MF  │
└──────┴──────┴──────┘

DF(Don't Fragment,禁止分片):
- DF=0:允许分片
- DF=1:禁止分片(如果超过MTU,丢弃并返回ICMP错误)

MF(More Fragments,更多分片):
- MF=1:后面还有分片
- MF=0:这是最后一个分片

分片偏移字段(13位)

bash 复制代码
表示当前分片在原始数据中的偏移位置
单位:8字节

例如:
片1: 偏移=0(0×8=0)
片2: 偏移=185(185×8=1480)
片3: 偏移=370(370×8=2960)
片4: 偏移=555(555×8=4440)

完整示例

bash 复制代码
片1:
- 标识:12345
- MF:1(还有更多分片)
- 偏移:0
- 数据:0-1479字节

片2:
- 标识:12345
- MF:1
- 偏移:185(1480字节)
- 数据:1480-2959字节

片3:
- 标识:12345
- MF:1
- 偏移:370(2960字节)
- 数据:2960-4439字节

片4:
- 标识:12345
- MF:0(最后一个分片)
- 偏移:555(4440字节)
- 数据:4440-4999字节
3. IP分片的问题

问题1:任意一个分片丢失,整个数据包丢失

bash 复制代码
发送4个分片:片1、片2、片3、片4
如果片2丢失了
接收方无法重组完整的数据包
整个数据包丢失

结果:
- 浪费了片1、片3、片4的传输
- 接收方需要等待超时才能确认丢失
- 效率低下

问题2:IP层不负责重传

bash 复制代码
IP是不可靠的协议
分片丢失了,IP层不会重传
需要上层协议(TCP)重传整个数据包

问题3:分片增加丢包概率

bash 复制代码
原本1个数据包的丢包概率:p
分成4个分片后,任意一个丢失就失败

成功概率 = (1-p)^4
丢失概率 = 1 - (1-p)^4 ≈ 4p(p很小时)

丢包概率增加了约4倍!

结论

bash 复制代码
尽量避免IP分片
在传输层控制数据包大小,避免分片

4.4 MTU对UDP协议的影响

1. UDP数据包的大小限制

计算

bash 复制代码
以太网MTU:1500字节
- IP首部:20字节
- UDP首部:8字节
= UDP数据部分最大:1472字节

如果超过1472字节

bash 复制代码
UDP数据包会在IP层被分片
带来前面提到的所有分片问题
2. UDP的最佳实践

建议

bash 复制代码
UDP数据部分不要超过1472字节
避免IP分片
提高传输可靠性

例子

bash 复制代码
// 错误做法:发送3000字节的UDP数据
char data[3000];
sendto(sock, data, 3000, ...);
// 会在IP层分成3个分片,任意一个丢失就失败

// 正确做法:发送多个小于1472字节的UDP数据包
char data1[1400];
char data2[1400];
char data3[200];
sendto(sock, data1, 1400, ...);
sendto(sock, data2, 1400, ...);
sendto(sock, data3, 200, ...);
// 分成3个独立的UDP数据包,一个丢失不影响其他

注意:1472 只是在 IPv4+以太网 MTU=1500 且无 IP 选项时成立;实际链路可能因为 PPPoE/VLAN/IPv6 变小,应以路径 MTU 为准。

4.5 MTU对TCP协议的影响

1. MSS(最大报文段长度)

MSS(Maximum Segment Size)

bash 复制代码
TCP单个报文段的最大数据长度
不包括TCP首部和IP首部

计算

bash 复制代码
以太网MTU:1500字节
- IP首部:20字节
- TCP首部:20字节
= TCP数据部分最大:1460字节

MSS = 1460字节
2. MSS协商

过程

bash 复制代码
TCP建立连接时(三次握手),双方会协商MSS

客户端                                服务器
   |                                     |
   | SYN, MSS=1460                       |
   |------------------------------------>|
   |                                     |
   |                 SYN+ACK, MSS=1460   |
   |<------------------------------------|
   |                                     |
   | ACK                                 |
   |------------------------------------>|
   |                                     |
   
双方协商的结果:MSS = min(1460, 1460) = 1460

MSS选项的位置

bash 复制代码
TCP首部的选项字段中
Kind=2表示MSS选项
Length=4
Value=MSS值

为什么要协商MSS

bash 复制代码
1. 双方的网络环境可能不同
   - 一方是以太网(MTU=1500)
   - 另一方是PPPoE(MTU=1492)
   - 需要选择较小的MSS

2. 避免IP分片
   - MSS设置合理,TCP报文不会超过MTU
   - 不会在IP层分片
3. MSS和MTU的关系
4. TCP避免IP分片

TCP的优势

bash 复制代码
通过MSS协商,TCP可以保证:
- 每个TCP报文段 ≤ MSS
- TCP报文段 + TCP首部 + IP首部 ≤ MTU
- 不会在IP层分片

对比UDP

bash 复制代码
UDP:
- 没有MSS机制
- 应用层可以发送任意大小的数据
- 超过MTU就分片
- 应用层需要自己控制数据大小

TCP:
- 有MSS机制
- TCP自动把应用层的数据切分成不超过MSS的报文段
- 不会IP分片
- 应用层不需要关心MTU

例子

bash 复制代码
应用层要发送10000字节的数据

通过TCP:
1. TCP把10000字节切分成多个报文段
   - 报文段1:1460字节
   - 报文段2:1460字节
   - ...
   - 报文段7:1460字节
   - 报文段8:780字节
2. 每个报文段都不超过MSS
3. 不会IP分片

通过UDP:
1. UDP直接发送10000字节
2. 在IP层分成7个分片
3. 任意一个分片丢失,整个数据包丢失

五、ARP协议

5.1 为什么需要ARP协议

问题的由来

bash 复制代码
网络层使用IP地址
数据链路层使用MAC地址

发送数据包时:
- 知道目标IP地址(应用层提供)
- 不知道目标MAC地址(需要查询)

没有目标MAC地址,以太网帧就无法封装和发送

ARP的作用

bash 复制代码
建立IP地址到MAC地址的映射关系
通过IP地址查询对应的MAC地址

类比:通过电话号码查地址

bash 复制代码
你知道朋友的电话号码(IP地址)
但不知道朋友的家庭住址(MAC地址)
需要打电话问朋友:"你家在哪?"(ARP请求)
朋友告诉你地址(ARP应答)
然后你才能寄快递

5.2 ARP协议的工作流程

场景设定
bash 复制代码
主机A:
- IP地址:192.168.1.100
- MAC地址:AA:AA:AA:AA:AA:AA

主机B:
- IP地址:192.168.1.200
- MAC地址:BB:BB:BB:BB:BB:BB

主机A要发送数据给主机B
知道B的IP地址:192.168.1.200
不知道B的MAC地址
Step 1:发送ARP请求(广播)

主机A的操作

bash 复制代码
1. 检查本地ARP缓存表
2. 没有找到192.168.1.200对应的MAC地址
3. 发送ARP请求

ARP请求的内容

bash 复制代码
发送方IP:192.168.1.100
发送方MAC:AA:AA:AA:AA:AA:AA
目标IP:192.168.1.200
目标MAC:00:00:00:00:00:00(未知,填全0)

广播方式

bash 复制代码
以太网帧的目的MAC地址:FF:FF:FF:FF:FF:FF(广播地址)
局域网内所有主机都会收到这个ARP请求

广播的内容

bash 复制代码
"我是192.168.1.100(MAC: AA:AA:AA:AA:AA:AA)
 请问192.168.1.200的MAC地址是多少?"

这就是"为什么会出现两份 MAC"的本质原因。

Step 2:接收ARP请求

局域网内所有主机的反应

bash 复制代码
主机B(192.168.1.200):
- 收到ARP请求
- 发现目标IP是自己
- 准备发送ARP应答

主机C(192.168.1.150):
- 收到ARP请求
- 发现目标IP不是自己
- 丢弃这个请求

主机D(192.168.1.250):
- 收到ARP请求
- 发现目标IP不是自己
- 丢弃这个请求
Step 3:发送ARP应答(单播)

主机B的操作

bash 复制代码
1. 提取发送方的IP和MAC地址
2. 更新自己的ARP缓存表:192.168.1.100 → AA:AA:AA:AA:AA:AA
3. 发送ARP应答给主机A

ARP应答的内容

bash 复制代码
发送方IP:192.168.1.200
发送方MAC:BB:BB:BB:BB:BB:BB
目标IP:192.168.1.100
目标MAC:AA:AA:AA:AA:AA:AA

单播方式

bash 复制代码
以太网帧的目的MAC地址:AA:AA:AA:AA:AA:AA(主机A的MAC)
只发送给主机A,不广播

应答的内容

bash 复制代码
"我是192.168.1.200
 我的MAC地址是BB:BB:BB:BB:BB:BB"
Step 4:接收ARP应答并缓存

主机A的操作

bash 复制代码
1. 收到主机B的ARP应答
2. 提取目标IP和MAC地址
3. 更新ARP缓存表:192.168.1.200 → BB:BB:BB:BB:BB:BB
4. 现在可以发送数据了

完整流程图

bash 复制代码
主机A                                          主机B
(192.168.1.100)                        (192.168.1.200)
    |                                          |
    | 查询ARP缓存,没有找到                     |
    |                                          |
    | ARP请求(广播)                           |
    | "谁是192.168.1.200?"                    |
    |----------------------------------------->|
    |                                          |
    |                                          | 更新缓存
    |                                          | 准备应答
    |                                          |
    |                 ARP应答(单播)           |
    |            "我是,MAC是BB:BB:BB:BB:BB:BB" |
    |<-----------------------------------------|
    |                                          |
    | 更新缓存                                  |
    | 现在可以发送数据了                         |
    |                                          |
    | 发送数据包                                |
    | 目的MAC: BB:BB:BB:BB:BB:BB               |
    |----------------------------------------->|
    |                                          |

关键点:ARP 报文的目标 MAC vs 以太网帧头的目的 MAC

  • ARP 请求时:ARP 报文里的目标 MAC(tha)填 00:00:00:00:00:00(未知)
  • 但以太网帧头的目的 MAC 必须填 FF:FF:FF:FF:FF:FF(广播), 否则交换机/网卡不知道该把帧交给谁,目标主机也收不到请求
  • ARP 应答时:两者都填请求者的 MAC(单播)

👉ARP 是一个运行在数据链路层与网络层之间的辅助协议,为了适配不同链路层技术,它必须在自身报文中携带硬件地址字段,因此在以太网环境下会出现 MAC 地址在帧头和 ARP 报文中各出现一次的现象。

5.3 ARP数据报格式

ARP数据报的结构

bash 复制代码
┌────────────────────────────────────────────────────┐
│              以太网帧首部                           │
├──────────┬──────────┬──────────┬──────────────────┤
│ 目的MAC  │ 源MAC    │ 类型     │                  │
│ (6字节)  │ (6字节)  │ (2字节)  │                  │
│          │          │ 0x0806   │                  │
└──────────┴──────────┴──────────┴──────────────────┘
                                  │
                                  v
┌────────────────────────────────────────────────────┐
│                    ARP数据报                        │
├────────────────────┬───────────────────────────────┤
│  硬件类型(2字节)   │  协议类型(2字节)              │
├────────────────────┼───────────────────────────────┤
│  硬件地址长度(1)   │  协议地址长度(1)              │
├────────────────────┴───────────────────────────────┤
│              操作类型(2字节)                        │
├────────────────────────────────────────────────────┤
│         发送方MAC地址(6字节)                        │
├────────────────────────────────────────────────────┤
│         发送方IP地址(4字节)                         │
├────────────────────────────────────────────────────┤
│         目标MAC地址(6字节)                          │
├────────────────────────────────────────────────────┤
│         目标IP地址(4字节)                           │
└────────────────────────────────────────────────────┘

各字段详解

1. 硬件类型(2字节)

bash 复制代码
指定链路层网络类型
1 = 以太网
6 = IEEE 802

2. 协议类型(2字节)

bash 复制代码
指定要转换的地址类型
0x0800 = IPv4
0x86DD = IPv6

3. 硬件地址长度(1字节)

bash 复制代码
MAC地址的长度
以太网 = 6字节

4. 协议地址长度(1字节)

bash 复制代码
IP地址的长度
IPv4 = 4字节
IPv6 = 16字节

5. 操作类型(2字节)

bash 复制代码
1 = ARP请求
2 = ARP应答
3 = RARP请求
4 = RARP应答

6. 发送方MAC地址(6字节)

bash 复制代码
发送方的硬件地址

7. 发送方IP地址(4字节)

bash 复制代码
发送方的协议地址

8. 目标MAC地址(6字节)

bash 复制代码
目标的硬件地址
ARP请求时填全0(未知)
ARP应答时填实际的MAC地址

9. 目标IP地址(4字节)

bash 复制代码
目标的协议地址

ARP请求示例

bash 复制代码
硬件类型:1(以太网)
协议类型:0x0800(IPv4)
硬件地址长度:6
协议地址长度:4
操作类型:1(ARP请求)
发送方MAC:AA:AA:AA:AA:AA:AA
发送方IP:192.168.1.100
目标MAC:00:00:00:00:00:00(未知)
目标IP:192.168.1.200

5.4 ARP缓存表

1. 什么是ARP缓存表

定义

bash 复制代码
每台主机都维护一个ARP缓存表
记录IP地址到MAC地址的映射关系
避免每次通信都发送ARP请求

查看ARP缓存表

bash 复制代码
# Linux/Mac
arp -a

# Windows
arp -a

# 输出示例:
? (192.168.1.1) at aa:bb:cc:dd:ee:ff on en0 ifscope [ethernet]
? (192.168.1.100) at 11:22:33:44:55:66 on en0 ifscope [ethernet]
2. ARP缓存表的特点

表项有过期时间

bash 复制代码
通常是20分钟
如果20分钟内没有使用某个表项,则该表项失效
下次通信需要重新发送ARP请求

为什么要有过期时间

bash 复制代码
1. IP地址可能会改变
   - DHCP重新分配IP
   - 设备重新配置IP
   - 需要更新映射关系

2. MAC地址可能会改变
   - 更换网卡
   - 虚拟机重启(MAC可能改变)
   - 需要更新映射关系

3. 设备可能下线
   - 设备关机
   - 设备离开网络
   - 不需要保留映射关系

4. 节省内存
   - 不常用的映射关系可以删除
   - 避免缓存表无限增长

例子

bash 复制代码
场景:公司网络,使用DHCP

上午9点:
- 你的电脑获得IP:192.168.1.100
- 同事的电脑:192.168.1.101
- 你的ARP缓存:192.168.1.101 → MAC_A

中午12点:
- 同事关机
- DHCP回收192.168.1.101

下午1点:
- 新同事的电脑开机
- DHCP分配192.168.1.101(IP相同)
- 但MAC地址是MAC_B(不同)

下午2点:
- 你的ARP缓存过期(20分钟)
- 你要发数据给192.168.1.101
- 重新发送ARP请求
- 获得新的MAC地址MAC_B
- 更新缓存:192.168.1.101 → MAC_B

如果没有过期机制:
- 你的缓存仍然是192.168.1.101 → MAC_A
- 发送数据到错误的MAC地址
- 通信失败
3. 免费ARP(Gratuitous ARP)

定义

bash 复制代码
主机主动发送ARP请求,通告自己的IP和MAC地址
目标IP是自己的IP地址

用途

1. 检测IP地址冲突

bash 复制代码
主机配置了新IP地址后,发送免费ARP
如果收到应答,说明有其他主机使用了相同的IP
IP地址冲突!

2. 更新其他主机的ARP缓存

bash 复制代码
主机的MAC地址改变后(更换网卡)
发送免费ARP,通知其他主机更新缓存

3. 主机上线通知

bash 复制代码
主机开机后,发送免费ARP
让其他主机知道"我上线了"

六、ARP实战应用

6.1 ARP协议的完整过程演示

完整通信场景

bash 复制代码
主机A(192.168.1.100)要访问百度(180.101.49.11)
Step 1:判断目标是否在同一子网
bash 复制代码
主机A的配置:
- IP:192.168.1.100
- 子网掩码:255.255.255.0
- 网关:192.168.1.1

判断过程:
1. 目标IP:180.101.49.11
2. 目标IP AND 子网掩码 = 180.101.49.0
3. 本机IP AND 子网掩码 = 192.168.1.0
4. 180.101.49.0 ≠ 192.168.1.0
5. 结论:目标不在同一子网,需要通过网关
Step 2:获取网关的MAC地址
bash 复制代码
主机A需要把数据包发送给网关
需要知道网关的MAC地址

1. 查询ARP缓存:192.168.1.1的MAC地址
2. 如果没有,发送ARP请求(广播):
   "谁是192.168.1.1?"
3. 网关回复ARP应答(单播):
   "我是192.168.1.1,MAC是GW:GW:GW:GW:GW:GW"
4. 主机A更新ARP缓存
Step 3:封装以太网帧
bash 复制代码
IP数据包:
- 源IP:192.168.1.100
- 目标IP:180.101.49.11

以太网帧:
- 源MAC:AA:AA:AA:AA:AA:AA(主机A)
- 目标MAC:GW:GW:GW:GW:GW:GW(网关)
  注意:目标MAC是网关,不是百度的MAC!

主机A发送帧到网关
Step 4:网关转发
bash 复制代码
网关收到帧:
1. 提取IP数据包
2. 查看目标IP:180.101.49.11
3. 查询路由表,确定下一跳
4. 重新封装以太网帧:
   - 源MAC:网关的WAN口MAC
   - 目标MAC:下一跳路由器的MAC(通过ARP查询)
5. 从WAN口发送

注意:
- IP数据包的源IP和目标IP不变
- 但每一跳的源MAC和目标MAC都会改变
Step 5:逐跳转发
bash 复制代码
数据包经过多个路由器:
路由器1 → 路由器2 → ... → 百度的路由器

每一跳:
1. 查询ARP,获取下一跳的MAC地址
2. 重新封装以太网帧
3. 转发

IP数据包的首部不变
但以太网帧的首部每一跳都变化
Step 6:到目标
bash 复制代码
百度的路由器:
1. 收到数据包
2. 查看目标IP:180.101.49.11
3. 判断目标在同一子网
4. 查询ARP缓存:180.101.49.11的MAC地址
5. 如果没有,发送ARP请求
6. 百度服务器回复ARP应答
7. 路由器封装以太网帧,发送给百度服务器

完整流程图

bash 复制代码
主机A                       网关                    百度
(192.168.1.100)      (192.168.1.1)         (180.101.49.11)
     |                      |                       |
     | ARP请求:"谁是192.168.1.1?"                 |
     |--------------------->|                       |
     | ARP应答:"我是,MAC=GW:GW:GW:GW:GW:GW"       |
     |<---------------------|                       |
     |                      |                       |
     | 以太网帧:           |                       |
     | 源MAC=AA:AA:..      |                       |
     | 目的MAC=GW:GW:..    |                       |
     | IP包:源IP=192.168.1.100                    |
     |      目的IP=180.101.49.11                   |
     |--------------------->|                       |
     |                      |                       |
     |                      | 转发(多跳)           |
     |                      |---------------------->|
     |                      |                       |

6.2 ARP欺骗原理

1. 什么是ARP欺骗

定义

bash 复制代码
攻击者发送伪造的ARP应答
欺骗其他主机,让他们更新ARP缓存为错误的映射
从而劫持流量或进行中间人攻击

危害

bash 复制代码
1. 流量劫持:攻击者可以截获通信内容
2. 中间人攻击:攻击者可以篡改数据
3. 拒绝服务:攻击者可以丢弃数据包
2. ARP欺骗的原理

场景

bash 复制代码
受害者A:192.168.1.100,MAC=AA:AA:AA:AA:AA:AA
网关:192.168.1.1,MAC=GW:GW:GW:GW:GW:GW
攻击者:192.168.1.50,MAC=AT:AT:AT:AT:AT:AT

正常情况

bash 复制代码
受害者A的ARP缓存:
192.168.1.1 → GW:GW:GW:GW:GW:GW

受害者A发送数据:
目标MAC=GW:GW:GW:GW:GW:GW(网关)
数据正常通过网关转发到互联网

攻击过程

Step 1:攻击者发送伪造的ARP应答

bash 复制代码
攻击者发送ARP应答(无需请求):
- 发送方IP:192.168.1.1(冒充网关)
- 发送方MAC:AT:AT:AT:AT:AT:AT(攻击者的MAC)
- 目标IP:192.168.1.100(受害者A)
- 目标MAC:AA:AA:AA:AA:AA:AA

内容:"我是 192.168.1.1(网关),我的 MAC 是 AT:AT:AT:AT:AT:AT。"


受害者A收到ARP应答
虽然没有发送ARP请求,但仍然会更新缓存

更新后的ARP缓存:
192.168.1.1 → AT:AT:AT:AT:AT:AT(攻击者的MAC)

错误的映射!

Step 3:受害者A发送数据

bash 复制代码
受害者A发送数据到互联网:
目标MAC=AT:AT:AT:AT:AT:AT(攻击者,而不是真正的网关)

数据被发送到攻击者!

Step 4:攻击者处理数据

bash 复制代码
攻击者收到数据后,有多种选择:

选择1:丢弃数据

* 受害者无法上网
* 拒绝服务攻击

选择2:转发数据

* 把数据转发给真正的网关
* 同时记录或篡改数据
* 中间人攻击

选择3:伪造响应

* 返回伪造的数据
* 欺骗受害者

完整流程图

bash 复制代码
受害者A            攻击者            真正的网关
(192.168.1.100)  (192.168.1.50)   (192.168.1.1)
|                 |                  |
| 正常ARP缓存:    |                  |
| 192.168.1.1→GW:GW:GW:GW:GW:GW   |
|                 |                  |
|                 | 伪造的ARP应答:    |
|                 | "我是192.168.1.1  |
|                 |  MAC=AT:AT:AT:AT" |
|<----------------|                  |
|                 |                  |
| 更新ARP缓存:    |                  |
| 192.168.1.1→AT:AT:AT:AT:AT:AT   |
|                 |                  |
| 发送数据:       |                  |
| 目标MAC=AT:AT:AT:AT:AT:AT        |
|---------------->|                  |
|                 | (截获数据)        |
|                 |                  |
|                 | 转发数据给真网关  |
|                 |----------------->|
|                 |                  |
|                 |<-----------------|
|                 | 转发响应给受害者  |
|<----------------|                  |
| (受害者不知道被劫持)               |
3. 双向ARP欺骗

更隐蔽的攻击

bash 复制代码
攻击者不仅欺骗受害者,还欺骗网关

攻击过程

Step 1:欺骗受害者

bash 复制代码
发送ARP应答给受害者:
"我是网关(192.168.1.1),MAC=AT:AT:AT:AT:AT:AT"

受害者的ARP缓存:
192.168.1.1 → AT:AT:AT:AT:AT:AT

Step 2:欺骗网关

bash 复制代码
发送ARP应答给网关:
"我是受害者(192.168.1.100),MAC=AT:AT:AT:AT:AT:AT:AT"
网关的ARP缓存:
192.168.1.100→ AT:AT:AT:AT:AT:AT

结果

bash 复制代码
受害者 → 攻击者 → 网关
网关 → 攻击者 → 受害者

双向流量都经过攻击者
完全的中间人攻击

6.3 ARP欺骗的防范

1. 静态ARP绑定

方法

bash 复制代码
手动绑定IP和MAC的映射关系
不接受ARP应答更新

Linux命令

bash 复制代码
# 添加静态ARP表项
sudo arp -s 192.168.1.1 GW:GW:GW:GW:GW:GW

# 查看ARP表
arp -a

Windows命令

cmd 复制代码
# 添加静态ARP表项
arp -s 192.168.1.1 GW-GW-GW-GW-GW-GW

优点

bash 复制代码
完全防止ARP欺骗

缺点

bash 复制代码
需要手动维护
网络变化时需要更新
不适合大型网络
2. ARP防护软件

功能

bash 复制代码
监控ARP流量
检测异常的ARP应答
自动阻止或告警

常见软件

bash 复制代码
- ARP防火墙
- 360 ARP防护
- 金山ARP防火墙
3. 交换机端口安全

方法

bash 复制代码
在交换机上绑定端口和MAC地址
只允许特定MAC地址的设备连接到特定端口

配置示例(Cisco)

bash 复制代码
# 进入接口配置模式
interface FastEthernet0/1

# 启用端口安全
switchport mode access
switchport port-security

# 设置最大MAC地址数量
switchport port-security maximum 1

# 设置允许的MAC地址
switchport port-security mac-address AA:BB:CC:DD:EE:FF

# 设置违规动作(关闭端口)
switchport port-security violation shutdown
4. 使用加密协议

原理

bash 复制代码
即使流量被劫持,也无法解密

常用协议

bash 复制代码
HTTPS:加密HTTP流量
SSH:加密远程登录
VPN:加密所有流量
5. 网络隔离

方法

bash 复制代码
使用VLAN隔离不同的网络
即使被ARP欺骗,也只影响同一VLAN内的设备

七、本篇总结

7.1 核心要点

数据链路层的作用

  • 在同一数据链路(局域网)内传输数据
  • 使用MAC地址标识设备
  • 封装成帧、差错检测
  • 与网络层配合,实现端到端通信

以太网技术

  • 最广泛的局域网技术标准
  • 定义了帧格式、MAC地址、传输速率等
  • 帧格式:目的MAC + 源MAC + 类型 + 数据 + CRC
  • 数据长度:46-1500字节

MAC地址

  • 48位物理地址,出厂固化
  • 用冒号分隔的16进制表示
  • 前24位是厂商标识,后24位是序列号
  • 局域网内唯一,用于数据链路层寻址

MTU(最大传输单元)

  • 数据链路层一次能传输的最大数据包大小
  • 以太网MTU=1500字节
  • 超过MTU的IP数据包需要分片
  • TCP通过MSS协商避免IP分片
  • UDP需要应用层控制数据大小

ARP协议

  • 建立IP地址到MAC地址的映射
  • 通过广播ARP请求,单播ARP应答
  • 维护ARP缓存表,表项有过期时间(20分钟)
  • 是介于网络层和数据链路层之间的协议

ARP欺骗

  • 通过伪造ARP应答欺骗其他主机
  • 可以劫持流量、进行中间人攻击
  • 防范方法:静态ARP绑定、ARP防护软件、交换机端口安全、加密协议

7.2 容易混淆的点

  1. MAC地址 vs IP地址

    • MAC地址:物理地址,数据链路层,局域网范围,出厂固化
    • IP地址:逻辑地址,网络层,全球范围,可以改变
  2. MTU vs MSS

    • MTU:数据链路层的最大传输单元,包括所有首部
    • MSS:TCP的最大报文段长度,只指TCP数据部分
    • MSS = MTU - IP首部 - TCP首部
  3. ARP请求 vs ARP应答

    • ARP请求:广播,询问IP对应的MAC地址
    • ARP应答:单播,告知MAC地址
  4. 同一子网 vs 不同子网的通信

    • 同一子网:直接ARP查询目标主机的MAC
    • 不同子网:ARP查询网关的MAC,把数据发给网关
  5. 以太网帧的目的MAC vs IP数据包的目的IP

    • 目的MAC:下一跳的MAC地址(可能是网关,也可能是目标主机)
    • 目的IP:最终目标的IP地址(始终不变)

💬 总结 :数据链路层是网络协议栈中承上启下的一层,它把网络层的IP数据包封装成帧,通过MAC地址在局域网内传输。以太网是最常用的数据链路层技术,定义了帧格式、MAC地址、MTU等。ARP协议是连接网络层和数据链路层的桥梁,通过IP地址查询MAC地址,使得网络层的路由和数据链路层的传输能够配合工作。理解了数据链路层,你就理解了局域网是如何工作的,也就理解了为什么发送一个数据包需要同时使用IP地址和MAC地址。

👍 点赞、收藏与分享:如果这篇帮你理解了数据链路层、以太网、MAC地址、MTU和ARP协议,请点赞收藏!网络编程,从理解数据链路层开始!

相关推荐
xiaoliuliu123451 小时前
Xftp-7.0.0109p文件传输安装步骤详解(附FTP/SFTP连接与文件传输教程)
运维·服务器
小鸡食米2 小时前
LVS(Linux Virtual Server)
运维·服务器·网络
Ronin3052 小时前
【Linux网络】Socket编程:UDP网络编程实现ChatServer
linux·网络·udp
User_芊芊君子2 小时前
WebSocket实时通信入门,感谢我的好搭档脉脉
网络·人工智能·websocket·网络协议·测评
码农阿豪2 小时前
解决HTTP 413错误:请求实体过大(Request Entity Too Large)的终极指南
网络·网络协议·http
面向对象World3 小时前
正点原子Mini Linux 4.3寸800x480触摸屏gt115x驱动
linux·服务器·数据库
天上飞的粉红小猪3 小时前
传输层UDP&&TCP
网络·tcp/ip·udp
~央千澈~3 小时前
抖音弹幕游戏开发之第12集:添加冷却时间机制·优雅草云桧·卓伊凡
java·服务器·前端
17(无规则自律)3 小时前
LubanCat 2烧录一个新镜像后开发环境搭建
linux·嵌入式硬件·考研·软件工程