【Linux】MAC帧协议 + ARP协议

文章目录

  • 📖 前言
  • 1. 数据链路层
  • 2. MAC帧格式
  • 3. 再谈局域网
  • 4. ARP协议
    • 4.1 路由器的转发过程:
    • 4.2 ARP协议格式:
  • 5. 如何获得目的MAC地址

📖 前言

在学完网络层IP协议之后,本章我们将继续向下沉一层,进入到数据链路层的学习。
该层有两个重要的协议需要我们来学习,一个是ARP协议,另一个就是MAC帧协议,这二者都是处于数据链路层。
ARP协议在MAC帧协议的上一层,它们属于上下层的关系。老规矩,我们先来认识报头的各个字段,再来学习它们的作用。搬好小板凳,我们马上开讲啦…


1. 数据链路层

在内网(局域网)当中要进行转发的时候,首先要考虑的是,数据怎么从A主机送到出口路由器当中,这个工作就是数据链路层要解决的问题了。

IP地址的核心工作是提供一种能力,将数据从A主机经过路径选择交给B主机,一定是有目的IP不断地查路由表。

但是A和B根本就不在一个网段, 首先要解决的是将数据先从A主机送到下一跳的能力!!

当数据进行转发的时候,就是将数据从一个子网送到另一个子网的过程(重点):

因为路由器是横跨两个子网的,所以只要将数据报转发到子网的路由器,这个路由器集联到下个子网的话,我们把这种在局域网内转发的行为,也可以称之为跨网络转发。

交付到路由器是一个内网转发的行为,但是逻辑上相当于将数据包从一个子网交到了下一个子网。

数据链路层能够将数据发送到内网中的任一台主机,也一定能将数据送到内网当中的任意一台路由器。只要这台路由器横跨两个网段,把数据交给这个路由器的过程,就意味着将数据交给了另一个网段,也就实现了跨网络传输的功能。

小结:

  • 数据链路层: 提供了在内网中,从一点到另一点的能力。
  • 网络层: 提供了寻找路径的能力。

数据链路层 + 网络层就能提供把数据从A主机跨网络,经过路径选择送到B主机的能力。

  • 一旦此层转发有问题,传输层再继续让我们重发。
  • 这几层就提供了将数据从A主机经过路径选择可靠的送到B主机的能力。
  • 只要A主机能到B主机,那么就一定能从B主机到A主机。

所以传输,网络,链路核心解决的是数据包可靠传送的问题。


2. MAC帧格式

MAC帧(Media Access Control Frame)是在计算机网络中用于数据传输的基本单位。它包含了数据链路层的头部和尾部,用于在物理介质上传输数据。

在这里插入图片描述
目的地址和源地址: 目的MAC地址和源MAC地址。

  • 每一台主机在数据链路层当中都要有自己的身份标识,就是通过MAC地址标识的。
  • MAC地址通常是48位的植入到网卡当中的具有唯一性标识的地址。
  • 虽然全球唯一但是要求在局域网内唯一就可以了。

以太网或者令牌环网,是局域网当中所采用的标准:

  • 局域网转发这件事上,底层网络通信的方式是有差异的,我们重点讲的是以太网帧格式。
  • 底层网络有差异并不影响网络在全球的使用,原因就是有IP地址的存在,IP全球是唯一的。

报头和有效载荷如何分离:如何解包?

  • 目的地址,原地址和类型固定大小的,最后有个CRC也是固定大小的。
  • 所以以太网帧格式附加的相关的报头或者校验字段一共是18Byte。
  • 在对帧格式在做提取时,可以6 Byte,6 Byte,2 Byte提取报头,再将最后4Byte扔掉,剩下的就是有效载荷。
  • 所以能拆包也就一定能封装。

未来一个收到了MAC帧的主机,应该如何向上进行交付:如何分用?

  • 两个字节的类型,我们称之为帧类型,通常代表的是有效载荷应该向上交付给哪一个协议。
  • 例如:如果帧类型是0800对应的有效载荷就是IP数据包。
  • 其他的类型就是对应的不同的字段。
  • 所以就能知道数据载荷字段是什么类型,进一步再向上交付就可以了。

帧类型:

  • 在MAC(媒体访问控制)帧协议中,类型字段(Type Field)是用来指示数据帧中所携带的上层协议类型的字段。
  • 它位于MAC帧的报头部分,并占据2个字节(16位)。
  • 类型字段的作用是告诉接收方如何解析数据帧的有效载荷部分。
  • 通过读取类型字段的值,接收方可以确定上层协议的类型,并将数据帧传递给相应的协议栈进行进一步处理。

