【Linux】MAC帧

目录

一、MAC帧

(一)IP地址和MAC地址

(二)MAC帧格式

(三)MTU对IP协议的影响、

(四)MTU对UDP协议的影响

(五)MTU对TCP协议的影响

二、以太网协议

(一)以太网MAC帧如何进行解包和分用

(二)局域网中转发原理

三、ARP协议

(一)ARP协议的作用

(二)ARP数据报的格式

(三)ARP协议的工作流程

(四)RARP协议

四、相关的技术与协议

(一)DNS协议

(二)ICMP协议

(三)代理服务器


一、MAC帧

(一)IP地址和MAC地址

        通过上节我们了解一台入网的主机的IP地址是有可能发生变化的,例如该主机处于不同的网络或重新入网时路由器分配了新的IP地址,因此仅靠IP地址是无法完成网络中数据通信的,因此引入了MAC地址。

        MAC地址用来区别数据链路层中相连的节点,MAC地址是网络接口卡的硬件标识符,全球唯一,主要作用于数据链路层,描述的是数据传输中每个区间的起点和终点。

        MAC地址一共48位,全球任意一张网卡都有唯一的MAC地址。使用 ifconfig 命令可查看本机的MAC地址:

(二)MAC帧格式

目的地址:目的主机的MAC地址;

源地址:发送主机的MAC地址;

类型:MAC帧类型;

CRC:MAC帧校验码。

        数据链路层的MAC数据帧协议规定了单帧有效载荷最大为1500字节,有效载荷的最大值称MTU最大传送单元。

        在网络通信中,真正决定数据发送的是传输层,因此数据包的大小实际由传输层决定。若传输层向下交付的数据包过大,则需要IP层将数据进行分片以及重组,而数据链路层对此并不关心只负责数据包的发送

        在网络传输中,不仅仅只有主机采用MTU最大传输单元,对于中间节点的路由器同样也存在MTU最大传输单元,若报文大小超过了路由器的MTU最大传输单元且该数据报中的df = 0,那么路由器的IP层会再次对报文进行IP分片后发送报文,若df = 1 也就是禁止分片的话,路由器会将报文丢弃并通知发送端(ICMP报文)。

(三)MTU对IP协议的影响、

        由于数据链路层MTU的限制,对于较大的IP数据包要进行分片:

        当传输层交付的数据过大需要进行分片时,IP层首先将数据进行分割并填写相应的报头信息,其中被原始的数据报分配唯一的标识位,所有分片继承该标识,除了最后一个分片外,其他分片的标志位中的MF = 1,最后的标识位置0。置1表示后续还有分片,而置0表示后续没有分片即该数据报为最后一个分片。在分片的同时也需要填写片偏移大小,该字段用于表示该数据报的数据原处分配前数据的起始位置,其中除了最后一个分片以外,其他的分片的偏移量必须是8的整数倍。

        当收到一个报文时,查看标志位的MF是否为1,若为1则说明该报文进行过分片操作并不是完整报文,若为0则需要查看该报文的偏移量,若偏移量不为0则说明该报文是被分片后的最后一个IP报文,若为0则说明该报文本身是个完整的报文;通过以上步骤即可验证该报文是否被分片,若没有进行分片该报文本身就是一个完整报文,若该报文进行过分片,需等到最后一个报文的到达。偏移量为数据处原始数据的起始地址。因此当收到最后一个报文后,只需要将各个报文按偏移量大小进行排序,验证各个相邻报文之间的是否连续即可判断收到的所有分片报文是否完整。若完整则重新组装后交付给上层。

        在传输过程中,数据包进行分片后的小数据包中任意一个小包丢失,接受端的重组就会失败,若需要重新发送数据包,是需要将整个数据包重新进行分片后再此全部发给发送端的,IP层不服职责重新传输数据,由上层决定。因此在实际传输中,传输层会避免向下交付的数据包过大而导致IP分片的,IP分片不仅仅增加了网络层的负担,也增加了整个数据包重传的风险。

(四)MTU对UDP协议的影响

  • 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
  • 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。

(五)MTU对TCP协议的影响

  • TCP的数据不能过大,IP协议受制于MTU,同样的TCP协议也受制于MTU,TCP协议蛋哥数据报的最大消息长度称为MSS(Max Segment Size)
  • TCP在建立连接时,通信双方会协商MSS大小:双方在发送SYN时会把自己能支持的最大MSS值写入TCP首部,一般取双方较小的作为最终MSS;
  • 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度;
  • MSS的值就在TCP首部的40字节变长选项中。

