数据链路层协议——以太网协议
目录
一、认识以太网
二、以太网帧格式
三、MTU
四、ARP协议
ARP协议
ARP协议格式
ARP缓存表
一、认识以太网
前面,我们讲到了网络层的IP协议,它通过目的IP,子网划分,路由表查找及其算法等方式让IP报文能够从一个主机到另一个主机。但是,IP协议没有解决设备转发的具体功能,而只是提供了一个转发的策略。
在局域网中,数据报文的具体转发,怎么从一个主机到另一个主机的具体方式是由数据链路层协议来实现的。
要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机,而两台主机直接相连也就意味着这两台主机属于同一网段,因此将数据转发到下一跳主机实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题。
所以说,数据链路层解决的是同一个局域网中两台相连主机之间的数据传输的问题。
以太网
"以太网" 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容, 例如:规定了网络拓扑结构,访问控制方式,传输速率等。
例如以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等。
以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等。
二、以太网帧格式
以太网帧格式如下:

源地址和目的地址是指网卡的硬件地址(即MAC地址),长度是48位,是在网卡出厂时就标定好了的。 且每个主机的MAC地址是全球唯一的。
帧协议类型字段有三种值,0800,0860,8035分别对应IP协议、ARP协议和RARP协议,后面两种协议后面会讲。
帧末尾是CRC校验码。
MAC帧如何将报头与有效载荷进行分离?
以太网MAC帧的帧头和帧尾都是固定长度的,因此当数据链路层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。
MAC帧如何知道将有效载荷交付给上层的哪一个协议?
数据链路层MAC帧对应的上层网络层的协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。
在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。
局域网通信原理
MAC地址用来识别数据链路层中相连的节点。
长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示。

对于上图。现在主机1想要给主机6发送消息。主机1封装MAC帧当中的目的地址就是主机6的MAC地址,源地址就是主机1的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应就是CRC校验。
当主机1将该MAC帧发送到局域网当中后,局域网当中的所有主机都可以收到这个MAC帧,包括主机1自己。
主机6收到该MAC帧后,提取出MAC帧当中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就会将有效载荷交付给上层IP层进行进一步处理。
局域网中的其他主机收到该MAC帧后,也会提取出MAC帧当中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃掉。
主机1收到该MAC帧后,可以对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞,此时主机1就会执行碰撞避免算法,后续进行MAC帧重发。
总结:当主机的数据链路层收到一个MAC帧后,会根据MAC帧当中的目的地址来判断该MAC帧是否是发给自己的,如果是发送给自己的则会再对其进行CRC校验,如果校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理。
碰撞避免算法
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。
所以说,当局域网中有多个主机在同时发送消息的时候,就会发生数据碰撞。
那么只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法,即:主机在等待一段时间后重新发送数据。
数据跨网络传输原理