类型字段可以是:

  • 0x0800:表示IPv4协议。
  • 0x86DD:表示IPv6协议。
  • 0x0806:表示ARP(地址解析协议)。
  • 0x8100:表示VLAN(虚拟局域网)标记协议。

3. 再谈局域网

局域网内,一个主机如何知道自己的报文应该交给哪台主机呢?是由报文所要去的目的IP地址决定的!!

将报文丢在局域网当中,每台主机都要收到这个报文:

  • 凡是在局域网中的所有主机,无时无刻都要从局域网当中抓数据。
  • 因为随时随地都要从局域网中拿数据。
  • 主要局域网中有数据了,所有的主机都必须将报文拿到自己的主机里面。
  • 因为只有拿到才能确认这个数据是不是发给自己的。
  • 不管是不是发给自己的对于这台主机来讲都是有意义的。

数据在局域网中传输:

  • 每一个主机都要获取。
  • 每一个主机的哪一层协议先获取这个数据帧呢?
    • 数据链路层(不考虑物理层),网络永远都是终于链路层始于链路层的。
  • 每一个主机数据链路层协议的解析(解包 + 分用)。
  • 对比目的mac地址和自己的mac地址是否相同。
    • 相等:向上交付(根据类型),分用。
    • 不相等:丢弃,一旦底层将数据包丢弃了,上层就不知道有这个数据包的存在了。

抓包:

  • 网卡有一种模式可以被设置叫做混杂模式。
  • 网卡就不做数据筛选,直接将局域网读到的数据一股脑网上交付,这个就叫做抓包。

数据碰撞:

  • 当多台主机同时向局域网内发送数据时,冲突吗?—— 冲突!!
  • 因为在网络中走的都是一些光电信号,会互相进行干扰,那么谁发送的数据都没办法处理。
  • 所以就要让冲突的几台主机,随机休眠上一段时间,再进行在局域网当中对数据做重发。
  • 我们把这个局域网也叫做一个碰撞域。

交换机:

  • 因为交换机这样的设备存在,将大的局域网划分成小的区域。
  • 这个小的区域当中,合法请求转发,再小的区域中就能完成的通信过程就不要往外面却散了。
  • 进而可以减少一个一个碰撞域的体积。
  • 交换机除了在局域网当中进行数据帧转发(不转也能发送),核心工作:划分碰撞域。
  • 在一定程度上,减缓主机之间碰撞的可能性。

要明确几点:

  • 主机越多越好,还是越少越?
    • 好肯定是越少越好了,发生碰撞的概率越低
  • 交换机或网桥:划分碰撞域(硬件上)。
    • 网卡和交换机都是工作在数据链路层的设备。
  • 软件上减少局域网内碰撞的概率:
  • 一般MAC帧一般体积不要过大,要对得上MTU的要求。

网络层IP报文分片的原因:

  • 一旦碰撞了就是否定了之前所做的工作,曾经花费的成本就付之东流了。
  • 所以MAC帧的体积不要太大,就要对上层提要求。
  • 要求IP层发送的数据包不要太大,所以IP层才会分片,才有了MTU这样的概念。
  • MAC帧规定上层交给它的数据(IP报文)不能超过1500Byte

碰撞域在物理上减少主机的个数,在软件上减少报文的大小,进而就可以减少碰撞,还有一些碰撞避免的算法。

数据包的大小体积不由MAC帧决定(它只提标准),更不由网络层决定(它只是个跑腿的),而是由传输层(TCP/UDP) 决定,传输层决定了IP报文要不要分片的问题。


4. ARP协议

4.1 路由器的转发过程:

在这里插入图片描述

  • 当路由器接收到一个数据包时,它首先会解析以太网帧,提取出其中的MAC地址信息。
  • 然后,路由器会根据目标IP地址在路由表中查找下一跳的信息。
  • 接下来,路由器会封装数据包为新的以太网帧,更新目标MAC地址为下一跳的MAC地址,并将数据包发送到下一个路由器。这个过程被称为数据包的转发。
  • 在下一个路由器上,类似的过程会再次发生。该路由器会解析以太网帧,提取出目标IP地址,并根据路由表确定下一跳的信息。
  • 然后,它会封装数据包为新的以太网帧,更新目标MAC地址,并将数据包发送到下一个路由器或目标主机。