二、以太网协议

(一)以太网MAC帧如何进行解包和分用

        MAC帧采用定长的策略,对于一个MAC帧而言,首部为 6+6+2 = 14字节以及有效载荷后的4字节CRC校验位,解包时去掉以上部分即为有效载荷。

        在MAC帧首部由类型字段,根据该类型字段即可了解将有效载荷交付给上层的哪种协议,例如0800代表是IP数据报,0806为ARP协议。

(二)局域网中转发原理

        当局域网内的一台主机发送了一个MAC帧后,局域网内的所有主机都可以收到该MAC帧,而只有其目的地址为本主机的MAC地址时,该主机数据链路层才会把该数据向上交付,而其他主机会直接将该MAC帧丢弃。在局域网中,网卡有一种“混杂模式”,该模式下不会放弃任何数据帧,物理MAC帧内的目的地址是否为主机的MAC地址,都会将MAC帧解包后向上交付,这也是局域网内抓包工具的原理。

        因此在一个局域网内如果多个主机同时发送数据,那么总线上的信号会相互干扰产生碰撞冲突。所以在同一时刻只有一台主机能够发送数据。因此需要约定一些协议保证数据的正常发送:

令牌环:令牌环网络中有一个令牌(Token)在环路上循环传递。只有持有令牌的节点才能发送数据,其他节点则监听该链路以接收数据。当节点需要发送数据时,它会将数据附加到令牌上,并将令牌继续传递下去。每个节点在接收到令牌时检查是否有附加的数据,如果有,节点就将数据提取出来并处理。

以太网:以太网使用一种称为CSMA/CD(带冲突检测的载波侦听多路访问)的协议来管理和调度数据传输。在CSMA/CD中,每个节点都监听网络上的信道来检测是否有其他节点正在发送数据;如果检测到信道空闲,则节点可以开始发送数据;否则,节点会等待一段随机时间后再次尝试发送;当多个主机同时发送该数据导致冲突时,所有主机停止发送并发送阻塞清号,随后二进制指数退避算法重新尝试发送。

        当局域网上的主机越多时,越容易发生数据碰撞冲突,因此可以在局域网中使用交换机。

        交换机可以隔绝冲突域。正常情况下,交换机并不影响局域网内的通信,例如当主机A向主机E发送数据时,交换机会正常将数据进行转发;当主机A和主机B同时向主机D发送数据时发生冲突,当交换机左侧(如图)发生冲突时并不会将发生冲突的数据转发给右侧,而右侧也就是主机C和主机E之间仍然可以继续进行正常的通信不受左侧冲突的影响。

        对于每条MAC的数据长度,数据越长,越有可能发生碰撞,这也是MAC帧协议限制有效载荷最大是1500字节的原因。

三、ARP协议

        ARP协议是介于数据链路层和网络层之间的协议,用于使用IP地址来获取MAC地址。

        在网络传输过程总,IP地址就相当于最终目的地,而MAC地址相当于中间途径的地址。数据报封装为MAC帧时需要目的MAC地址。当主机向服务器发送数据时,主机如何知道所处网段的公网路由器的MAC地址是多少?当报文到达目的网络时,路由器又怎么知道该数据包的目的地址的MAC地址是多少?这些实际都需要MAC地址。

(一)ARP协议的作用

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

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

(二)ARP数据报的格式

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

(三)ARP协议的工作流程

        当主机A需要向主机E发送数据时,由于主机A只知道主机E的IP地址,因此需要通过ARP协议获取主机E的MAC地址。

        首先主机A发送ARP请求报文,其中ARP报文中的以太网目的地址为全F,也就是为广播地址。局域网内的所有主机都会收到该请求报文,由于报文中的以太网目的地址为广播地址,对MAC帧首部进行解包后查看帧类型字段并将其交给ARP协议处理。首先读取ARP请求报文的op字段,若op字段为1即确认该报文为ARP请求报文,再查看目的IP地址是否为本主机的IP地址(目的以太网地址为全F),若不为本主机的IP地址则将该报文丢弃。

        当主机E收到该ARP请求报文后,经过处理后向主机A回送ARP响应报文,其中MAC帧首部的目的地址为主机A的MAC地址,也就是单播地址。当其他主机收到该报文后查看MAC目的地址并不是本机的MAC地址后会将该报文进行丢弃。当主机A收到该ARP响应报文后对其进行解包,查看op字段,若op字段为2即该报文为ARP响应报文,再查看发送端以太网地址字段获取主机E的MAC地址。

             除此之外,局域网内的设备实际还会维护一张ARP缓存表,用于映射IP地址和MAC地址的关系,每次封装MAC帧时首先会进行查表,若表中不存在目标条目的话才会进行ARP协议请求。

