【网络编程·数据链路层】MAC帧/以太网协议/ARP协议/RARP协议

news2024/11/25 23:29:01


 需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


目录

一、MAC帧

1、IP地址和MAC地址的区别

2、MAC帧协议

3、MTU对IP协议的影响

4、MTU对UDP协议的影响

5、MTU对TCP协议的影响

二、以太网协议

1、以太网中的MAC帧如何解包、分用

1.1解包

1.2分用

2、MAC地址

3、局域网中转发的原理

三、ARP协议

1、ARP协议的介绍

2、ARP协议的格式 

3、ARP的请求和响应 

4、ARP欺骗

四、RARP协议

五、一些重要的技术或协议

1、DNS(应用层协议,用的是UDP协议)

2、ICMP(网络层协议)

3、代理服务器


路由器之间相互转发的是IP报文,而网线上跑的是MAC帧。跨网络传输的本质,是由无数个局域网(子网)转发的结果。那么在同一个局域网在中进行数据的转发,就需要依靠数据链路层的以太网协议。

一、MAC帧

1、IP地址和MAC地址的区别

IP地址描述的是路途总体的起点和终点;

MAC地址描述的是路途上的每一个区间的起点和终点;

2、MAC帧协议

数据链路层的MAC帧协议规定自己的有效载荷不能超过1500字节(MTU(最大传送单元,可以修改)),这1500个字节限制包括了上层报头+有效载荷。

数据包的大小只有传输层能控制,但有时仍会超过1500字节,只能由IP协议进行分片与组装来解决,发送端IP层进行分片,每一个分片都会有IP报头,对端IP层进行组装(字节超限并不是主流情况)。TCP和MAC帧并不关心IP对数据包进行了分片和组装,这仅仅是IP层自己的行为。

路由器也是主机,也有自己的最大MTU的限制,如果某个路由器的MTU为500字节,但是接收到了局域网内某个主机1500字节的报文,这是路由器就会对这个报文再次进行分片组装!

3、MTU对IP协议的影响

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

1、将较大的IP包分成多个小包, 并给每个小包打上标签;

2、每个小包IP协议头的 16位标识(id) 都是相同的;

3、每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);

4、到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;

5、一旦这些小包中任意一个小包丢失, 接收端的重组就会失败,但是IP层不会负责重新传输数据,传输层若为TCP将超时重传,UDP将表现为丢包。

4、MTU对UDP协议的影响

1、一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。

2、这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。

5、MTU对TCP协议的影响

1、TCP的一个数据报也不能无限大, 还是受制于MTU。TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);

2、TCP在建立连接的过程中, 通信双方会进行MSS协商。

最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。

3、双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。

4、然后双方得知对方的MSS值之后, 选择较小的作为最终MSS。

5、MSS的值就是在TCP首部的40字节变长选项中(kind=2)。

二、以太网协议

1、以太网中的MAC帧如何解包、分用

1.1解包

采用定长的策略。如图,报头是6+6+2=14字节,CRC校验位是4字节,解包时掐头去尾固定字节即可,剩下的就是有效载荷。

1.2分用

如图,以太网协议的MAC帧的报头里有类型字段,这个字段包含了这个报文应该向上交付给网络层中的哪一种协议。其中0800代表上层是IP协议;0806代表上层是ARP协议;8035代表上层是RARP协议等。

2、MAC地址

MAC地址共48位。全球任意一张网卡都有唯一的MAC地址。(其实MAC地址只要保证在局域网中唯一就行了)

使用ifconfig命令查看本机的MAC地址:

3、局域网中转发的原理

1、局域网中的一台主机发送了一个MAC帧,在该局域网中所有的主机都可以收到这个MAC帧,由于MAC帧中存在目的MAC地址字段,非该IP的主机的数据链路层拿到后会丢弃该MAC帧,并不会向上交付,只有目的MAC地址的主机才会收到并向上交付MAC帧。

2、在局域网中,网卡有一种“混杂模式”(默认不开启),该模式不放弃任何数据帧,从局域网中获得的所有数据帧不管目标MAC地址是不是我,全部向上交付。这也是局域网抓包工具的原理。

