🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:计算机网络
🌹往期回顾🌹:【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑
🔖流水不争,争的是滔滔不息
- 一、数据链路层
- 二、以太网帧格式
- 三、MTU对IP协议的影响
-
- [MTU 对 UDP 协议的影响](#MTU 对 UDP 协议的影响)
- [MTU 对于 TCP 协议的影响](#MTU 对于 TCP 协议的影响)
- 四、ARP协议
一、数据链路层
数据链路层是OSI模型中的第二层,位于物理层之上、网络层之下。主要负责在直接相连的节点间进行可靠的数据传输,通过帧(Frame)的形式组织数据,并处理物理层可能引入的比特级错误。其核心功能包括帧封装、错误检测、流量控制和介质访问控制(MAC)。
数据链路层 vs 网络层
网络转发,本质是在子网和子网之间进行转发。网络层的ip协议的ip地址的概念,使得报文传输有了源ip地址和目的ip地址。但是在报完从源主机到目的主机途中要经过许多路由器,最终才能把报文交给目的主机。我们把源主机到目的主机途中的一台主机到一台路由器,一台路由器到一台路由器,看做一个子网,所以说在同一个子网中,一个主机怎么把数据交给另一台主机(路由器) ,解决这一局域网通信的问题是由数据链路层来解决的。链路层通过MAC地址和ARP协议,完成子网内的报文交付,从而解决了局域网通信的问题。
网络通信传输数据不是目的,是手段。交换应用层的报文才是目的。
网络层负责"跨子网"走得远,链路层负责"同子网"走得通。
认识以太网
"以太网"不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN 等;
二、以太网帧格式

目的地址和源地址是网卡中硬件地址(也叫MAC地址),长度48位,网卡出场时候就带的。帧协议类型字段有三种值,分别对应IP、ARP、RARP。帧尾是CRC效验码。
分离与封装,因为MAC帧是固定的。分用看帧类型。
MAC地址
MAC 地址用来识别数据链路层中相连的节点。
长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)
MAC地址vsIP地址(网络基础那篇说过)
IP地址描述的是路途总体的起点和终点。
MAC地址描述的是路途上的每一个区间的起点和终点。
网络层负责"跨子网"走得远,链路层负责"同子网"走得通。
三、MTU对IP协议的影响
由于数据链路层 MTU 的限制, 对于较大的 IP 数据包要进行分包。
将较大的 IP 包分成多个小包, 并给每个小包打上标签。每个小包 IP 协议头的 16 位标识(id) 都是相同的。每个小包的 IP 协议头的 3 位标志字段中, 第 2 位置为 0, 表示允许分片, 第 3 位来表示结束标记(当前是否是最后一个小包, 是的话置为 1, 否则置为 0)。到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层。一旦这些小包中任意一个小包丢失, 接收端的重组就会失败.,但是 IP 层不会负责重新传输数据。
不同机器的MTU的大小不一样。
MTU 对 UDP 协议的影响
一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)), 那么就会在网络层分成多个 IP 数据报。
这多个 IP 数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果 UDP 数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。
MTU 对于 TCP 协议的影响
TCP 的一个数据报也不能无限大, 还是受制于 MTU. TCP 的单个数据报的最大消息长度, 称为 MSS(Max Segment Size); MSS说白了就是去掉IP报头和TCP报头剩下的部分。
TCP 在建立连接的过程中, 通信双方会进行 MSS 协商。最理想的情况下, MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值。然后双方得知对方的 MSS 值之后, 选择较小的作为最终 MSS。MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)。
四、ARP协议
引入ARP
主机A为什么要把数据交给主机B?
从路由角度
路由是指在网络中决定数据包从源主机(主机A)传输到目标主机(主机B)的路径的过程。路由器(或具有路由功能的设备)通过以下步骤决定数据是否能到达主机B:
IP地址解析:主机A发送数据时,会附上目标主机B的IP地址。路由器根据目标IP地址查询路由表,决定数据包的下一跳(next hop)。
路由表:路由表包含网络地址、子网掩码、下一跳地址等信息,路由器根据这些信息选择最佳路径。
转发决策:如果路由表中存在通往主机B的路径,数据包会被转发到正确的接口,最终到达主机B;如果没有合适的路径,数据包可能被丢弃或返回错误。
因此,路由决定了数据包是否能从主机A到达主机B,以及通过哪条路径到达。
为什么以太网数据帧有最小和最大长度限制?
以太网本质上是一个共享式的通信介质,也就是说,所有主机在同一时间内共享同一个通信信道。局域网就是一个碰撞域,任何时刻只能有一台设备发送数据帧,否则就会发生冲突(碰撞)。
这种通信方式就像多个线程访问一个临界资源:谁先抢到资源谁就可以操作,其他人必须等待。
正因为以太网是一种竞争访问机制,所以:
-
帧不能太短:太短的话发送完了都还没来得及检测碰撞,冲突就无法被发现;
-
帧也不能太长:太长会占用信道太久,其他设备等待时间过长,降低网络效率;
-
帧不能太多:否则容易造成拥塞和碰撞频繁;
-
帧也不能太少:否则信道利用率太低。
因此,以太网帧设计了最小长度(64 字节)和最大长度(1518 字节,不含扩展字段),这个范围是经过精心计算和平衡的,刚好满足可靠性与效率之间的需求。
为什么我们只知道目标主机的ip啊,不知道对方的MAC地址啊,是如何发给对方数据帧的?
需要一种协议,把IP转换为对应的MAC地址,这个协议是ARP协议。
数据帧是报文在链路层封装后的结果,包含报文以及传输所需的控制信息。在网络物理层上流动的数据是数据帧
ARP 不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。
ARP的功能
ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系。
ARP的主要功能是将网络层的IP地址解析为数据链路层的MAC地址,以便在局域网(LAN)内进行数据帧的传输。
在数据链路层,设备通过MAC地址进行通信,而ARP负责建立IP地址与MAC地址的映射 ,因此它被视为数据链路层的协议。
ARP数据包被封装在数据帧中(如以太网帧),直接在链路层传输。
在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址。
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
因此在通讯前必须获得目的主机的硬件地址。
ARP协议通过对目的IP的广播,让这个局域网内的主机都收到,各个主机进行进行判断,目标主机收到进行应答,返回去的是MAC地址。
注意:局域网中,任何主机可能收到ARP请求,也可能收到ARP应答。
ARP 数据报的格式

