数据链路层

数据链路层(Data Link Layer)是 TCP/IP 五层模型的第 2 层(对应 OSI 七层模型的第 2 层),介于物理层和网络层之间,核心作用是 将物理层的原始信号封装成可传输的 "帧",并解决相邻节点间的可靠通信问题

也就是说数据链路层解决同一个子网里的通信。

以太网

以太网既是一种网络技术标准,也是数据链路层的核心协议,更准确地说,我们常说的以太网协议(IEEE 802.3) 是数据链路层 + 物理层的复合标准,其中数据链路层的定义是其核心。

我们来看看以太网帧的格式:

这里目的地址和源地址就是MAC地址。

类型是用来分清上层协议的。

CRC 是 "循环冗余校验码"(Cyclic Redundancy Check),也是用来检验数据正确性的。

也就是说以太网帧通过固定的报头长度来实现报头和有效载荷分离;

通过类型来实现分用。

以太网帧最常见的上层协议就是IPv4,类型会填0800:

除此之外,还有ARP和RARP等上层协议:

这里PAD是填充字段:

以太网帧的数据字段长度要求是 46~1500 字节(太短会导致传输效率低),而 ARP 请求 / 应答本身只有 28 字节,所以需要加PAD(填充字段)补到 46 字节,保证帧结构合法。

以太网帧的有效载荷(数据字段)设置 46 字节的最小限制,核心是为了适配早期以太网的 CSMA/CD(载波监听多路访问 / 冲突检测)机制,保证冲突能被正确检测,同时兼顾传输效率。

除此之外,上层协议如果是ipv6,类型就是86DD。

MAC地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位,及6个字节.一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
  • 在网卡出厂时就确定了,不能修改.mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)

MTU

注意到我们以太网帧的有效载荷大小上限是1500,其实这就是MTU。

MTU(Maximum Transmission Unit,最大传输单元)指网络通信中单次数据传输允许的最大数据包大小,单位为字节(Byte)。不同网络协议或物理介质对 MTU 的限制不同,例如以太网的默认 MTU 为 1500 字节。

我们在IP部分就已经谈过MTU对上层协议的影响。有了MTU的限制,IP不得不对报文大小超过MTU的报文进行分片。这会导致报文丢失的概率增加。因此为了避免分片TCP又有着MSS的规定:

MSS(Maximum Segment Size)指TCP协议中单次传输数据的最大分段大小,用于避免IP层分片。通常在TCP三次握手阶段协商,默认值为1460字节(基于以太网MTU 1500字节减去IP和TCP头部40字节)。

一次发送的报文大小不超过MSS就能避免报文在下层分片。

MTU对上层如此不便为什么要这么规定呢?

其实回顾我们刚进入网络世界

那时候提到了,同一个局域网里通信时。

不同主机发送报文会互相影响,发生碰撞。碰撞之后就要休眠一段时间再发送。因此碰撞会影响发送报文的效率。

报文越大,发送的时间越长,越容易发生碰撞。因此规定一个发送帧的上限大小,本质也是为了减少发生碰撞的概率,这样反而能提高效率。

输入ifconfig指令能查看本主机的MTU大小:

交换机

我们以前常说网络通信里会用到交换机和路由,事实上我们一直分不清这两者的区别,现在来明确一下。

首先我要介绍一下碰撞域的概念:

碰撞域(Collision Domain)是指在网络通信中,所有可能发生数据帧冲突(碰撞)的设备集合。当多个设备同时发送数据时,若共享同一传输介质(如以太网总线或集线器连接的设备),数据帧会相互干扰,导致碰撞。碰撞域的范围决定了网络性能,因为碰撞会降低有效带宽。

我一开始说一个以太网是一个碰撞域,这在以前是正确的,现在随着交换机的发展就不太准确了。

因为我们的交换机会分割碰撞域。

首先我们在一个以太网中接入一个交换机,交换机有两个端口,连接不同的主机:

一开始交换机不清楚当前局域网情况,当A向C发送报文时:

这时候交换机也不知道C在哪,因此当交换机收到A的报文时,也会将报文交给右边的区域。这时候以太网还是在同一个碰撞域。

但是交换机可以很确定,主机A一定在左边。

工作一段时间后,交换机就能摸清当前局域网的主机分布情况:

这时候A向B发送报文,交换机就会知道A、B都在左边,因此不会将报文交给右边。这时候不会影响右边D向E通信。

所以交换机就将以太网分成了两个碰撞域。

所以,交换机作用在同一个子网通信。路由器则是连接不同的子网。

ARP

虽然我们在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。

还记得我们写的套接字编程吗。里面写的从来没有目的MAC地址。那么我们怎么知道对方MAC地址呢?

这里就到了ARP协议登场了:

ARP协议建立了主机IP地址和MAC地址的映射关系

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址

ARP协议的工作流程

  • 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);

    这就是IP部分提到的广播地址:

  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;

  • 每台主机都维护一个ARP缓存表,可以用arp-a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址

如此我们才能知道对方的MAC地址,然后再继续IP报文发送。

我们再来看看ARP的报文格式:

下边就是ARP报文格式:

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

很显然,当同一个局域网里所有主机收到ARP报文都会进行处理。收到IP报文则不一定会处理。

RARP概述

RARP(Reverse Address Resolution Protocol,反向地址解析协议)是一种网络协议,用于通过已知的物理地址(MAC地址)获取对应的IP地址。它是ARP(Address Resolution Protocol)的逆向过程,主要用于无盘工作站或设备启动时获取IP配置。

这个过程比ARP还要简单就不赘述了。

相关推荐
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz6 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院6 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展