这样,数据包通过一系列的路由器转发,最终到达目标主机所在的网络。每个路由器都负责解析和封装以太网帧,以便在不同网络节点之间进行数据包的转发和路由选择。

4.2 ARP协议格式:

当我们数据包到了对方子网入口路由器时,怎么将数据包给指定主机呢?

在这里插入图片描述
路由器D只知道它收到的报文,将来是要给IP为主机C的IP的主机,并不知道主机C的MAC地址,所以没办法发送。

—— 所以有了ARP协议。

  • 同层协议也有上下关系,ARP协议是MAC帧协议的上层。
  • MAC帧协议数据除了是IP报文,也可能有ARP这样的协议充当MAC帧的有效载荷。

当路由器D收到了报文之后,并不知道目的主机的MAC地址:

  • 那么能否确定该要找的主机就在这个局域网里呢?
    • 能知道!!因为当前是根据目的IP地址来判断的。
    • 具体来说就是根据网络号判断的。
  • 只要判断在这个局域网,那么就在通信之前先进行ARP请求,得到主机C的MAC地址。
  • 然后再路上封装MAC帧,将报文准确的一对一交给主机C。
  • 至此就完成了数据包转发。

在这里插入图片描述
假设有主机A和主机B,主机A只知道主机B的IP地址,但是并不知道主机B的MAC地址。

硬件类型: 指链路层网络类型,1为以太网。

协议类型: 指要转换的地址类型,0x0800为IP地址。

硬件地址长度: 6个字节。

协议地址长度: 4个字节(IPv4)。

发送端以太网地址: MAC A

发送端IP地址: IP A

目的以太网地址:F

目的IP地址: IP B

路由器然后将整个报文封到了MAC帧的有效载荷,然后将数据帧转出去。

而数据帧在转的时候也不知道要转给谁,所以目的地址填的也是全F。
所以这个数据帧在转发的时候,在局域网当中就全部被转发,以播的形式被每个主机都收到了。


5. 如何获得目的MAC地址

路由器MAC帧将ARP封装到了自己的有有效载之后,就要在局域网内广播:

  • 那么每个主机都要提取,目的地址是全F,每一台主机都要处理(目的地址广播所有主机都要处理)。
  • 每一台主机都要提取MAC帧的帧类型,帧类型是0806发现是ARP。
  • 每一个主机都要将报文解开,将有效载荷交给上层ARP协议。
  • ARP层接收到了先看目的IP地址,所有的主机都会拿着目的IP地址与自身的IP地址对比。
  • 如果请求不是自己的,就在ARP层将数据包丢弃了。
  • 这时是在ARP层丢弃的,并不是在MAC帧层丢弃的,但也是在数据链路层。

op字段为1表示ARP请求,op字段为2表示ARP应答。

  1. 任何一台主机,可能同时在向别的主机发起ARP,也在接受别的主机给他的ARP应答!
  2. 任何一台主机,都可能被发起ARP请求。

对于任何一台主机(重点):

  • 发出:
    • 一定发出的是ARP的请求。
  • 接收:
    • 别人向我发起的ARP请求。
    • 我向别人发起ARP请求时,得到的ARP响应。

假设局域网内从A主机发送给B主机具体流程:

主机A要发起ARP了,填写报文的相应字段。主机A构建了一个ARP请求,并不是直接发过去的,而是交付给下一层。

在这里插入图片描述
局域网内,发出去的数据包一定能被主机B收到!!

主机B除外的其他主机收到报文后:

  • 其他主机也能拿到这个报文,因为是广播,目的MAC地址全F。
  • 于是其他主机就开始处理这个报文,在MAC帧层解包,然后将有效载荷交付给上一层(ARP层)。
  • ARP层首先要提取出op字段,先根据op来判断这次的ARP报文是请求还是响应。
  • 然后立马再看目的IP,一看填的是IPB和自己不一样,所以其他主机直接将报文丢弃。

主机B收到报文后:

  • 与此同时,主机B也要做同样的工作,MAC帧层也要将报文的有效载荷交给ARP层。
  • 主机B也要先提取op,发现是1,那就是请求。
  • 然后立马再看目的IP,一看填的是IPB和自己的一样。
  • 再看是哪个主机要请求主机B的MAC地址,提取出发送端以太网地址,和发送端IP地址。