(四)RARP协议

        RARP协议与ARP协议过程类似,不过其作用为MAC地址映射IP地址,也就是知道目的主机的MAC地址,但不知道其IP地址,因此需要通过RARP协议来获取目的主机的IP地址。

四、相关的技术与协议

(一)DNS协议

        当我们通过网络访问服务器时,我们输入的往往是域名,例如我们访问百度时只需要搜索百度的域名而不是其IP地址,这是因为IP对人的记忆及使用不友好,域名网址就比较直观了,而由域名到IP地址的映射实际是由DNS来完成的。

        DNS域名系统是互联网的核心基础设施之一,承担着将人类可读的域名转换为机器可识别的IP地址的关键任务。

百度的域名:www.baidu.com

com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等。

baidu: 二级域名, 公司名。

www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议。在浏览器输入域名时可以省略。

        域名服务器一共有三类,根服务器、权威服务器和递归服务器。

根服务器:全球共13组。存储顶级域服务器地址;

权威服务器:管理特定域名的解析记录;

递归服务器:接收用户查询并完成全链路解析。

        下面简单介绍下DNS解析的一般流程:

  1. 当用户访问www.baidu.com时,先检查本地缓存(浏览器/操作系统缓存),命中则直接返回IP;
  2. 未命中则向递归服务器发送请求,递归服务器依次查询根服务器、.com服务器、baidu.com权威服务器,最终获取IP并返回;
  3. 递归服务器缓存结果,其生存时间决定缓存有效期。

        目前计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。

(二)ICMP协议

        IP协议并不是可靠的协议,如果在传输过程中丢包了,IP协议是无法得知是否出现了丢包。因此引入了ICMP协议。

        ICMP互联网控制报文协议,TCP/IP协议族中的核心网络层协议,主要用于在IP主机和路由器之间传递控制消息,辅助网络通信的可靠性和诊断。

        ICMP协议提供了以下功能:

差错报文:

  1. 目标不可达;
  2. 超时报文:TTL耗尽或分片重组超时;
  3. 重定向:通知发送端更有路由路径。

查询报文:

  1. Echo请求/应答:用于Ping等工具;
  2. 时间戳请求或应答:同步网络设备时间。

        ICMP协议是基于IP协议的,但是它并不是传输层的功能,因此将其归于网络层协议,ICMP协议只能搭配IPv4协议使用,若是IPv6则需要ICMPv6.

        PING命令实际就是基ICMP协议实现的。

        Ping命令通过发送ICMP Echo请求并等待Echo应答,测试两台主机的连通性。

1、此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址;

2、ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期);

3、ping命令会先发送一个 ICMP Echo Request给对端;

4、对端接收到之后, 会返回一个ICMP Echo Reply;

ping命令是不关注端口的,因为ping命令是基于ICMP, 是在网络层;而端口号, 是传输层的内容。在ICMP中根本就不关注端口号这样的信息。

(三)代理服务器

        

        正向代理:正向代理是客户端与目标服务器之间的中介,​代理对象是客户端。客户端通过代理服务器间接访问目标服务器,隐藏自身真实信息。

        反向代理:客反向代理是服务器端的中介,​代理对象是服务器。客户端直接访问反向代理,由代理将请求分发到后端服务器。

        采用反向代理可以实现负载均衡策略:客户端可能会发送大量的数据,反向代理服务器需要合理的将数据分配给服务器集群。

        作为反向代理的服务器,需要配置较高,充当软件服务的可以是Nginx(Web服务器,不做业务处理,只做转发处理),当反向代理服务器中的服务器集群将请求处理完,可以通过代理服务器将结果发回给客户端,也可以直接发回给客户端。

        NAT和代理服务器的区别:

1、从应用层面上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用, 比 如通过代理服务器进行翻墙;

2、从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换,代理服务器往往工作在应用层;

3、从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网。

4、从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上。

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

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

相关文章

MySQL - 数据库基础操作

SQL语句 结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language),定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…