3、在局域网中,如果多个主机同时进行数据传输,那么总线上的模拟信号就会互相干扰,发生碰撞冲突。所以在同一时刻,局域网中只能有一台主机发送消息。为了控制局域网中同一时刻只能由一台主机发送消息,就有了多种标准对其进行控制。例如:

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

以太网:以太网使用一种称为CSMA/CD(带冲突检测的载波侦听多路访问)的协议来管理和调度数据传输。在CSMA/CD中,每个节点都监听网络上的信道来检测是否有其他节点正在发送数据。如果检测到信道空闲,则节点可以开始发送数据;否则,节点会等待一段随机时间后再次尝试发送。

可以使用某些方法不间断的在局域网中发送垃圾数据(发送垃圾数据的主机不参与碰撞检测和碰撞避免算法,就一直发),轻则局域网内其他主机数据卡顿,重则局域网瘫痪。

4、局域网越大,局域网内主机发生碰撞的概率就会增加。可以在局域网中使用交换机。首先交换机能够对局域网进行区域分割,例如图中主机A、D之间的数据转发将不会被交换机转发至另一侧;其次交换机能够识别局部性的碰撞,如果交换机一侧发生了碰撞,那么就不会对这个碰撞数据进行转发,该次碰撞将不会影响另一侧的数据转发。

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

三、ARP协议

源主机只知道目的IP却不知道目标主机的MAC地址,当报文千里迢迢来到目的IP地址后,需要找到对应的主机递交报文。在局域网通信中,必须得知道目标主机的MAC地址才能将数据封装成MAC帧。

此时目的IP的路由器通过报文只知道该报文的目的IP,想知道这个IP对应的主机MAC地址是多少,路由器就需要使用ARP协议来查找IP和MAC地址的映射关系。

1、ARP协议的介绍

ARP协议是一个介于数据链路层和网络层之间的协议。

1、在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的MAC地址。

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

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

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

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

4、ARP收到应答的时候,会以最新的应答为准。

2、ARP协议的格式 

1、注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。

2、硬件类型指链路层网络类型,1为以太网;

3、协议类型指要转换的地址类型,0x0800为IP地址;

4、硬件地址长度对于以太网地址为6字节;

5、协议地址长度对于和IP地址为4字节;

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

7、局域网中的主机可以通过ARP协议获取当前局域网中所有主机的MAC地址。

3、ARP的请求和响应 

1、全F表示该字段并未设置。例如ARP请求是不知道目的以太网地址的。当ARP请求在广播时(以太网目的地之为全F),局域网内的其他主机都能接收到该MAC帧并向上交付至ARP协议

2、这些主机接收到ARP类型的MAC帧时,根据op字段区分该ARP报文时应答还是请求。

3、当被请求主机发送ARP应答时,其他主机在数据链路层就可以通过以太网目的地址字段区分这个MAC帧是不是给我的。

4、ARP欺骗

底层是可以通过ARP欺骗窃取报文的,所但是报文通过HTTPS协议加密后,即便中间人拿到报文,没有秘钥也解不开报文。

窃取报文只是一方面,也可以利用ARP欺骗不断向某个主机(或者对局域网所有主机循环)发送ARP应答,应答的内容是路由器的IP+乱写的MAC地址,那么某个主机收到这个应答就会误以为路由器的MAC地址是你乱写的MAC地址,只要你的ARP应答不停,这台主机就上不了网。

四、RARP协议

只知道某台主机的MAC地址,不知道它的IP地址。发送RARP请求问一下局域网中的所有主机,指定MAC地址的主机将会把该请求数据帧向上交付给RARP协议,若非指定MAC的主机拿到该数据帧后发现MAC地址不符,这个MAC帧在数据链路层就被丢弃了。

五、一些重要的技术或协议

1、DNS(应用层协议,用的是UDP协议)

整个网络协议栈用的都是IP而不是域名,我们访问的百度的网址就是域名。这是因为IP对人的记忆及使用不友好,域名网址就比较直观了。DNS就是一套从域名映射为IP的系统。

例如百度的域名:

www.baidu.com

域名之间使用 . 连接

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

baidu: 二级域名, 公司名。

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

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

域名解析过程:详见《图解TCP/IP》。

2、ICMP(网络层协议)

一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因。