主机B再下来就要构建一个ARP应答:

在这里插入图片描述
然后MAC帧就封装好了发送到局域网里,其他的主机也能收到,只不过在MAC帧层提取以太网目的地址时,发现和自己不一样,直接就将报文丢弃了。

所以第一次丢弃(发送时)和第二次丢弃(响应时)是不一样的!!第一次是在ARP层丢弃的,第二次是在MAC帧层丢弃的。

主机A收到报文后:

  • 于是主机A收到了报文,在MAC帧层提取报头中的以太网目的地址,发现数据就是发给主机A的。
  • 帧类型是0806是ARP,所以解包将报文直接向上交付给自己的ARP层。
  • 接下来ARP层先看op,值为2代表的是应答。
  • 就意味着主机A曾经向别的主机发起过ARP请求,这个时候请求的那个主机给我应答了。
  • 这时主机A才获取发送端的以太网地址,发送端的IP地址。

所以主机A就得到了主机B,IP为B的主机的MAC地址。然后再将报文重新封装成MAC帧再定向的发送给主机B,此时就能正常的进行通信了。

衍生问题:

如果远方的发送主机,非常高频的向主机B发数据的话,难道每次发送每一个报文的时候都要遵守先ARP得到MAC地址,然后再向主机B发送的过程吗?

  • 这是不是有点挫了?这样效率太低了!!
  • ARP肯定不是每一次都要发起的,需要被缓存起来!谁请求?谁缓存!!
  • 缓存的是目的IP和目的MAC的映射关系。
  • 一旦经过一次ARP得到目的IP和目的MAC地址对的映射关系,在系统层面上缓存起来。
  • 往后的再发的报文直接拿着目的IP去查表查到MAC地址就好了,然后再将报文发过去。

万一主机B的MAC地址发生变化了:

  • 比如说这个主机不联网退出了,重新又接入了一台主机。
  • 那么这个IP地址就被新主机拿到了(动态分配IP)。
  • 所以这个缓存是暂时缓存,一般是15 ~ 20分钟(可以配置)。

这个缓存有个特点,因为MAC地址一直在变,所以就注定了这个缓存要保存最新的MAC地址。只要ARP比较新,就会重新更改缓存数据。

查看ARP缓存表:

Linux指令:arp -a

补充:

ARP的过程不是只在一个局域网内发生的, 而是在每一个局域网中发生,也可以在路由的路上进行ARP。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短视频矩阵系统搭建/源头----源码

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统,目前是全国源头独立开发),开发功能大拆解分享,功能大拆解: 7大模型剪辑法(数学阶乘&#xff…

行业追踪,2023-10-26

自动复盘 2023-10-26 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

ARM | 传感器必要总线IIC

IIC总线介绍 1.谈谈你对IIC总线理解? 1)IIC总线是串行半双工同步总线,主要用于连接整体电路 2)SCL/SDA作用:IIC是两线制,一根是时钟线SCK,用于控制什么时候进行进行数据传输,时钟信号由主机发出; 另一根是数据线SDA,用于进行数据传输,可以从…

Spring Boot整合OAuth2实现GitHub第三方登录

Spring Boot整合OAuth2,实现GitHub第三方登录 1、第三方登录原理 第三方登录的原理是借助OAuth授权来实现,首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码,然后客户端拿着授权码与授权服务器建立连接获得一个Access Token…

如何将Mysql数据库的表导出并导入到另外的架构

如何将Mysql数据库的表导出并导入到另外的架构 准备一、解决方法1.右键->导出->用mysqldump导出2.注意路径一般为:C:/Program Files/MySQL/MySQL Server 8.0/bin/mysqldump.exe和导出的sql文件位置3.右键->SQL脚本->运行SQL脚本4.找到SQL脚本并点击确定…

软考系统架构师知识点集锦五:系统可靠性分析与设计

一、考情分析 二、考点精讲 2.1相关基本概念 可靠性:可靠性是软件系统在应用或系统错误面前,在意外或错误使用的情况下维持软件系统的功能特性的基本能力。 可用性:可用性是系统能够正常运行的时间比例。 软件可靠性 ≠ 硬件可靠性 软硬件对比 复杂性:软件复杂性比…

canvas基础3 -- 交互

点击交互 使用 isPointInPath(x, y) 判断鼠标点击位置在不在图形内 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