注意到源 MAC 地址、 目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
- 硬件类型指链路层网络类型,1 为以太网;
- 协议类型指要转换的地址类型,0x0800 为 IP 地址;
- 硬件地址长度对于以太网地址为 6 字节;
- 协议地址长度对于和 IP 地址为 4 字节;
- op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
ARP过程

假如路由器传来源主机的报完要找这个局域网中的目的主机E。在路由器的数据链路层的ARP协议会对ARP数据报进行封装,以太网目的地址当前不知道,填全FFFF就是在当前局域网内进行广播,以太网源地址肯定有,帧类型填0806,这是以太网首部。ARP请求,各个字段根据规定填,注意这里是请求OP填1,发送端以太网地址肯定也有,发送端IP地址肯定也有,目的以太网地址就不知道了,目的IP地址肯定也有。然后封装MAC帧,数据帧在局域网中进行广播,所有主机都能收到这个数据帧。
各个主机拿到数据帧在自己的数据链路层对数据帧进行分离解析,最先关注目的ip地址看看这个ip地址和自己的ip地址是否相符,如果不相符就丢弃。如果相符就是目的主机,目的主机在数据链路层的ARP协议对ARP数据报进行封装,这回以太网目的地址填路由器的mac地址,以太网网源地址填当前主机的mac地址,现在是应答了OP是2,发送端以太网地址填当前主机的mac地址,发送端ip地址填当前主机的ip地址,目的以太网地址填路由器的mac地址,目的ip地址填路由器的ip地址,其实就是反过来了。这回有具体的mac地址了不用广播了,路由器收到了,路由器对数据报解包先看op,然后尽心解析,然后路由器就可以找到目的主机了。
当一个 IP 数据报从源主机出发,经过路由器,准备投递给同一个局域网内的目标主机(例如主机 E),但路由器此时只知道目标主机的 IP 地址,而不知道其 MAC 地址,此时就需要使用 ARP 协议完成地址解析。
🛰️ ARP 请求的构造与广播
路由器的数据链路层会构造一个 ARP 请求报文,并封装成以太网帧,过程如下:
- 以太网帧首部:
- 目的 MAC 地址:FF:FF:FF:FF:FF:FF(广播地址)
- 源 MAC 地址:路由器的出接口 MAC 地址
- 类型字段:0x0806(表示这是 ARP 协议)
- ARP 请求报文字段:
- 操作码(OP):1,表示请求
- 发送端 MAC 地址:路由器的接口 MAC
- 发送端 IP 地址:目标主机所属的网关 IP(通常为路由器该接口 IP)
- 目标 MAC 地址:未知,填 0
- 目标 IP 地址:目标主机 E 的 IP 地址
构造完成后,整个帧在局域网内以广播方式发送,网络中所有主机都可以接收到该帧。
📩 ARP 应答的返回与单播
局域网内所有主机收到 ARP 请求后,会查看报文中的目标 IP 地址是否与自己匹配:
- 如果不匹配,则直接丢弃。
- 如果匹配(例如主机 E),则说明自己就是被查找的目标主机。
主机 E 会构造 ARP 应答报文,并封装成以太网帧发送给路由器,过程如下:
- 以太网帧首部:
- 目的 MAC 地址:路由器的接口 MAC 地址
- 源 MAC 地址:主机 E 的 MAC 地址
- 类型字段:0x0806
- ARP 应答报文字段:
- 操作码(OP):2,表示应答
- 发送端 MAC 地址:主机 E 的 MAC
- 发送端 IP 地址:主机 E 的 IP
- 目标 MAC 地址:路由器的接口 MAC
- 目标 IP 地址:路由器的接口 IP
这次的帧是单播形式发送给路由器。
📡 路由器更新 ARP 缓存,完成转发
路由器接收到 ARP 应答后,会将主机 E 的 IP 和 MAC 地址绑定关系记录到本地 ARP 表中。之后,路由器就可以将原本的数据报封装为以太网帧,目的 MAC 设置为主机 E 的 MAC 地址,源 MAC 为自身接口地址,然后将数据报投递给主机 E。
主机会在一段时间内记录下来,各个ip和mac地址的映射。