【计算机网络】数据链路层-MAC和ARP协议

文章目录

  • 1. 认识以太网
  • 2. MAC协议
    • MAC帧的格式
    • MAC地址和IP地址的区别
    • MTU
  • 3. 局域网通信原理
    • 碰撞检测和避免
  • 4. ARP协议
    • ARP数据报的格式
    • ARP缓存


1. 认识以太网

网络层解决的是跨网络点到点传输的问题,数据链路层解决的是同一网络中的通信。

数据链路层负责在同一局域网(同一链路)中两台设备的通信。 局域网的种类有很多,如:以太网、令牌环网。以太网是最常见的局域网技术,广泛用于家庭、企业和数据中心网络。

“以太网” 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等;以太网中的网线必须使用双绞线;传输速率有10M,100M,1000M等。

2. MAC协议

数据链路层的MAC协议规定,同一链路中数据,以MAC帧的格式传输。 不同局域网类型的MAC协议不同,这里介绍的是以太网MAC协议。

MAC帧的格式

在这里插入图片描述

目的MAC地址和源MAC地址: 标识该数据帧的目的主机和源主机;

类型: 指的是封装上层数据的协议类型,有三种类型:IP, ARP, RARP,分别对应数字:0800, 0806, 8035。

CRC校验码: 判断该数据帧的正确性。

MAC地址和IP地址的区别

  • MAC地址用于标识同一链路相互连接的不同主机,在通信过程中描述路途上每一个区间的起点和终点。 MAC地址的长度为6字节48位,一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。MAC地址通常是唯一的,在网卡出厂时就设定了,不能修改。
  • IP地址用于标识网络中的不同主机,在通信中描述全过程的起点和终点。

MTU

MTU(Maximum Transmisson Unit)最大传输单元,指数据链路层中一个数据帧有效载荷的最大长度。

不同数据链路对于数据帧的长度限制不同,以太网MAC帧数据部分的长度规定最小是46字节,最大是1500字节。如果数据长度小于46字节,要求在数据部分后面填充额外的空白字节,以满足最小长度要求。最大是1500字节,这就是MTU。

为什么要设置MTU?

  • 提高网络传输的效率;
  • 降低碰撞概率,减少碰撞后重传的成本。大数据帧传输时间长,增加碰撞的风险,碰撞避免的成本很高。(关于数据碰撞,后面详谈)

数据帧长度过小也不合理,小数据帧传输速度快,时间短,碰撞检测可能在碰撞发生前触发,会导致碰撞检测失败。因此,为了在网络效率和碰撞检测之间取得平衡,通常设置帧数据部分长度范围在46~1500字节比较合理。

MTU对上层的影响:

MTU的限制,决定了上层不应该传递过大数据给数据链路层:

对于IP协议,采用分片与组织的策略,在我的另外一篇文章已详细介绍,详见:

对于TCP协议,不想让IP发生过多分片,因此引入了MSS,规定了TCP数据部分的最大长度。TCP在三次握手发送SYN的时候,会进行MSS协商(在首部变长的选项字段中携带MSS长度),取双方MSS最小值作为传输所用的MSS。

对于UDP协议,如果UDP单个报文的数据长度大于1472(MTU - IP报头长度 - UDP报头长度),就会被IP分成多个分片,提高丢包率(一片丢就相当于整个丢了)。因为UDP没有可靠性机制,丢包报文不会重传。

MSS与MTU的关系:

在这里插入图片描述

通常情况下:

MSS = MTU(1500byte) - IP报头长度(20byte) - TCP报头长度(20byte) = 1460byte


3. 局域网通信原理

  1. 局域网采用“广播”的策略进行数据通信,即在同一链路中,主机A向主机B发送数据,并不是直接向B转发,而是群发到同一链路的所有主机中,由接收主机辨认数据包是否是发给自己的。

  2. 在同一链路上,每台主机有一个MAC地址,用于标识了该主机在链路中的唯一性。 每个发出的数据帧都携带源MAC地址和目标MAC地址。当主机A向主机B发送消息时,同链路所有主机都收到这个消息,并在数据链路层查看消息的目标MAC地址是否为本主机MAC地址,不是则在MAC层将消息丢弃,是则向上交付。

在这里插入图片描述

