目录
数据链路层
对比理解 "数据链路层" 和 "网络层"
认识以太网
以太网的帧格式如下所示
认识 MAC 地址
对比理解 MAC 地址和 IP 地址
为什么需要两个地址?
实际协作示例(发送一个 HTTP 请求)
认识 MTU
MTU 对 IP 协议的影响
MTU 对 UDP 协议的影响
MTU 对于 TCP 协议的影
查看硬件地址和 MT
ARP 协议
ARP 协议的作用
ARP 协议的工作流程
想一想,为什么要有缓存表?
为什么表项要有过期时间而不是一直有效?
再想一想, 结合我们刚才讲的工作流程, ARP 的数据报应该是一个什么样的格式?
ARP 报文整体结构(IPv4 + 以太网)
二、结合例子(主机A请求主机B的MAC)
ARP 数据报的格式
数据链路层
用于两个设备(同一种数据链路节点)之间进行传递.
对比理解 "数据链路层" 和 "网络层"
网络层是规划师(地图导航),数据链路层是搬运工(开车送货)。规划师告诉搬运工下一站去哪,但搬运工只负责把货物交给下一个搬运工,而不知道最终目的地。
数据链路层:负责隔壁老王之间的通信(只关心相邻节点,通过MAC地址找邻居)。
网络层:负责跨国邮寄(从源到目的,通过IP地址找位置,规划路径)。
| 对比维度 | 数据链路层 | 网络层 |
|---|---|---|
| OSI层级 | 第2层 | 第3层 |
| 主要功能 | 在同一物理链路(如一段网线、一个Wi-Fi频段)上提供可靠传输,负责成帧、介质访问控制、差错检测(但不纠错) | 在跨不同链路、不同网络之间提供路由与转发,实现端到端的数据传输 |
| 协议数据单元(PDU) | 帧(Frame) | 数据报(Datagram,IPv4中称为包Packet) |
| 地址类型 | 物理地址(MAC地址):48位,烧录在网卡,本地唯一,扁平结构 | 逻辑地址(IP地址):32位(IPv4)或128位(IPv6),层次化(网络号+主机号),可全局路由 |
| 地址作用范围 | 同一个广播域(如一个局域网内部) | 跨越多个网络(从源到目的端) |
| 典型协议 | Ethernet(以太网)、Wi-Fi(802.11)、PPP、HDLC | IP(IPv4/v6)、ICMP、ARP(虽然ARP常被归在2.5层,但逻辑上服务于网络层) |
| 主要设备 | 网桥(Bridge)、交换机(Switch) | 路由器(Router)、三层交换机(当它做路由时) |
| 主要解决的问题 | “我如何把这一帧数据从A设备发到同一个网络中的B设备?” (即:相邻节点间的传输) | “我的数据报应该如何从源主机到达目的主机,中间经过哪些路由器?” (即:端到端路径选择) |
| 是否提供差错恢复 | 仅检错(通过FCS帧校验序列),丢弃错帧,一般不重传(由上层如TCP负责) | 不提供可靠传输(IP协议是无连接的、尽力而为的),不重传,只计算头部校验和 |
| 典型封装关系 | 将IP数据报封装为帧的数据部分 | 将TCP/UDP报文段封装为IP数据报的数据部分 |
常见易混淆点澄清
交换机(Switch)是数据链路层设备,路由器(Router)是网络层设备
交换机根据MAC地址表转发帧,不关心IP地址。
路由器根据IP路由表转发数据报,不关心MAC地址(但会通过ARP获取下一跳的MAC)。
ARP(地址解析协议)到底属于哪一层?
从功能上看,ARP用于将IP地址解析为MAC地址,服务于网络层。但从封装上看,ARP报文不经过IP层,而是直接被封装在数据链路层帧中。所以常称它为“2.5层协议”。
“可靠传输”分别由谁负责?
数据链路层不保证可靠交付(以太网只是尽力而为)。
网络层的IP协议也是不可靠的。
真正的可靠传输通常由传输层(TCP)提供,通过重传、确认等机制。
认识以太网
• "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内 容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速 率等;
• 例如以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等;
• 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线 LAN 等; 以太网帧格式
以太网的帧格式如下所示
• 源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址), 长度是 48 位,是在网 卡出厂时固化的;
• 帧协议类型字段有三种值,分别对应 IP、ARP、RARP;
• 帧末尾是 CRC 校验码。
认识 MAC 地址
• MAC 地址用来识别数据链路层中相连的节点;
• 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
• 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地 址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
对比理解 MAC 地址和 IP 地址
• IP 地址描述的是路途总体的 起点 和 终点;
• MAC 地址描述的是路途上的每一个区间的起点和终点
| 对比维度 | MAC 地址(介质访问控制地址) | IP 地址(互联网协议地址) |
|---|---|---|
| 所属层级 | 数据链路层(Layer 2) | 网络层(Layer 3) |
| 别称 | 物理地址、硬件地址 | 逻辑地址 |
| 长度与格式 | 48 位(6 字节),通常写成 12 个十六进制数,如00:1A:2B:3C:4D:5E | IPv4:32 位(4 字节),点分十进制如192.168.1.1IPv6:128 位,冒号十六进制如 2001:0db8::1 |
| 分配方式 | 由 IEEE 统一分配给网卡制造商,制造商烧录在网卡 ROM 中 | 由网络管理员或 DHCP 服务器动态/静态分配,或由系统自动生成(如本地链路地址) |
| 唯一性范围 | 全球唯一(理论上每张网卡的 MAC 地址都不同) | 网络范围内唯一(同一个 IP 网络内不能冲突,但不同网络可以使用相同私有 IP) |
| 是否可变 | 通常不可变(硬件固化),但可通过软件修改(MAC 欺骗) | 可变(可随时手动更改或自动获取新地址) |
| 主要作用 | 在同一个局域网/广播域内唯一标识一个网络接口,用于二层帧交换 | 在跨网络(互联网)中标识主机位置,用于三层路由与寻址 |
| 层次结构 | 扁平结构:前 24 位(OUI)表示制造商,后 24 位是制造商分配的唯一编号 | 层次结构:网络部分(前缀)+ 主机部分,支持路由聚合 |
| 地址解析 | 无需解析,MAC 地址直接出现在链路层帧头中 | 需要通过 ARP(IPv4)或 NDP(IPv6)将 IP 地址解析为 MAC 地址 |
| 通信范围 | 仅在同一广播域(如同一交换机下的 VLAN)有效 | 可全球路由(公网 IP),或用于私有网络(私有 IP) |
| 典型使用场景 | 交换机根据 MAC 地址表转发帧;局域网内通信 | 路由器根据 IP 路由表转发数据报;互联网任意两点通信 |
为什么需要两个地址?
MAC 地址解决的是“最后一跳”的问题:数据通过路由器到达目标局域网后,如何精确地送到那台具体的机器?交换机根据 MAC 地址完成这一任务。
IP 地址解决的是“长途导航”的问题:数据从源主机出发,经过无数路由器,如何一步步接近目标网络?路由器根据 IP 地址完成路由。
分工明确:IP 地址负责“去哪”(定位网络),MAC 地址负责“是谁”(标识设备)。
独立演进:IP 地址可以改,不依赖硬件;MAC 地址固定,保证链路层交换稳定。
实际协作示例(发送一个 HTTP 请求)
你的电脑知道目标服务器的 IP 地址(比如
93.184.216.34),但不知道它的 MAC 地址。操作系统查找路由表,发现需要先发给默认网关(路由器)。
通过 ARP 协议获得默认网关的 MAC 地址(
gateway-mac)。网络层构造 IP 数据报:源 IP
192.168.1.2,目的 IP93.184.216.34。数据链路层构造帧:源 MAC
your-pc-mac,目的 MACgateway-mac。交换机根据目的 MAC 把帧转发给路由器。
路由器剥掉帧头,查看 IP 目的地址,决定下一跳,重新封装新的帧(源 MAC 变成路由器出口的 MAC,目的 MAC 变成下一跳设备的 MAC),如此反复直到到达最终服务器所在局域网。
最后,服务器所在局域网的交换机根据 ARP 缓存,找到服务器的 MAC 地址,把帧递交给服务器。
认识 MTU
MTU 相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产 生的限制.
• 以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度不 够 46 字节,要在后面补填充位;
• 最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU;
• 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU 了,则需要对数据包进行分片(fragmentation);
• 不同的数据链路层标准的 MTU 是不同的
MTU 对 IP 协议的影响
由于数据链路层 MTU 的限制, 对于较大的 IP 数据包要进行分包
• 将较大的 IP 包分成多个小包, 并给每个小包打上标签;
• 每个小包 IP 协议头的 16 位标识(id) 都是相同的;
• 每个小包的 IP 协议头的 3 位标志字段中, 第 2 位置为 0, 表示允许分片, 第 3 位 来表示结束标记(当前是否是最后一个小包, 是的话置为 1, 否则置为 0);
• 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
• 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是 IP 层不会负 责重新传输数据;
MTU 对 UDP 协议的影响
让我们回顾一下 UDP 协议:
• 一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)), 那么就会 在网络层分成多个 IP 数据报.
• 这多个 IP 数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就 意味着, 如果 UDP 数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
MTU 对于 TCP 协议的影
让我们再回顾一下 TCP 协议:
• TCP 的一个数据报也不能无限大, 还是受制于 MTU. TCP 的单个数据报的最大 消息长度, 称为 MSS(Max Segment Size);
• TCP 在建立连接的过程中, 通信双方会进行 MSS 协商.
• 最理想的情况下, MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度 仍然是受制于数据链路层的 MTU).
• 双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值.
• 然后双方得知对方的 MSS 值之后, 选择较小的作为最终 MSS.
• MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)
MSS 和 MTU 的关系
查看硬件地址和 MT
使用 ifconfig 命令, 即可查看 ip 地址, mac 地址, 和 MTU;
ARP 协议
虽然我们在这里介绍 ARP 协议, 但是需要强调, ARP 不是一个单纯的数据链路层的协 议, 而是一个介于数据链路层和网络层之间的协议;
ARP 协议的作用
ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系.
• 在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目 的主机的硬件地址;
• 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件 地址与本机不符,则直接丢弃;
• 因此在通讯前必须获得目的主机的硬件地址;
ARP 协议的工作流程
• 源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示 广播);
• 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中;
• 每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有 过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下 次还要发 ARP 请求来获得目的主机的硬件地址
想一想,为什么要有缓存表?
核心原因:避免重复发送广播请求,提高网络效率。
如果没有缓存表:每次主机 A 要向同一局域网内的主机 B 发送 IP 数据报,A 都必须广播一个 ARP 请求(“谁有 IP 地址 X?请告诉我你的 MAC 地址”)。局域网内的所有主机都会收到这个广播,造成不必要的网络流量和 CPU 中断。
有了缓存表:当 A 第一次解析到 B 的 MAC 地址后,就把
(B的IP, B的MAC)这对映射记录在本地缓存中。后续再向 B 发送数据时,直接查表拿到 MAC 地址,无需再次广播。这极大地减少了广播帧的数量,尤其在大型局域网中效果显著。
为什么表项要有过期时间而不是一直有效?
核心原因:网络环境是动态变化的,映射关系随时可能失效。
IP 地址可以动态变化:DHCP 服务器可能给一台主机重新分配不同的 IP 地址;或者一台主机被关闭,它的 IP 被另一台主机接管。如果缓存表项永远有效,A 还使用旧的 MAC 地址去通信,就会失败。
网卡可以被更换:一台设备换了一块新网卡(MAC 地址改变),但 IP 地址可能保持不变。缓存中的旧 MAC 地址不再有效。
设备可能离开网络:笔记本电脑从一个子网移动到另一个子网(虽然跨子网不会触发 ARP,但在同一个子网内移动 IP 也可能变化)。
避免过时信息累积:让表项定期过期(例如 Linux 默认为 60 秒,Windows 为 15~45 秒),可以强制主机重新通过 ARP 确认映射关系,保证数据的准确性。
平衡效率与准确性:过期时间既不能太短(否则频繁广播,降低效率),也不能太长(无法及时反映变化)。典型的 ARP 缓存超时设置为几十秒到几分钟。
再想一想, 结合我们刚才讲的工作流程, ARP 的数据报应该是一个什么样的格式?
ARP 报文整体结构(IPv4 + 以太网)
| 字段名称 | 长度(字节) | 含义与取值(以你的例子说明) |
|---|---|---|
| 硬件类型 | 2 | 物理网络类型,以太网 = 1 |
| 协议类型 | 2 | 上层协议,IPv4 = 0x0800 |
| 硬件地址长度 | 1 | MAC地址长度,以太网 = 6 |
| 协议地址长度 | 1 | IP地址长度,IPv4 = 4 |
| 操作码 (op) | 2 | 1 = ARP 请求,2 = ARP 应答 |
| 发送端 MAC 地址 | 6 | 源主机的 MAC 地址(如 A 的 MAC) |
| 发送端 IP 地址 | 4 | 源主机的 IP 地址(如 A 的 IP:172.20.1.1) |
| 目标 MAC 地址 | 6 | 请求中填 0(未知),应答中填 B 的 MAC |
| 目标 IP 地址 | 4 | 想要解析的目标 IP 地址(如 B 的 IP:172.20.1.2) |
二、结合例子(主机A请求主机B的MAC)
1、 ARP 请求包(广播)
操作码 = 1
发送端 MAC =
08:00:20:74:CE:EC(主机A的MAC)发送端 IP =
172.20.1.1目标 MAC =
00:00:00:00:00:00(全0,表示未知)目标 IP =
172.20.1.2
封装在以太网帧中:
目的MAC地址 =
FF:FF:FF:FF:FF:FF(广播)源MAC地址 = 主机A的MAC
以太类型 =
0x0806
2、ARP 应答包(单播)
操作码 = 2
发送端 MAC =
08:00:20:74:CE:EC(主机B的MAC,注意这里是B的MAC)发送端 IP =
172.20.1.2目标 MAC = 主机A的MAC(从请求中的发送端MAC拷贝过来)
目标 IP =
172.20.1.1
封装在以太网帧中:
目的MAC地址 = 主机A的MAC(单播)
源MAC地址 = 主机B的MAC
以太类型 =
0x0806
注意:
ARP 请求:目标MAC字段为0,以太网帧的目标地址为广播地址。
ARP 应答:所有地址字段都填满,以太网帧的目标地址为请求方的单播MAC。
为什么请求中目标MAC是0:因为发起请求时还不知道对方的MAC,所以先填空,由接收方填写后返回。
为什么不直接用IP地址通信:数据链路层(交换机、网卡)只认MAC地址,所以必须解析。
ARP 数据报的格式
| 字段名称 | 长度(字节) | 含义与取值(以你的例子说明) |
|---|---|---|
| 硬件类型 | 2 | 物理网络类型,以太网 = 1 |
| 协议类型 | 2 | 上层协议,IPv4 = 0x0800 |
| 硬件地址长度 | 1 | MAC地址长度,以太网 = 6 |
| 协议地址长度 | 1 | IP地址长度,IPv4 = 4 |
| 操作码 (op) | 2 | 1 = ARP 请求,2 = ARP 应答 |
| 发送端 MAC 地址 | 6 | 源主机的 MAC 地址(如 A 的 MAC) |
| 发送端 IP 地址 | 4 | 源主机的 IP 地址(如 A 的 IP:172.20.1.1) |
| 目标 MAC 地址 | 6 | 请求中填 0(未知),应答中填 B 的 MAC |
| 目标 IP 地址 | 4 | 想要解析的目标 IP 地址(如 B 的 IP:172.20.1.2) |
• 注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次, 对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必 要的。
• 硬件类型指链路层网络类型,1 为以太网;
• 协议类型指要转换的地址类型,0x0800 为 IP 地址;
• 硬件地址长度对于以太网地址为 6 字节;
• 协议地址长度对于和 IP 地址为 4 字节;
•op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答