1、确认IP包是否成功到达目标地址;

2、通知在发送过程中IP包被丢弃的原因;

3、ICMP也是基于IP协议工作的,但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;

4、ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;

ping命令的底层就是通过ICMP来实现的: 

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中根本就不关注端口号这样的信息。

traceroute命令,也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器:

3、代理服务器

正向代理:客户端想请求目标服务器,代理服务器代理客户端的请求去目标服务器请求资源并发送给客户端称为正向代理。(收集客户端请求,对请求进行管理)

反向代理(作为机房的入口机器):客户端想从服务端请求某一资源,代理服务器将从内网服务器集群中将结果返回给客户端,客户端是不知道请求的目标服务器是谁。

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

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

NAT和代理服务器的区别:

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

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

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

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

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

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

相关文章

Python 3.x标准数据类型

文章目录 一、数字1.1 基本的数字类型有:1.2 整数数字表示方式二、字符串2.1 操作符2.2 格式化百分号format 格式化输出位置匹配2.3 字符串 索引和切片2.4 切片:字符串 [ 起始索引:终止索引:步长 ]字符串连接操作三、列表3.1 列表的定义3.2 常用方法(功能:增删改查)增删除…

S7-1200/1500增量式PID(输出归一化、支持PWM输出)

离散增量式PID算法公式请查看下面文章链接: 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)_用三菱plc自己编写pid算法_RXXW_Dor的博客-CSDN博客关于PID废话不多说,各种位置式增量式资料和公式网上也非常多。PID从提出和发展目前已经一个世纪过去了,还在不断研究创新,…

使用Puppeteer构建博客内容的自动标签生成器

导语 标签是一种用于描述和分类博客内容的元数据&#xff0c;它可以帮助读者快速找到感兴趣的主题&#xff0c;也可以提高博客的搜索引擎优化&#xff08;SEO&#xff09;。然而&#xff0c;手动为每篇博客文章添加合适的标签是一件费时费力的工作&#xff0c;有时候也容易遗漏…

【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务

【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务 对象存储服务MinIOMinIO简介MinIO特点开箱使用docker安装启动管理控制台 快速入门Java 上传文件到minio配置访问权限 封装MinIO为starter创建模块zy-minio-starter配置类封装操作minIO类对外加入自动配置其他微服务使用 安…

好绝一数据可视化工具,零编程“BI+方案”

在一开始的时候&#xff0c;国外BI数据可视化工具的使用人群圈定在IT人员身上&#xff0c;所以我们可以看到国外BI数据可视化工具对使用者的IT技术要求较高&#xff0c;真正具有强烈数据分析需求的业务们反而无法按需分析。而现在&#xff0c;随着国产BI的崛起&#xff0c;面向…

Java线程概述 (二)线程实例演示

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;创建线程的三种方式&#x1f415;使用java.lang包下的Thread类&#x1fa85;实现Runnable接口&#x1f993;实现Callable接口 &#x1f415;synchronized简单介绍&#x…

Java手写数组队列和链表队列并使用java里面现成的队列方法

Java队列实现与常用使用方法介绍 说明使用数组手动实现队列功能使用单向链表手动实现队列功能Java中ArrayBlockingQueue和ArrayQueue和LinkedBlockingQueue使用ArrayQueue使用方法如下:ArrayBlockingQueue常用使用方法如下:LinkedBlockingQueue常用使用方法如下:ArrayBlockingQ…

Spring-mvc的参数传递与常用注解的解答及页面的跳转方式---综合案例

目录 一.slf4j--日志 二.常用注解 2.1.RequestMapping 2.2.RequestParam 2.3.RequestBody 2.4.PathVariable 三.参数的传递 3.1 基础类型 3.2 复杂类型 3.3 RequestParam 3.4 PathVariable 3.5 RequestBody 3.6 增删改查 四.返回值 4.1 void 返回值 4.2 String 返…

用go实现dns请求

一、DNS报文格式详解 1.1 报文格式 DNS分为查询请求和查询响应&#xff0c;两者的报文结构基本相同。DNS报文格式如下表展示 0 1516 31事务ID&#…

CVE-2023-28303(截图修复)