碰撞检测和避免

如果多个主机同时向链路中发送数据,可能会发生数据碰撞。 在同一物理媒介如电缆、无线信道中发生光电信号的交叉碰撞,会导致数据的损坏。因此,数据链路层引入了碰撞检测与碰撞避免机制。

  • 碰撞检测

    数据链路层的碰撞检测机制,通俗理解:因为主机以广播的形式向同一链路的目标发送数据,所以发送方自己也能收到自己发出去的数据。碰撞检测就是在链路中收取自己发送的数据帧,通过CRC校验等方式,检测数据是否损坏。

  • 碰撞避免

    碰撞避免就是当检测到发生数据碰撞,发送方的数据链路层会随机等待一段时间,再尝试重传数据帧。这个等待时间是为了避免多个设备在同一时间重新发送数据,从而减少再次发生碰撞的可能性。因此,不仅TCP有重传机制,数据链路层也有,只不过机制比较简单。

另外的,同一链路中设备越多,数据碰撞的概率越高。因此数据链路层引入了 交换机(Switch) 以解决这个问题。

交换机是工作在数据链路层的设备,其主要作用是划分碰撞域,如下:

在这里插入图片描述

主机A-F处于同一个局域网,只不过这个局域网被交换机分成了左右两个区间。左右两边完全可以正常通信,只需要由交换机转发即可。交换机的主要作用是:

  1. 当主机A和主机B同时向链路中发送数据时,发生碰撞,此时交换机识别到数据碰撞,不会将碰撞产生的垃圾数据转发到右边,这样一来,右边的通信就不会受到左边碰撞的影响,大大降低了碰撞率。

  2. 当左边的主机A和主机B正常通信时,交换机检测到通信的数据与右边无关,也不会转发到右边,从而减少右边链路的载荷,降低碰撞率。


4. ARP协议

💭通信前,发送方通常只知道目标主机的IP地址和端口号,不知道同一局域网下目标设备的MAC地址,而在同一链路中通信必须清楚对端的MAC地址。因此,在查路由表得到下一跳的IP地址后,要先进行一个IP地址转MAC地址的过程,再向同一局域网中的下一跳主机发送消息。

ARP协议(Address Resolution Protocol)就是用于IP地址转换MAC地址。 ARP通俗来讲就是一个“询问”的过程,知道目标IP,在局域网中群发询问目标IP对应的MAC地址,与IP对应的目标主机会返回它的MAC地址。

这就像老师知道张三同学的学号,但不知道他的名字,要通过学号得知这位同学的名字,就在班级群里问“哪位同学的学号是XXX,你的名字是什么?”,其它同学对比自己的学号不匹配就不回答,张三同学比对后学号匹配,就会回答“老师,我是张三”。

ARP协议也是数据链路层协议,但在MAC协议之上。

ARP数据报的格式

ARP是MAC帧的一种类型(MAC帧报头的类型字段填为0806),只不过规定了MAC数据部分的字段格式。

在这里插入图片描述

各个字段解释:

  1. 硬件类型:指链路层网络类型,1表示以太网;
  2. 协议类型:指要转换的地址类型,0x0800表示IP地址;
  3. 硬件地址长度:物理地址长度,以太网MAC地址是6字节;
  4. 协议地址类型:要转换的地址长度,IP地址是4字节;
  5. op:op字段为1表示ARP请求,op字段为2表示ARP应答。

一次ARP的过程(主机A想要得知主机C的MAC地址):

在这里插入图片描述

  1. 主机A向主机C发送ARP请求(格式如下图),此时主机A并不知道主机C的MAC地址,只知道其IP地址,因此将目的MAC地址设为全1,目的IP设为ipC。(帧类型ARP的0806, op是1表示ARP请求)