我们现在要将主机A的消息传输给主机B。
首先,主机A要将数据传输给与自己在同一个局域网的路由器A,于是它从上到下封装数据。在网络层通过查询路由表,知道了下一步应该去往路由器A,于是向下交付给数据链路层封装MAC帧,目的地址就是路由器A的MAC地址,源地址就是主机A的MAC地址。
此时主机A所在局域网当中的所有主机都能收到这个MAC帧,但最终只有路由器A发现该MAC帧当中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给网络层IP协议。
路由器A的网络层IP协议,将IP报头和有效载荷分离后,提取出了目的IP,然后通过查询路由表后确定需要将该数据转发给路由器B。于是向下交付给数据链路层封装MAC帧,目的地址就是路由器B的MAC地址,源地址就是路由器A的MAC地址。这样就可以去往路由器B了。
就这样,数据报经过一跳一跳,最终就能够到达主机B了。
所以,数据在进行跨网络传输时,其对应的源IP地址和目的IP地址一般是不会变化的,而该数据的源MAC地址和目的MAC地址却是一直在变化的。
三、MTU
1、以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
2、最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
3、如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(IP协议)。
4、不同的数据链路层标准的MTU是不同的。
MUT对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以如果IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片,然后才能将分片后的数据向下交付。IP报文的分片和组装在上一文中已经讲过了。这就不再赘述了。
MTU对TCP协议的影响
对于TCP来说,分片会增加TCP报文丢包的概率,而TCP丢包后还需要进行重传,因此TCP应该尽量减少因为分片导致的数据重传。
所以TCP发送的数据报不能无限大,应该受制于MTU,我们将TCP的单个数据报的最大报文长度,称为MSS。
TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。MSS的值实际就是在TCP首部的40字节的选项字段当中。
当然,在将IP协议的时候我们也说过了,最理想的情况是TCP协议严格控制每次传输数据的大小,使报文不会被分片。
四、ARP协议
地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。
为什么要有ARP协议?
上面我们讲到,IP报文在向下交给数据链路层后,将由其对IP报文进行封装,形成MAC帧,这样才能在局域网中,进行转发,到达下一个主机。可是,数据链路层能够封装MAC帧的前提应该是先知道下一个主机的MAC地址,那么怎么才能知道同一局域网中其他主机的MAC地址呢?
对于IP地址,我们有专门的路由表,这样主机就可以知道另一个主机的IP地址,通过路由表我们就能够知道报文该去往哪个网段。那么可不可以像路由表一样将局域网中所有主机的MAC地址保存起来呢?当然是不行的,因为一个局域网中就有大量的主机,主机数量可比局域网多多了,这样维护成本就太大了。
也就是说,在同一个局域网中要给对方发消息,就必须得知道对方的MAC地址,而实际大部分情况下我们只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址。
ARP协议
ARP协议和RARP协议也是属于数据链路层协议。
ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议。也就是说,MAC帧的上层协议不一定就直接是网络层的协议,MAC帧的上层协议有可能也属于数据链路层的协议,就是位于MAC帧的上层。

ARP协议格式

硬件类型指链路层的网络类型,1为以太网。
协议类型指要转换的地址类型,0x0800为IP地址。
硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
协议地址长度对于IP地址为4字节,因为IP地址是32位的。
op字段为1表示ARP请求,op字段为2表示ARP应答。
ARP协议的工作过程

主机A想要给主机B发信息,那么主机A要先知道主机B的MAC地址。于是主机A构建ARP请求。
ARP请求
因为构建的是ARP请求,因此ARP请求当中的op字段设置为1。
ARP请求当中的硬件类型字段设置为1,因为当前使用的是以太网通信。
ARP请求当中的协议类型设置为0800,因为是要将IP地址转换成MAC地址。
ARP请求当中的硬件地址长度和协议地址长度分别设置为6和4,因为MAC地址的长度是48位,IP地址的长度是32位。
ARP请求当中的发送端以太网地址和发送端IP地址,对应就是主机A的MAC地址和IP地址。
ARP请求当中的目的以太网地址和目的IP地址,对应就是主机B的MAC地址和IP地址,但由于主机A不知道主机B的MAC地址,因此将目的以太网地址的二进制序列设置为全1,表示在局域网中进行广播。
ARP请求构建完成后,还需要将ARP数据包向下交付给MAC帧协议,封装成MAC帧。

MAC帧封装完毕后,主机A就可以将封装好的MAC帧以广播的方式发送到局域网当中了。
因为这个MAC帧是以广播的方式发出的,因此局域网当中的每台主机收到这个MAC帧后,都会对该MAC帧进行解包。当这些主机识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP层。
当ARP层收到这个数据包后,发现ARP数据包当中的op字段为1,于是判定这是一个ARP请求,然后再提取出ARP数据包当中的目的IP地址字段,虽然局域网当中的所有主机都会将该数据包交给自己的ARP层,但最终只有主机B发现ARP数据包当中的目的IP地址与自己相同,因此只有主机B会对该ARP请求进行应答,而局域网当中的其他主机在识别到ARP数据包当中的目的IP地址与自己不匹配后,就会直接将这个ARP请求报文丢弃。
ARP应答
因为主机B构建的是ARP应答,因此ARP应答当中的op字段设置为2。
ARP应答当中的硬件类型、协议类型、硬件地址长度、协议地址长度的值与ARP请求当中设置的值相同。
ARP应答当中的发送端以太网地址和发送端IP地址,对应就是主机B的MAC地址和IP地址。
ARP应答当中的目的以太网地址和目的IP地址,对应就是主机A的MAC地址和IP地址。
ARP协议封装好后,向下交付封装MAC帧。最终的MAC帧如下:

