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

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

这张图里的 "IP 数据报" 部分,需要从两个层面理解:
- 承载它的以太网帧(整个大框) :属于数据链路层的封装,包括目的 MAC、源 MAC、类型字段(0800)、数据段和 CRC 校验,都是链路层的内容。
- "IP 数据报" 本身(数据段里的内容) :属于网络层的协议数据单元(PDU),是网络层(IP 协议)的核心内容,被链路层封装在以太网帧中进行传输。
简单说:
- 以太网帧(含 MAC 头、类型、CRC)是链路层的 "快递盒";
- IP 数据报是网络层的 "包裹内容",被装进链路层的 "快递盒" 里传输。
所以,"IP 数据报" 这几个字代表的是网络层 的内容,而它所在的整个以太网帧结构是链路层的封装。
-
以太网帧结构:整个以太网帧都属于链路层封装,包括:
-
目的 MAC 地址、源 MAC 地址(6 字节)
-
类型字段(2 字节,标识上层协议)
-
数据段(46~1500 字节,承载上层数据)
-
CRC 校验码(4 字节,链路层错误检测)
-
-
MAC 地址:48 位硬件地址,用于标识链路内相邻节点,是链路层的专属地址。
-
链路层协议载体:
-
ARP 请求 / 应答(类型
0806) -
RARP 请求 / 应答(类型
8035)(注:ARP/RARP 报文封装在以太网帧中,属于链路层承载的内容,为网络层服务)
-
mac地址和ip地址的区别 前面提过
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 对大包进行分片处理,核心规则如下:
-
分片规则:
-
将大 IP 包拆分为多个小包,每个小包的 IP 首部 16 位标识(ID)相同,表示属于同一个原始包。
-
IP 首部 3 位标志字段:
-
第 2 位(DF 位):
0表示允许分片,1表示禁止分片(若包超过 MTU 则直接丢弃); -
第 3 位(MF 位):
0表示是最后一个小包,1表示还有后续小包。
-
-
-
重组与丢包:
-
接收端会按顺序重组分片,但任意一个分片丢失,重组就会失败;
-
IP 层不负责重传丢失的分片,丢包需由上层协议(如 TCP)处理。
-
三、MTU 对 UDP 协议的影响
UDP 本身无重传机制,受 MTU 影响更明显:
-
当 UDP 携带的数据超过 1472 字节(以太网 MTU 1500 - 20 字节 IP 头 - 8 字节 UDP 头)时,会在网络层被分片为多个 IP 数据报。
-
任意一个分片丢失,都会导致整个 UDP 数据报重组失败,因此 UDP 在网络层分片时,丢包概率大幅增加。
四、MTU 对 TCP 协议的影响
TCP 通过 MSS 协商避免分片,提升可靠性:
-
MSS(最大段大小) :TCP 单个数据报的最大消息长度,受 MTU 限制,理想值为
MSS = MTU - IP头(20) - TCP头(20)(以太网 MTU1500 时,MSS=1460)。 -
MSS 协商过程:
-
TCP 建立连接(SYN 包)时,双方会在 TCP 首部写入自己能支持的 MSS 值;
-
最终选择双方 MSS 中较小的那个作为通信的 MSS,确保数据不被分片。
-
-
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 丢失):只收到分片 2(偏移 10)、分片 3(偏移 20)。→ 依据:同 ID 的分片里,没有「片偏移 = 0」的起始分片(原始包得从 0 开始),直接判定缺失起始部分,不连续。
-
缺中部(分片 2 丢失):只收到分片 1(偏移 0)、分片 3(偏移 20)。→ 依据:同 ID 的分片偏移值从 0 直接跳到 20,中间缺了 10 这个 "位置序号",数值不连续,判定缺失中间部分。
-
缺最后部(分片 3 丢失):只收到分片 1(偏移 0,MF=1)、分片 2(偏移 10,MF=1)。→ 依据:所有收到的分片 MF 位都是 1(表示还有后续),且始终没收到「同 ID 里片偏移最大、且 MF=0」的分片,等待超时后判定缺失最后部分。
MTU = 网络一次最多能发多大的一包数据 。包超过 MTU → 必须拆成小碎片发。碎片只要丢一个,整包就废。
- MTU 对 TCP 的影响
TCP 是乖孩子、老司机:
-
它会自动探测 MTU ,主动把包压到 MTU 以内,尽量不被分片。
-
就算真被分片、丢了碎片,TCP 会重传整个包,保证数据不丢。
MTU 对 TCP 的影响:
-
MTU 太小 → TCP 只能发小包 → 速度慢、效率低。
-
MTU 正常 → TCP 跑满,稳得一批。
总结:MTU 影响 TCP 快慢,但不影响可靠性。
- MTU 对 UDP 的影响
UDP 是愣头青、不管不顾:
-
它根本不看 MTU,你让它发多大,它就发多大。
-
超过 MTU → 必被分片。
-
分片后只要丢任意一小片 → 整个 UDP 包直接丢掉,且不重传、不通知。
MTU 对 UDP 的影响:
-
MTU 越小 → UDP 越容易被分片 → 越容易丢包。
-
分片 = UDP 高危时刻。
总结:MTU 直接决定 UDP 稳不稳定,大了直接炸。
- 两者最核心的区别(超级好记)
-
TCP:会躲 MTU,丢了会重传,稳但慢一点。
-
UDP:不躲 MTU,丢了直接没,快但容易崩。
用比喻秒懂
MTU = 马路最大限宽
-
TCP:知道限宽,自动把车改小,不超宽;撞坏了就重新拉货。
-
UDP:不管限宽,超宽就被拆成几截;丢一截,整批货全没,还不补货。
3.ARP协议
建立主机 IP 地址 ↔ MAC 地址 的映射关系。
-
应用层知道目的 IP 和端口,但网卡处理数据包时,需要硬件地址(MAC)才能正确投递。
-
如果网卡收到的数据包目的 MAC 与本机不符,会直接丢弃,因此通讯前必须获取目的主机的 MAC 地址。
-
工作流程(结合图示)
-
发起请求:主机 A(172.20.1.1)要和主机 B(172.20.1.2)通信,先查 ARP 缓存表,若没有 B 的 MAC,就发送 ARP 请求。
-
广播请求 :ARP 请求包中,目标 IP 是 172.20.1.2,MAC 地址填 "?",并以广播形式(目的 MAC 为
FF:FF:FF:FF:FF:FF)发送到本网段。 -
接收响应 :主机 B 收到广播,发现目标 IP 与自己一致,就发送 ARP 响应包,把自己的 MAC 地址(
08:00:20:74:CE:EC)和 IP 地址一起发给 A。 -
更新缓存:主机 A 收到响应后,将 B 的 IP-MAC 映射关系存入 ARP 缓存表。
- ARP 缓存表
-
每台主机都维护一张 ARP 缓存表,用
arp -a命令查看(如图中示例)。 -
表项有过期时间(一般为 20 分钟),若 20 分钟内未再次使用该表项,表项失效,下次通讯需重新发起 ARP 请求。
-
思考题解答
-
**为什么要有缓存表?**避免每次通讯都发送 ARP 请求,减少网络广播,提升通讯效率。
-
**为什么表项要有过期时间?**网络拓扑可能变化(如主机更换网卡、IP 地址变更),过期后重新请求能保证 IP-MAC 映射关系的准确性,避免通讯失败。
-
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)
- 目的 MAC:
-
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)
- 目的 MAC:
-
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
- 硬件类型:
- 发送 ARP 请求时(主机 A → 全网)
-
以太网首部目的 MAC :
FF:FF:FF:FF:FF:FF(广播地址,因为不知道主机 B 的 MAC,所以发给所有人) -
ARP 数据报目的 MAC :
00:00:00:00:00:00(全 0,因为此时确实不知道) -
ARP 数据报目的 IP :
192.168.1.20(明确要找的主机 B 的 IP)
- 收到 ARP 应答时(主机 B → 主机 A)
-
以太网首部源 MAC :
BB:BB:BB:BB:BB:BB(主机 B 的真实 MAC,这就是我们要找的地址) -
以太网首部目的 MAC :
AA:AA:AA:AA:AA:AA(主机 A 的 MAC,单播回复) -
ARP 数据报发送端 MAC :
BB:BB:BB:BB:BB:BB(主机 B 的 MAC,直接告诉主机 A) -
ARP 数据报目的 MAC :
AA: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 系统应运而生。
- 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****协议
- 协议定位
ICMP(Internet 控制报文协议)是一个网络层协议,它基于 IP 协议工作,但本身不提供传输层功能,因此仍归为网络层协议。
-
IPv4 网络使用 ICMP
-
IPv6 网络使用 ICMPv6
- 核心功能
ICMP 主要解决 IP 协议 "不可靠" 的问题,提供以下关键能力:
-
确认可达性:验证 IP 包是否成功到达目标地址。
-
错误通知:当 IP 包在传输中被丢弃时,通知源主机丢弃的原因(如目标不可达、超时等)。
- 工作流程示例(目标不可达场景)
假设主机 A 要向已关机的主机 B 发送数据包:
-
主机 A 发送数据包,经路由器 1 转发到路由器 2。
-
路由器 2 需要主机 B 的 MAC 地址,开始发送 ARP 请求。
-
由于主机 B 已关机,多次 ARP 请求均无响应。
-
路由器 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那部分
NAT技术就是公网ip和私有ip的转换
NAPT 的本质是一种 "IP + 端口" 的地址转换技术
那么问题来了 , 如果局域网内 , 有多个主机都访问同一个外网服务器 , 那么对于服务器返回的数据中 , 目的 IP 都是相同
的 . 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机 ?
这时候 NAPT 来解决这个问题了 . 使用 IP+port 来建立这个关联关系
NAT 技术的缺陷
由于 NAT 依赖这个转换表 , 所以有诸多限制 :
无法从 NAT 外部向内部服务器建立连接 ;
装换表的生成和销毁都需要额外开销 ;
通信过程中一旦 NAT 设备异常 , 即使存在热备 , 所有的 TCP 连接也都会断开
6.代理服务器
正向代理(Forward Proxy)
-
核心逻辑 :代理代表客户端向服务器发起请求,服务器不知道真实客户端是谁。
-
生活例子:你让在日本的表姐帮你买花王尿不湿,超市看到的买家是表姐,不知道真正想买的是你。
-
典型场景:翻墙绕过网络限制、客户端访问受限资源。
-
特点:客户端明确知道代理的存在,代理隐藏了客户端的身份。
- 反向代理(Reverse Proxy)
-
核心逻辑 :代理代表服务器响应客户端请求,客户端不知道真实服务器是谁。
-
生活例子:表姐囤了大量尿不湿在家,有人找她代购时,她直接从家里发货,不用再去超市。客户端以为货源在表姐家,不知道真正的货源是日本超市。
-
典型场景:服务器负载均衡、内容缓存、隐藏后端服务器。
-
特点:客户端不知道真实服务器的存在,代理隐藏了服务器的身份。

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