在这里插入图片描述

  1. 主机A的ARP请求广播到局域网中,所有主机都会收到。

    • 对于其它非目标的主机,收到这个MAC数据帧后,发现MAC报头的类型字段为0806,得知该数据帧是ARP数据帧,便由MAC协议交付给上层的ARP协议。ARP协议解开报头,查看op字段,确定为ARP请求(这是固定过程,每个主机都可能会收到ARP请求或应答,必须先判断是请求还是应答,再作进一步处理)。然后判断目标IP是否为本机的IP地址,检测到不是,在APR层丢弃数据包。
    • 对于主机C,收到数据帧,判断是ARP请求,在ARP层判断目标IP为本机IP,则表示这个ARP请求想要获取本机的MAC地址。紧接着进行应答的构建
  2. 主机C构建ARP应答(格式如下图),然后广播到链路中
    在这里插入图片描述

  3. 主机A收到ARP数据帧,其它主机丢弃应答(这里MAC报头中的目标地址已经确定,主机通过判断MAC报头中的目标地址,决定是否在MAC层丢弃,而不用交付给ARP层)。主机A收到了一个发送给自己的ARP应答,提取源MAC地址macC和源IP地址ipC,得到了一组IP地址和MAC地址的映射关系。主机A终于得到了主机C的MAC地址,可以正常通信了!

细节:

  1. ARP层收到一个ARP数据帧,解开报头后,第一步必然是查看op字段。

    • op为1表示该帧为ARP请求,执行动作:判断目标IP是否为本机IP,是则表示该ARP请求想要获取本机的MAC地址,紧接着构建并发送应答;否则在APR层丢弃该请求。
    • op为2表示该帧为ARP应答,不用考虑是否丢弃,因为已经再MAC层完成,执行动作:提取源MAC地址和源IP地址,得到一组IP和MAC地址映射关系
  2. ARP请求的丢弃发生在ARP层,ARP应答的丢弃发生在MAC层。

ARP缓存

如果每次发送数据时,都要进行ARP映射MAC地址,不仅效率低,还会导致链路中存在大量的ARP数据帧,增加链路的负担,因此就有了ARP缓存。

每个主机都会维护一张ARP缓存表,用于存储历史建立的IP与MAC地址的映射关系。 数据链路层收到IP数据包后,根据目标IP地址,查看ARP缓存表,若表中存在与目标IP地址对应的映射关系,则直接打包MAC帧发往目标主机,否则进行ARP过程。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

Linux下通过arp指令查看ARP缓存表。

在这里插入图片描述


ENDING…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/119703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARMday01(计算机理论、ARM理论)

计算机理论 计算机组成 输入设备、输出设备、运算器、控制器、存储器 1.输入设备:将编写好的软件代码以及相关的数据输送到计算机中,转换成计算机能够识别、处理和存储的数据形式 键盘、鼠标、手柄、扫描仪、 2.输出设备:将计算机处理好的数…

jacoco和sonar

目录 jacoco 引入依赖 构建配置修改 单元测试 生成报告 查看报告 报告说明 1. Instructions 2. Branches 3. Cyclomatic Complexity 4. Lines 5. Methods 6. Classes sonar7.7 基础环境 需要下载软件 解压文件并配置 运行启动 jacoco 引入依赖 <dep…

系列一、Spring + SpringMVC + MyBatis整合

一、概述 整合 Spring、SpringMVC、MyBatis。 二、整合步骤 2.1、pom <dependencies><!-- 普通maven项目中使用Sl4j注解 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1…

MFC 基础篇(一)

目录 一.SDK编程 二.为什么要学MFC&#xff1f; 三.MFC能做什么&#xff1f; 四.MFC开发环境搭建 五.MFC项目创建 六.消息映射机制 一.SDK编程 Application Programming Interface 应用程序编程接口。 Software Development Kit 软件开发工具包&#xff0c;一般会包括A…

自动驾驶高效预训练--降低落地成本的新思路(AD-PT)

自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点&#xff1a;通过预训练的方式&#xff0c;可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…

图像标注工具lableImg安装出错怎么办?

我们要训练自己的图像识别模型&#xff0c;首先要进行图像的标注。labelimg就是一款可视化的图像标注工具。它是用Python编写的&#xff0c;通过Qt实现其图形界面&#xff0c;尽管它只支持矩形框标注&#xff0c;但因跨平台&#xff0c;支持Linux、Mac OS、Windows&#xff0c;…

Pycharm加载项目时异常,看不到自己的项目文件

最近看到一个朋友问&#xff0c;他把项目导入pycharm为什么项目里的包不在项目里显示&#xff0c;只在projects file里显示&#xff1f;问题截图如下&#xff1a; Project里看不到自己的项目文件 只能在Project Files里看到自己的项目文件 问题解答 我也是偶然发现的这个方案…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