MAC帧封装完毕后,主机B就可以将封装好的MAC帧发送到局域网当中了。
此时局域网当中的每台主机在底层都能收到这个MAC帧,但大部分的主机,在发现该MAC帧对应的以太网目的地址与自己不同后,就会将该MAC帧丢弃,而不会交付给上层ARP层,最终只有主机A会将解包后MAC帧的有效载荷向上交付给自己的ARP层。
当主机A的ARP层收到这个数据包后,发现ARP数据包当中的op字段为2,于是判定这是一个ARP应答,然后就会提取出ARP数据包当中的发送端以太网的地址和发送端IP地址,此时主机A就拿到了主机B的MAC地址。
ARP缓存表
实际上,我们并不是每次都要在获取对方的MAC地址时都需要发起ARP请求,每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,每台主机都维护了一个ARP缓存表,我们可以用arp -a命令进行查看。

当然,这个缓存表并不是能够一直保存映射关系,它是有过期时间的,一般是20分钟。20分钟过后就会失效,需要重新发送ARP请求来获取MAC地址。
什么时候需要发起ARP请求?
我们刚才说的只是主机A要将数据发送给主机B的时候,需要通过ARP请求获得主机B的MAC地址,但实际数据在路由过程中的每一跳可能都需要发起ARP请求,询问下一跳主机对应的MAC地址,因为在每一跳时我们一般都是只知道下一跳的IP地址,而并不知道其对应的MAC地址的。
ARP请求不能够跨网络传输,它只在局域网内有效。
相关文章:
数据链路层协议——以太网协议
目录 一、认识以太网 二、以太网帧格式 三、MTU 四、ARP协议 ARP协议 ARP协议格式 ARP缓存表 一、认识以太网 前面,我们讲到了网络层的IP协议,它通过目的IP,子网划分,路由表查找及其算法等方式让IP报文能够从一个主机到另一…...
一篇讲透数据结构之链式队列
目录 一.队列的定义 二.队列的分类 三.队列的功能 四.链式队列的声明 五.链式队列功能的实现 5.1 初始化队列 5.2 判断队列是否为空 5.3 获取队头元素 5.4 获取队尾元素 5.5获取队列长度 5.6 入队 5.7出队 5.8 打印队列元素 5.9 销毁队列 一.队列的定义 队列&…...
【408真题】2009-24
“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…...
6年IT找工作想法
由于我学历比较低,当时没好好学,后面参加了大数据培训,现在也已经有6年了。 我是计算机专业的,我的培训同学有些不是计算机的,但是是本科,双非一本的这种,在6年后和我的差距不是一点点了&#x…...
TOPSIS综合评价
TOPSIS法(Technique for Order Preference by Similarity to an Ideal Solution)是一种常用的综合评价方法,该方法根据有限个评价对象与理想化目标的接近程度进行排序,是在现有的对象中进行相对优劣的评价。 TOPSIS法的原理是通过…...
修改vuetify3的开关组件v-switch在inset模式下的大小
<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1:本页面使用 本页面中使用,必须要含有lang“scss” scoped,才会生效 <style lang"scss"…...
m1系列芯片aarch64架构使用docker-compose安装nacos
之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 nacos 镜像, 所以就尝试的安装了下, 亲测可用: 一. docker-compose.yml 编写 请确保自己的 mysql 服务已经启动了, 并且允许远程连接 volumes 挂载目录需要换成自己的目录 二. 容器运行和网络组 2.1 查看容器运行情况 …...
优化耗时业务:异步线程在微服务中的应用
大家好,我是程序员大猩猩。 大家都知道,在我们实际开发过程中,我们经常会遇到一些耗时的业务和逻辑,比如说要上传什么大文件,又或者是大文件的数据处理。我们不能一个接口上等着这些耗时任务完成之后了,再…...
torch.scatter看图理解
torch.Tensor.scatter 有 4 个参数: scatter(dim, index, src, reduceNone) 先忽略 Reduce,最后再解释。先从最简单的开始。我们有一个 (2,4) 形状的张量,里面填充了 1: 粉红色的符号表示张量结构 并且我们传入相应的参数并得到…...
适合学生党的蓝牙耳机有哪些?盘点四大性价比蓝牙耳机品牌
对于追求高品质音乐体验而又预算有限的学生党来说,一款性价比高的蓝牙耳机无疑是最佳选择,在众多品牌和型号中,如何挑选到既适合自己需求又价格亲民的蓝牙耳机,确实是一个值得思考的问题,作为一个蓝牙耳机大户…...
【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …...
Science Advances|柔性超韧半导体纤维的大规模制备(柔性半导体器件/可穿戴电子/纤维器件/柔性电子)
北京大学 雷霆(Ting Lei)团队,在《Science Advances》上发布了一篇题为“Continuous production of ultratough semiconducting polymer fibers with high electronic performance”的论文。论文内容如下: 一、 摘要 共轭聚合物具有良好的光电特性,但其脆性和机械特性差,…...
VirtualBox虚拟机与bhyve虚拟机冲突问题解决@FreeBSD
问题 在安装完bhyve虚拟系统的主机上启动VirtualBox虚拟机的时候,报错:不能为虚拟电脑 debian 打开一个新任务. VirtualBox cant operate in VMX root mode. Please close all other virtualization programs. (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码…...
【网络层】ICMP 因特网控制协议
文章目录 ICMP 含义以及作用ICMP协议解析结合ICMP协议和ping常见问题 ICMP 含义以及作用 ICMP:Internet control massage protocol 因特网控制协议 Internet控制报文协议ICMP是网络层的一个重要协议。 ICMP协议用来在网络设备间传递各种差错和控制信息,…...
汇编原理(四)[BX]和loop指令
loop:循环 误区:在编译器里写代码和在debug里写代码是不一样的,此时,对于编译器来说,就需要用到[bx] [bx]: [bx]同样表示一个内存单元,他的偏移地址在bx中,比如下面的指令 move bx, 0 move ax,…...
Linux查看设备信息命令
dmidecode | grep Product Name 查看grub版本号:rpm -qa | grep -i "grub" 客户端操作系统版本: cat /etc/issue cat /etc/redhat-release 处理器品牌及型号: less /proc/cpuinfo |grep model...
transformer的特点
Transformers是一种用于处理序列数据的神经网络架构,最初由Vaswani等人在2017年提出,主要用于自然语言处理任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformers采用了一种全新…...
27快28了,想转行JAVA或者大数据,还来得及吗?
转行到JAVA或者大数据领域,27岁快28岁的年龄完全来得及。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。…...
英飞凌 AURIX TriCore 单片机开发入门
文章目录 目的硬件准备AURIX™ Development StudioInfineon MemtoolAURIX™ iLLD Drivers总结 目的 英飞凌的32位 AURIX™ TriCore™ 系列单片机 经常用于汽车和工业领域。开发该系列单片机比较常用的开发环境有 HighTec 和 AURIX™ Development Studio 。本文将基于后者&…...
Centos安装,window、ubuntus双系统基础上安装Centos安装
文章目录 前言一、准备工作二、开始安装1、2、首先选择DATE&TIME2、选择最小安装3、 选择安装位置 总结 前言 因工作需要,我需要在工控机上额外装Centos7系统,不过我是装在机械硬盘上了不知道对性能是否有影响,若有影响,后面…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
