【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协议,请点赞收藏!网络编程,从理解数据链路层开始!

相关推荐
Lsetea6 小时前
OpenSSL verify报unhandled critical extension:error 34与关键扩展排查
运维·https·ssl证书·openssl·证书链
汤姆yu6 小时前
Gemini 4 Argon模型综述:技术、能力与实际使用指南
网络·安全·web安全·ai·大模型
guo_wen_qiang6 小时前
docker的备份与迁移
运维·docker·容器
Seraphina366 小时前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql
Ruiery7 小时前
Linux 6.6内核内存管理深度解析(一):物理内存初始化 — memblock 怎么把内存交给 buddy
linux·运维·服务器
2401_868534787 小时前
无线网络规划设计
服务器·网络
螺蛳粉 螺蛳粉7 小时前
第二篇:keepalived VRRP 原理篇:协议与 VIP 漂移机制深入解析
网络·智能路由器·负载均衡·keepalived·高可用
库拉镜像AI牛牛8 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
天蓝蓝的本我8 小时前
conda日常用到的命令积累1-登录linux,安装pycharm
linux·pycharm·conda
Android系统攻城狮8 小时前
Linux Gstreamer深度解析之gst_audio_encoder_get_frame_max调用流程与实战(五十九)
linux·运维·服务器·gstreamer音视频·音视频进阶·gstreamer音视频进阶