在做羊城杯的misc的时候发现了一个图片&#xff0c;典型的图片高度不对&#xff0c;修改之后对图片的高度进行不断修改尝试&#xff0c;发现图片很大&#xff0c;但是内容没有出现&#xff0c; 从这里指知道存在feld文件x 截出zip文件内容&#xff0c;把04 03 改为03 04 这里的…

SOLIDWORKS放样是什么意思?

SOLIDWORKS是一款广受欢迎的三维计算机辅助设计&#xff08;CAD&#xff09;软件&#xff0c;提供了许多强大的功能来帮助工程师实现他们的创意。其中一个重要的功能是放样功能&#xff0c;它在设计过程中起着至关重要的作用。本文将介绍SOLIDWORKS放样的概念、特点和应用。 放…

怎么将火狐浏览器中的书签或密码迁移到谷歌浏览器

文章目录 一、点击谷歌浏览器右上角二、选择书签–导入书签和设置…三、点击导入 一、点击谷歌浏览器右上角 二、选择书签–导入书签和设置… 在下拉框中选中Firefox&#xff0c;点击导入 三、点击导入

sublime text 格式化json快捷键配置

以 controlcommandj 为例。 打开Sublime Text&#xff0c;依次点击左上角菜单Sublime Text->Preferences->Key Bindings&#xff0c;出现以下文件&#xff1a; 左边的是Sublime Text默认的快捷键&#xff0c;不可编辑。右边是我们自定义快捷键的地方&#xff0c;在中括号…

手机便签功能在哪里?如何在便签里添加文字图片视频?

手机已成为我们生活中不可或缺的工具&#xff0c;而在使用手机的过程中&#xff0c;我们经常需要随手记录一些重要的事情。那么&#xff0c;如何高效便捷地记录这些事情呢&#xff1f;答案就是使用手机便签软件。但是&#xff0c;有很多人不知道手机便签功能在哪里&#xff1f;…

使用scp在两个linux系统之间传输文件

使用scp在两个linux系统之间传输文件 问题背景拷贝文件首先我们要从源设备&#xff08;本文中是矩池云自己的服务器&#xff09;传输文件至目标设备&#xff08;本文中是A100设备&#xff09;传输一个文件传输一个文件夹 从目标设备&#xff08;本文中是A100设备&#xff09;下…

Python基础之高级函数

异常捕获 Python中&#xff0c;使用trycatch两个关键字来实现对异常的处理。在我们平时的工作中&#xff0c;异常的出现是在所难免的&#xff0c;但是异常一旦出现&#xff0c;极有可能会直接导致程序崩溃&#xff0c;无法正常运行&#xff0c;所以异常一定要及时的做出对应的…

QT(9.5)QT连接OpenCV库完成人脸识别,c语言中的static和c++中的static的用法,在c和c++中const关键字的用法,Qt中基于TCP通信中的服务器和客户端的操作

1.QT完成人脸识别 pro文件: 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map&g…

【STL】模拟实现map和set {map和set的封装;核心结构;插入和查找;红黑树的迭代器;STL中的红黑树结构}

模拟实现map和set map和set是红黑树的两种不同封装形式&#xff0c;底层使用同一颗泛型结构的红黑树&#xff0c;只是存储类型不同。set是红黑树的K模型&#xff0c;存储key&#xff1b;map是红黑树的KV模型&#xff0c;存储pair<key,value>。 下面的代码和讲解着重体现…

Vue进阶(三十三)Content-Security-Policy(CSP)详解

文章目录 一、前言二、XSS 攻击都有哪些类型&#xff1f;三、CSP介绍3.1 使用HTTP的 Content-Security-Policy头部3.2 使用 meta 标签 四、CSP 实施策略五、Vue中可使用的防XSS攻击方式六、拓展阅读 一、前言 作为前端工程师你真的了解 XSS 吗&#xff1f;越来越多超级应用基于…

预付费电表和断路器的连接方式及注意事项

随着智能电网技术的不断发展&#xff0c;预付费电表已经在我国得到了广泛应用。预付费电表不仅可以实现远程自动抄表、实时监控用电量等功能&#xff0c;还可以有效防止偷电行为&#xff0c;提高用电安全。断路器作为低压配电系统中的重要组成部分&#xff0c;具有保护电路、防…