SQL注入漏洞及五大手法

SQL注入漏洞 文章目录 SQL注入漏洞万能用户名 SQL注入分类两大基本类型五大手法提交参数方式注入点的位置 注入点判断SQL注入的危害sql漏洞挖掘Mysql库中的注释 SQL注入基本手法联合查询条件 报错注入group byextractvalueupdataxml 布尔盲注延时注入 案例获取cms网站后台管理员…

云尘 命令执行系列

第一题 system <?php include "flag.php";if (isset($_POST[cmd])) {system($_POST[cmd]); }show_source(__FILE__);代码如上 system($_POST[cmd]); POST请求发送一个名为 cmd 的参数&#xff0c;然后将该参数的值传递给系统命令执行函数 system()&#xff0c…

vue + axios + mock

参考来源&#xff1a;Vue mock.js模拟数据实现首页导航与左侧菜单功能_vue.js_AB教程网 记录步骤&#xff1a;在参考资料来源添加axios步骤 1、安装mock依赖 npm install mock -D //只在开发环境使用 下载完成后&#xff0c;项目文件package.json中的devDependencies就会加…

支持内录系统声音的Mac录屏软件Omi Recorder

Screen Recorder by Omi是一款功能强大的屏幕录制应用程序。它可用于在Windows和Mac计算机上捕获屏幕&#xff0c;以便进行演示、教程、游戏录制、视频编辑等各种用途。 以下是该应用程序的一些主要特点&#xff1a; 支持高清录制&#xff1a;Omi Screen Recorder可以以高达6…

Appium 结合 TestNG 并行执行测试

Appium 测试框架可以让我们使用不同的编程语言&#xff08;Java、Python、Ruby、JavaScript&#xff09;测试不同移动端平台的应用&#xff08;Android、iOS&#xff09;&#xff0c;目前也是最火的移动端测试框架。这篇文章会带着大家学习到如何在不同设备中并行执行测试。 并…

没网络也能安装.Net 3.5!如何脱机安装.NET Framework 3.5

.NET框架是由微软制定的一个软件框架。它有助于在Windows上运行控制台、Web或移动应用程序。此有用的工具适用于Windows设备。 如何脱机安装.NET Framework 3.5 如果你拥有Windows 10、8、8.1或7,有时第三方软件可能会导致问题。你可能会在图片中看到这样的问题。 看这张照片…

QT 实现两款自定义的温度计/湿度控件

文章目录 0 引入1、带有标尺的温度/湿度计控件1.头文件2.核心代码 2、竖起来的温度/湿度计控件1.头文件2.实现 3、引用 0 引入 QT原生控件没有实现如仪表盘或者温度计的控件&#xff0c;只好自己实现&#xff0c;文章代码部分参考引用的文章。直接上图 图一 带有标尺的温度计…

快速实现一个企业级域名 SSL 证书有效期监控巡检系统

Why 现在对于企业来说&#xff0c;HTTPS 已经不是可选项&#xff0c;已经成为一个必选项。HTTPS 协议采用 SSL 协议&#xff0c;采用公开密钥的技术&#xff0c;提供了一套 TCP/IP 传输层数据加密的机制。SSL 证书是一种遵守 SSL 协议的服务器数字证书&#xff0c;一般是由权威…

随笔--解决ubuntu虚拟环境的依赖问题

文章目录 问题一&#xff1a;在conda虚拟环境中报错ImportError: libcupti.so.11.7:cannot open shared object file: No such file or directory解决步骤问题二&#xff1a; RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemmStridedBatched( …

初识Java 17-2 反射

目录 转型前检查 构建例子&#xff1a;生成层次结构 优化Creator&#xff1a;使用类字面量 优化PetCounter&#xff1a;动态验证类型 更通用的递归计数 注册工厂 本笔记参考自&#xff1a; 《On Java 中文版》 转型前检查 当我们使用传统的类型转换&#xff0c;例如&…

【服务器】Java连接redis及使用Java操作redis、使用场景

一、Java连接redis-No-SQL 1、导入依赖 在你的项目里面导入redis的pom依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、连接redis 连接redis …

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…