在上一章节中,我们讲解了数据链路层与物理层的接口MIIM,在本章中我们主要介绍车载网络中的数据链路层。
目录
数据链路层与网络层的区别
数据链路层:负责“同一链路”或“局域网/子网”内的可靠传输
传输范围:
主要功能:
通路的确定:
网络层(IP):负责整个网络范围(可能跨多个子网/链路)的寻址与路由
传输范围:
主要功能:
通路的确定:
数据链路层的主要功能
1. 封装与解封装
2.介质访问控制
3. 差错检测与处理
4. 与物理层交互
5. 对上层的抽象与屏蔽
ARP协议
ARP协议在局域网内没有找到目标IP怎么办?
1. 目标 IP 不在同一个子网、需要通过网关(路由)转发
2. 目标 IP 在本地子网,但无人应答
3. 后续处理或错误信息
通路建立流程
在传统的 IEEE 802 体系中,数据链路层被进一步拆分成了两层:
- LLC(Logical Link Control,逻辑链路控制子层)
- MAC(Media Access Control,介质访问控制子层)
但是截止到目前,很多厂商可能可能只有MAC协议。这是因为在实践中,LLC 子层对于许多已经成熟的局域网(尤其是以太网)来说,常常已经被“弱化”或“合并”到 MAC 中去,或者直接由 上层协议栈(TCP/IP)来处理逻辑链路方面的控制和复用。对于车载网络而言,厂商通常更关注 底层总线访问、帧格式、仲裁、错误检测 等 MAC 级别的功能,而对 LLC 层的需求不大,或者说直接由其他高层协议代替了 LLC 的功能。至于 LLC 子层,大多厂商直接让 IP 层(OSI 第三层)去对接 MAC 报文,或者使用 VLAN/QoS 等扩展,实际上并不额外区分 LLC。
数据链路层与网络层的区别
在 OSI 模型中,数据链路层 和 网络层(IP 层) 都是把数据“送到对面”,但它们关注的 范围 和 实现方式 不同,层次职责 也不同。
数据链路层:负责“同一链路”或“局域网/子网”内的可靠传输
-
传输范围:
- 主要在 同一个物理链路 或 同一个局域网(同一个子网/广播域) 内工作。
- 典型场景:以太网交换机的某个端口到主机之间,或者共享介质上的多台主机之间(Wi-Fi、CAN总线等)。
-
主要功能:
- 帧的封装/解封装(添加 MAC 地址、CRC 校验等)。
- 介质访问控制(MAC)和错误检测纠正。
- 确保在本链路里,数据能正确发送到目标MAC地址的设备上。
-
通路的确定:
- 数据链路层不需要考虑跨越多个网络的转发和路由;
- 只要“下一跳”或者“同网段”的设备能收到帧,就完成了它的使命。
换句话说,数据链路层 关注的是:“在同一个物理/局域链路上,A 怎么把数据帧送到 B”。如果要跨越多个路由器,数据链路层只负责“到下一跳”的那一段。
推理 持续 一秒
在 OSI 模型中,数据链路层 和 网络层(IP 层) 确实都是把数据“送到对面”,但它们关注的 范围 和 实现方式 不同,层次职责 也不同。一个简要的对比是:
网络层(IP):负责整个网络范围(可能跨多个子网/链路)的寻址与路由
-
传输范围:
- 面向 整个互联网或更大范围 的网间互联;可以跨越多个局域网、路由器、运营商网络等。
-
主要功能:
- 逻辑寻址(IP地址):给每个主机或网络接口分配全球唯一或私有的 IP 地址,方便路由转发。
- 路由选择:根据路由表、路由协议决定 “下一跳”(要发给哪一个路由器或设备),直到数据包抵达目标 IP 所在子网。
- 分片与重组(若链路层 MTU 不足时,IP 可做分片)。
-
通路的确定:
- IP 协议层面会选出一条可能跨多个路由器/子网的路径,让包最终到达目标 IP;
- 在每一跳内部,则调用数据链路层把包封装成帧,发送给下一跳设备。
也就是说,网络层 关注的是:“我在全网范围内,如何选择路由,把数据包一跳一跳地传到目的 IP 地址所在的网络”。每一跳之间再由数据链路层去完成“具体链路/局域网内”的传送。
数据链路层的主要功能
在 OSI 七层模型 中,数据链路层(第2层)主要负责把来自网络层的 分组(packet) 再次包装(封装)为 帧(frame),并通过底层 物理层 发送到目标主机。它有以下关键职责:
1. 封装与解封装
从网络层(IP 层)接收 IP 包,在它前面加上 MAC 帧头(源 MAC、目的 MAC、Type/Length 等),并在帧末尾附加 CRC/FCS 校验,形成 以太网帧。在接收方向,去掉 MAC 帧头和 CRC,然后把还原后的 IP 包提交给网络层。详细的帧讲解可以移步这位博主的博客:https://blog.csdn.net/chendemingxxx/article/details/143323667
2.介质访问控制
数据链路层负责 控制 同一物理介质上 多个节点 的访问。在 无线网络、车载总线 等场景,各种 仲裁、时隙分配、优先级 策略也属于数据链路层范畴。
3. 差错检测与处理
帧头或帧尾附带 CRC(循环冗余校验)或 FCS(帧检验序列),用来检测传输过程中可能出现的比特差错。出现校验错误时,通常 丢弃 该帧,并由上层(如 TCP)或链路层重传(某些协议提供)来保证可靠性。
4. 与物理层交互
数据链路层将成帧后的数据 送入物理层 进行实际信号发送,也从物理层接收比特流并组装成帧。不同物理介质(双绞线、光纤、无线)会对帧的 传输速率、调制方式、带宽 等有不同要求,数据链路层要与物理层相互适配。与此同时他还屏蔽不同物理媒介的实现差异,对上层而言提供 统一的“发送帧/接收帧” 功能。有兴趣的可以看看上一章
5. 对上层的抽象与屏蔽
上层(网络层)只需要知道如何处理 IP 分组,不必关心具体链路是 以太网、无线局域网、CAN 总线 还是 其它协议。数据链路层统一为网络层提供了 “发送/接收分组” 的接口,把底层介质访问与设备寻址、错误校验等复杂度都 封装 起来。
ARP协议
在局域网中,ARP(Address Resolution Protocol) 的工作原理是:
- 主机要向目标IP发送数据,先检查是否在本地子网内(根据子网掩码等判断)。
- 如果目标IP在同一个子网,则主机会 ARP广播 询问 “谁是
目标IP
,请告诉我你的MAC地址。” - 如果目标主机在网内并且在线,就会以单播方式回应自己的MAC地址。
- 如果长时间无人应答(因为目标IP确实不在网内、或主机离线等),则 ARP 请求 最终 超时;主机获取不到目标的MAC地址,发送 IP 分组也随之 失败。
ARP协议在局域网内没有找到目标IP怎么办?
1. 目标 IP 不在同一个子网、需要通过网关(路由)转发
如果 目标IP 不在本地子网,本机会根据 路由表 决定是否将数据发送给 默认网关(Default Gateway)。此时:
- 主机会去 ARP 解析 默认网关的 IP → MAC,得到网关的 MAC 地址。
- 把目标IP包封装到以太网帧(或其他二层帧)中,目的 MAC 填写的是 网关的 MAC。
- 网关接收到帧后,再根据路由表进行进一步转发。
所以,如果目标 IP 不在本地子网范围,主机并不会直接 ARP 目标IP,而是 ARP 网关IP。只要网关IP可以解析到MAC地址(网关在线),即便目标IP不在本地,也能通过网关进行转发(至其他网络)。
2. 目标 IP 在本地子网,但无人应答
若 目标 IP 确实在 同一子网,主机就会 ARP广播 目标IP请求。但如果对方设备不在线、或根本不存在这个IP:
- ARP 请求 发送后得不到任何应答。
- 操作系统会 重试 若干次,超过一定次数/时间后,ARP 请求超时。
- 主机在 IP 层会得到一个“不可达”或“ARP 超时”的结果,进而报错给应用程序或上层协议(如可能返回
host unreachable
)。
这种情况下,ARP 表中永远没有记录下这条 IP→MAC 映射,后续网络层对这个目标的发送也都会失败。
3. 后续处理或错误信息
- 当 ARP 请求失败,主机往往会在应用层或传输层产生错误,例如 ICMP “Destination Host Unreachable” 或者底层返回“ARP 超时”等。
- 具体行为由操作系统网络栈和路由配置决定。通常你在
ping
一个不存在的 IP 时,过一段时间就会看到 “Request timed out” 或 “Destination Host Unreachable”。
通路建立流程
当客户端想连接到某个远程服务器(例如 IP= 10.0.0.2
, 端口=80)时,首先由操作系统检查 目标 IP 是否和自己位于同一子网:
- 如果在同一子网,则会 ARP 查询该 目标 IP 的 MAC 地址;
- 如果不在同一子网,则根据 路由表 选择下一跳(一般是 默认网关),对 网关的 IP 进行 ARP,获取 网关 MAC。随后,客户端将 TCP 数据(带有 SYN 标志) 封装进 IP 包,并用 数据链路层帧头 标明“目的 MAC=网关的 MAC”(若跨网)或“目的 MAC=目标主机”,然后通过物理层送出。
当数据包(含 SYN)到达下一跳(例如网关)后,网关会根据其 路由表 判断下一跳是谁、ARP 获取下一跳 MAC 地址、重新封装成新的帧,再转发出去。经过若干路由器/交换机,最终 目标服务器 收到该 IP 包,解析出其中的 TCP SYN。
服务器看见客户端要建立连接(SYN),随即发回一个 SYN+ACK 报文:此时服务器同样需要检查路由表,若客户端 IP 不在本地网,就将 SYN+ACK 发给其网关,再逐跳转发回到客户端。客户端收到后再发送最终的 ACK。这一来一回完成 TCP 三次握手,至此双方的 TCP 连接在逻辑上正式建立。
有了这个连接后,客户端与服务器后续的数据交换(如 HTTP 请求与响应)就可以基于此 TCP 连接 进行;在链路层,依旧会不断根据 下一跳 MAC 来封装帧、发送物理信号,但对于应用程序而言,这些底层过程被操作系统和网络设备透明地处理了。