GraalVM原生镜像支持:Spring Cloud应用启动速度提升90%

引言:当Spring Cloud遇见GraalVM,启动时间进入秒级时代 传统Spring Cloud应用因动态类加载、反射等机制导致启动缓慢(通常超过30秒),在Serverless和Kubernetes滚动更新场景下成为性能瓶颈。Spring Cloud 2023.x通过**G…

【Unity3D】摄像机适配场景以及Canvas适配

目录 宽度不变策略 高度不变策略 宽度不变策略 开发分辨率 750*1334 (宽高比:0.56) 真机分辨率 1170*2532 (宽高比:0.46) 真机宽高比<开发宽高比&#xff0c;采用宽度不变策略 理由&#xff1a;小于代表真机高度比开发高度更大&#xff0c;因此不需要担心高度上…

HarmonyOS:基于axios实现文件的下载以及下载进度的监听

#前言&#xff1a;项目开发中&#xff0c;避免不了实现文件下载功能&#xff0c;其他平台的下载都很成熟&#xff0c;网上的例子也比较多&#xff0c;我就自己项目中实现的下载功能做个总结&#xff0c;你可以参考我的写法实现功能。 下载封装基于axios实现的下载功能。 1.下载…

简单一周日期展示及选择切换

医院挂号&#xff0c;可能需要切换日期&#xff0c;选择一周内的某一天。 提供一周内的日期段&#xff0c;通过点击&#xff0c;切换到不同天。 简单的js&#xff0c;html实例。切换玩调用后台接口&#xff0c;实现后续逻辑。 使用Vue,插值语法&#xff0c;更简单。 一周日历…

二叉树的前,中,后序遍历

我们来了解一下二叉树的遍历&#xff0c;话不多说 二叉树的遍历的概念&#xff1a; 二叉树有四种遍历方式&#xff0c;分别为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历和层序遍历&#xff0c;但我们今天谈谈前三种&#xff0c;并实现它 前序遍历&#xff1a; 按照根…

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…

Android14 原生PackageInstaller安装某些apk报错问题

最近遇到Android14安装客户一个大型app的时候&#xff0c;执行到开始安装的时候就直接闪退了&#xff0c;查看log发现下面报错&#xff1a; 03-25 18:01:29.531 3085 3085 E AndroidRuntime: java.lang.RuntimeException: Could not copy bitmap to parcel blob. 03-25 18:01:2…

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…

基于 ffmpeg 实现合并视频

ffmpeg是一个强大的多媒体处理工具&#xff0c;支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…

算法每日一练 (20)

&#x1f4a2;欢迎来到张翊尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (20)不同路径 II题目描述解题思路解题代…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …

sql结尾加刷题

找了一下mysql对extractvalue()、updatexml()函数的官方介绍https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知识点 解释一下这两个参数xml_frag&#xff0c;是xml标记片段&#xff0c;第二个参数…

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;加载&#xff08;Loading&#xff09;、验证&a…

el-select 可搜索下拉框 在ios、ipad 无法唤出键盘,造成无法输入

下一篇&#xff1a;el-select 可搜索下拉框&#xff0c;选中选项后&#xff0c;希望立即失去焦点&#xff0c;收起键盘&#xff0c;执行其他逻辑 【效果图】&#xff1a;分组展示选项 >【去界面操作体验】 首先&#xff0c;通过 夸克浏览器的搜索: el-select 在 ipad 输入框…

前端框架的定制化:满足项目独特需求

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化转型浪潮中&#xff0c;前端技术体系已成为企业构建数字竞争力的核心战场。当标准化前端框架…

Flutter网络请求封装:高效、灵活、易用的Dio工具类

在Flutter开发中&#xff0c;网络请求是必不可少的功能。为了简化代码、提高开发效率&#xff0c;我们通常会封装一个网络请求工具类。本文基于Dio库&#xff0c;详细介绍如何封装一个高效、灵活、易用的网络请求工具类&#xff0c;支持以下功能&#xff1a; 单例模式&#xf…

MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例

目录 1. MyBatis-Plus简介 1.1 简介 1.2 特性 1.3 支持的数据库 1.4 框架结构 1.5 代码及文档地址 2. 入门案例 2.1 开发环境 2.2 创建数据库及表 1. 创建表 2. 添加数据 2.3 创建SpringBoot工程 1. 初始化工程 2. 引入依赖 3. IDEA中安装lombok插件 ​编辑 2.4 编…