国际腾讯云自主拼装直播 URL教程!!!

注意事项 创建转码模板 并与播放域名进行 绑定 后&#xff0c;转码配置后的直播流&#xff0c;需将播放地址的 StreamName 拼接为 StreamName_转码模板名称&#xff0c;更多详情请参见 播放配置。 前提条件 已注册腾讯云账号&#xff0c;并开通 腾讯云直播服务。 已在 域名…

【golang】Windows环境下Gin框架安装和配置

Windows环境下Gin框架安装和配置 我终于搞定了Gin框架的安装&#xff0c;花了两三个小时&#xff0c;只能说道阻且长&#xff0c;所以写下这篇记录文章 先需要修改一些变量&#xff0c;这就需要打开终端&#xff0c;为了一次奏效&#xff0c;我们直接设置全局的&#xff1a; …

C++继承总结(下)——菱形继承

一.什么是菱形继承 菱形继承是多继承的一种特殊情况&#xff0c;一个类有多个父类&#xff0c;这些父类又有相同的父类或者祖先类&#xff0c;那么该类就会有多份重复的成员&#xff0c;从而造成调用二义性和数据冗余。 class Person {public:Person(){cout << "P…

Unity的live2dgalgame多语言可配置剧情框架

这段代码用于读取表格 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using UnityEngine.Networking; using UnityEngine.UI; using Random UnityEngine.Random;public class Plots…

使用AOP切面实现日志记录功能

系列文章 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. Java中运用BigDecimal对字符串的数值进行加减乘除等操作 5. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&…

将CSDN或Confluence文章转为微信公众号格式

最近在更公众号文章&#xff0c;苦于排版和格式&#xff0c;就找了一个比较方便的方法&#xff0c;简单易用&#xff0c;排版也不错。 文章提取 有的文章是已经发布在其它平台了&#xff0c;比如CSDN或Confluence&#xff0c;可以使用飞书剪存方便的将文章提取出来&#xff0…

垃圾回收系统小程序

在当今社会&#xff0c;废品回收不仅有利于环境保护&#xff0c;也有利于资源的再利用。随着互联网技术的发展&#xff0c;个人废品回收也可以通过小程序来实现。本文将介绍如何使用乔拓云网制作个人废品回收小程序。 1. 找一个合适的第三方制作平台/工具&#xff0c;比如乔拓云…

人工智能基础_机器学习001_线性回归_多元线性回归_最优解_基本概念_有监督机器学习_jupyter notebook---人工智能工作笔记0040

线性和回归,就是自然规律,比如人类是身高趋于某个值的概率最大,回归就是通过数学方法找到事物的规律. 机器学习作用: 该专业实际应用于机器视觉、指纹识别、人脸识别、视网膜识别、虹膜识别、掌纹识别、专家系统、自动规划、智能搜索、定理证明、博弈、自动程序设计、智能控制…

公众号迁移如何线上办理公证?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;1.可合并多个公众号的粉丝、文章&#xff0c;打造超级大V2.可变更公众号主体&#xff0c;更改公众号名称&#xff0c;变更公众号类型——订阅号、服务号随意切换3.可以增加留言功能4.个人订阅号可迁移到企业名…

Go学习第十一章——协程goroutine与管道channel

Go协程goroutine与管道channel 1 协程goroutine1.1 基本介绍1.2 快速入门1.3 调度模型&#xff1a;MPG模式介绍1.4 设置cpu数1.5 协程资源竞争问题1.6 解决协程并发方案 2 管道channel2.1 基本介绍2.2 快速入门2.3 管道的关闭和遍历2.4 管道和协程的结合2.5 声明 只读/只写 的管…

最新SQL注入漏洞修复建议

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 SQL注入漏洞修复建议 常用的SQL注入漏洞的修复方法有两种。 1&#xff0e;过滤危险字符 多数CMS都采用过滤危险字符的方式&#xff0c;例如&…

小程序配置请求代理

在app.json中添加“proxy”字段配置代理 "proxy": {"/api": {"target": "http://192.168.110.249:8221/",//你要请求的目标地址"changeOrigin": true,"pathRewrite": {"^/api": ""//重定向}}…

【GIT】:一文快速了解什么是GIT

【GIT】&#xff1a;一文快速了解什么是GIT 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 关于版本控制 什么是“版本控制”&#xff1f;我为什么要关心它呢&#xff1f; 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来…