【网络】数据链路层协议——以太网,ARP协议
> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:了解什么是以太网协议和ARP协议。
> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!
> 专栏选自:网络
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
一、前言
前面我们已经学习了网络的基础知识,对网络的基本框架已有认识,算是初步认识到网络了,如果上期我们的学习网络是步入基础知识,那么这次学习的板块就是基础知识的实践,我们今天的板块是学习网络重要之一,学习完这个板块对虚幻的网络就不再迷茫!!!

二、主体
学习【网络】数据链路层协议——以太网,ARP协议咱们按照下面的图解:

2.1 数据链路层解决的问题
解决步骤:
- IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP为其提供可靠性保证,比如数据丢包后TCP可以让IP重新发送数据,最终在TCP提供的可靠性机制下IP就能够保证将数据可靠的发送到对端主机。
- TCP除了对下层IP提供可靠性机制之外,TCP对上还提供进程到进程的服务,我们在进行socket编程时,本质就是在使用TCP或UDP为我们提供的进程到进程的服务。
- 但数据在网络传输时需要一跳一跳的从一台主机跳到另一台主机,最终才能将数据转发到目标主机,因此要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机,而两台主机直接相连也就意味着这两台主机属于同一网段,因此将数据转发到下一跳主机实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题。
- 也就是说,网络层IP提供的是跨网络发送数据的能力,传输层TCP是为数据发送提供可靠性保证的,而链路层解决的则是两台相连主机之间的通信问题。
2.2 MAC地址
2.2.1 什么是MAC地址
Mac地址(Media Access Control Address),局域网地址:
- Mac地址也称物理地址,硬件地址,由网络设备制造商生产时烧录在网卡上。
- Mac是制造商为网络硬件(如无线网卡或以太网卡)分配的唯一地址。
- Mac代表媒体访问控制,每个代码对应一个唯一的设备。
- Mac地址为六组两位字符组成,由冒号分隔,比如:00:1B:44:11:3A:B7
- Mac地址用于确认一个网络设备位置的位址。
- 在ISO模型中,第三层网络层负责IP地址,第二层链路层负责Mac位址。
- Mac地址用于在网络中标识一个唯一的网卡,一台设备如果由一个或者多个网卡,则每隔网卡都需要并会有一个唯一的MAC地址。
MAC地址就像是计算机网络中每台计算机的身份证号码,用于唯一标识网络设备。
2.2.2 Mac地址的作用
概念:
大多数接入internet的方式是把主机通过局域网连接在一起,然后再通过交换机或者路由器等设备和internet相连接,由于IP地址是基于逻辑上的标识,是任意人都可以修改的,所以可信度并不是很高,因此不能用来标识用户,但Mac地址对于一台设备来说是出厂设置好的,固定的,理论上来说,除非把硬件设施(网卡)盗过来,否则是无法冒名顶替Mac地址标识的设备。基于Mac地址是唯一的且不可修改的,因此局域网采用了Mac地址来标识具体用户的方法。
2.2.3 mac地址和ip地址区别
区别:
- IP地址是指Internet协议使用的地址,而MAC地址是Ethernet协议使用的地址。IP地址与MAC地址之间并没有什么必然的联系,MAC地址是Ethernet网卡上带的地址,长度为48位。
- 每个Ethernet网卡生产厂家必须向IEEE组织申请一组MAC地址,在生产网卡时在网卡的串行EEPROM中写入一个唯一的MAC地址。任何两个Ethernet网卡的MAC地址,不管是哪一个厂家生产的都不应相同。Ethernet芯片厂家不必负责MAC地址的申请,MAC地址存在于每一个Ethernet包中,是Ethernet包头的组成部分,Ethernet交换机根据Ethernet包头中的MAC源地址和MAC目的地址实现包的交换和传递。
- IP地址是Internet协议地址,每个Internet包必须带有IP地址,每个Internet服务提供商(ISP)必须向有关组织申请一组IP地址,然后一般是动态分配给其用户。IP地址现是32位长,正在扩充到128位。IP地址与MAC地址无关,因为Ethernet的用户,仍然可通过Modem连接Internet,取得一个动态的IP地址,这个地址每次可以不一致。IP地址通常工作于广域网,路由器处理的就是IP地址。 MAC地址工作于局域网,局域网之间的互连一般通过现有的公用网或专用线路,需要进行网间协议转换。可以在Ethernet上传送IP信息,此时IP地址只是Ethernet信息包数据域的一部分,Ethernet交换机或处理器看不见IP地址,只是将其作为普通数据处理。
2.3 以太网协议
不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:
- 以太网:以太网是一种计算机局域网技术,一种应用最普遍的局域网技术。
- 令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为“令牌”,在环路上持续地传输来确定一个节点何时可以发送包。
- 无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已经是计算机网络的一个重要组织部分。
网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越:
- 数据在发送之前会先进行数据封装,此时链路层会给数据封装上对应的局域网的报头。
- 如果数据要进行跨网络传输,那么就需要经过路由器转发。
- 当数据在路由器进行向上交付时,会将该数据对应的局域网报头去掉。
- 而当路由器该数据转发给下一跳之前,又会给该数据封装上下一跳网络所对应的局域网报头。
以太网通信原理:
概念:
- “以太网” 不是一种具体的网络,而是一种技术标准,他既包含了数据链路层的内容,也包含了一些物理层的内容。例如,以太网规定了网络拓扑结构,访问控制方式,传输效率等。
- 以太网中的网线必须使用双绞线,传输效率有10M,100M,1000M等。
以太网中所有主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据:
- 比如当局域网中的主机A想要发送数据给主机B时,其实局域网当中的每一台主机都能够收到主机A发出去的数据,只不过最终只有主机B会将主机A发来的数据向上进行交付。
- 局域网当中的其他主机虽然也收到了主机A发送的数据,但经过识别后发现这个数据不是发送给自己的,于是就会直接将该数据丢弃而不会向上进行交付。
扩展:
- 网络抓包不仅能够抓到发送给自己的报文数据,也能抓取到发给别人的报文数据,实际就是因为在进行网络抓包时,主机将从局域网中收到的所有报文数据都向上交付了而已。
- 网卡有一种模式叫做混杂模式,被设置为混杂模式的网卡能够接受所有经过它的数据流,而不论其目的地址是否是它。
2.3.1 以太网帧格式
以太网帧格式如下:
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
- 帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议。
- 帧末尾是CRC校验码。
MAC帧如果将报头与有效载荷进行分离:
以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。
MAC帧如何决定将有效载荷交付给上层的哪一个协议:
- 以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层哪一个协议。
- 在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。
举个例子:
假设局域网当中的主机A想要将IP数据报发送给同一局域网当中的主机B,那么主机A封装MAC帧当中的目的地址就是主机B的MAC地址,源地址就是主机A的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应就是CRC校验。
- 主机A收到该MAC帧后,可以对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞,此时主机A就会执行碰撞避免算法,后续进行MAC帧重发。
- 主机B收到该MAC帧后,提取出MAC帧当中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就会将有效载荷交付给上层IP层进行进一步处理。
- 局域网中的其他主机收到该MAC帧后,也会提取出MAC帧当中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃掉。
2.3.2 认识MAC地址
MAC地址:
用来标识数据链路层中相连的节点。长度为48位,即6个字节,一般用十六进制数字加上冒号的形式来表示,例如:08:00:27:03:fb:19。
在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)。
2.3.3 对比MAC地址和IP地址
实际在数据路由的过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址:
- IP地址描述的是路途总体的起点和终点。
- MAC地址描述的是路途上的每一个区间的起点和终点。
因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的,而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。
注意:
实际数据在路由过程中,源IP地址和目的IP地址也可能会发生变化。(NAT技术)
2.3.4 认识MTU
概念:
MTU(Maximum Transmission Unit,最大传输单元) 描述的是底层数据帧一次最多可以发送的数据量,这个限制是不同的数据链路层对应的物理层产生的。
- 以太网对应的MTU的值一般是1500字节,不同的网络类型有不同的MTU,如果一次要发送的数据超过了MTU,则需要在IP层对数据进行分片。
- 此外,以太网规定MAC帧中数据的最小长度为46字节,如果发送数据量小于46字节,则需要在数据后面补填充位,比如ARP数据包的长度就是不够46字节的。
2.3.5 MTU对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以如果IP层一次要发送的数据量超过了MTU,此时IP层就需要先对数据进行分片,然后才能将分片后的数据向下交付:
- IP层会将较大的数据进行分片,并给每个分片的数据包进行标记,具体就是通过设置IP报头当中的16位标识、3位标志和13位偏移来完成的。
- 由同一个数据分片得到的各个分片报文,所对应的IP报头当中的16位标识(id)都是相同的。
- 每一个分片报头的IP报头当中的3位标志字段中,第2位设置为0,表示允许分片,第3位用作结束标记(最后一个分片报文设置为0,其余分片报文设置为1)。
- 当对端IP层收到这些分片报文后,需要先将这些分片报文按照顺序进行组装,拼装到一起后再向上交付给传输层。
- 如果分片后的某个报文在网络传输过程中丢包了,那么对端在进行数据组装时就会失败,此时就需要上层传输层进行数据重传。
数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中路由器也可能会对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片。
2.3.6 MTU对UDP协议的影响
分析:
IP报头当中如果不携带选项字段,那么IP报头的长度就是20字节,而UDP一次携带的数据超过了 1500 - 20 - 8 = 1427字节,此时数据就需要在IP层进行分片。
- 分片后得到的多个IP数据报中有任意一个在传输过程中丢失,都会引起接收端IP层重组失败。
- 假设在网络传输时丢包的概率时万分之一,如果将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。
- 因为只要有一个分片报文丢包了也就等同于这个报文整体丢失了,因此分片会增加UDP报文丢包的概要。
2.3.7 MTU对TCP协议的影响
分析:
对于TCP来说,分片也会增加TCP报文丢包的概率,但与UDP不同的是TCP丢包后还需要进行重创,因此TCP应该尽量减少分片导致的数据重传。
- TCP发送的数据报不能无限大,还是应该受制于MTU,我们将TCP的单个数据报的最大报文长度,称为 MSS(Max Segment Size)。
- TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。
- MSS的值实际就是在TCP首部的40字节的选项字段当中的(kind=2)。
- 最理想的情况下,MSS的值正好就是在数据不会在IP层分片的最大长度。
MSS和MTU的关系如下:
2.3.8 数据跨网络传输的过程
以主机A将数据跨网络传输给主机D为例,数据路由的过程如下:
- 主机A要想将数据跨网络传输给主机B,需要先将数据交给同局域网当中的路由器A,因此主机A需要将封装好的MAC帧发送到当前局域网当中,此时MAC帧当中的源MAC地址和目的MAC地址,对应就是主机A的MAC地址和路由器A的MAC地址。
- 此时主机A所在的局域网当中所有主机都能够收到这个MAC帧,但最终只有路由器A发现该MAC帧当中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层。
- 路由器A的IP层拿到解包后的IP数据报后,会提取出IP报头当中的目的IP地址,然后通过查询路由表后确定需要将该数据转发给路由器B,于是路由器A再将数据向下进行交付,重新封装MAC帧的帧头和帧尾,但此时封装后的MAC帧当中的源MAC地址和目的MAC地址,就变成了路由器A的MAC地址和路由器B的MAC地址。
- 与路由器A直接相连的主机虽然也可能有很多,但最终只有路由器B发现该MAC帧当中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层。
- 路由器B的IP层拿到解包后的IP数据报后,同样会提取出IP报头当中的目的IP地址,并通过查询路由表后确定需要将该数据转发给路由器C,于是路由器B再将数据向下进行交付,重新封装MAC帧和帧头和帧尾,但此时封装后的MAC帧当中的源MAC地址和目的MAC地址又变成了路由器B的MAC地址和路由器C的MAC地址。
- …
- 不断的重复上述过程,直到最终数据转发至主机B。
因此数据在进行跨网络传输时,其对应的源IP地址和目的IP地址一般是不会变化的,而该数据的源MAC地址和目的MAC地址却是一直在变化的,根本原因就是一因为该数据对应的上一跳主机和下一跳主机在不断变化。
IP网络:数据跨网络传输的过程就像现实生活中运输包裹的过程一样
- 数据每到一个新的局域网就需要封装上对应局域网标准的报头,就像包裹在运输的不同阶段可能会使用不同的交通工具,比如:火车、汽车、自行车。
- 但站在IP层看到的数据内容始终是一样的,就像我们最终看到的始终是同一个包裹一样。
- 包裹运输时使用的不同的交通工具,对应就是数据经过不同局域网时所添加的MAC帧报头,而包裹对应就是MAC帧的有效载荷,即IP数据报。
也就是说,数据在跨网络传输过程中,其对应的MAC帧的报头是不断变化的,而MAC帧当中的IP数据报当中的内容是不变的,所以站在IP层看到的数据内容是一样的,这就是为什么现在主流的网络叫做"IP网络"的原因。
2.4 局域网的数据碰撞
2.4.1 局域网内通信过程
数据帧发送到网络中,所有该局域网的主机都会收到该数据帧,但其数据链路层解包发现目的地址不是自己的时候,会直接在数据链路层丢弃该报文。如此就只有主机D会解包,提取有效载荷,向上交付ip数据包。
2.4.2 数据碰撞问题
什么是数据碰撞:
局域网中,一定是多台主机同时在发送数据的,而只要所有主机都在发送着数据,就会形成数据之间的干扰,在计算里面我们称为数据碰撞。
如何判断主机发送的数据发生了碰撞:
m1发送的数据,m1自己也会收到,如果m1接收到的数据和自己发送的数据不一致的话,则接收的数据帧在进行CRC校验时,一定会出错,此时就说明m1发送的数据帧发生了碰撞。所以局域网还有另一种称呼,叫做碰撞域。
解决这个数据碰撞问题:使用交换机
交换机从其某个端口收到一个数据包时,先读取包头中的源MAC地址(即发送该数据包的设备网卡的MAC地址),将该MAC地址和端口对应起来添加到交换机内存里的地址表中;然后再读取包头中的目的MAC地址,对照内存里的地址表看该MAC地址与哪个端口对应,如果地址表中有该MAC地址的对应端口,则将该数据包直接复制到对应的端口上,如果没有找到,则将该数据帧作为一个广播帧发送到所有的端口,对应的MAC地址设备会自动接受该帧数据,同时,交换机将接受该帧数据的端口与这个目的MAC地址对应起来放入内存中的地址表中。
2.4.3 令牌环网和以太网解决数据碰撞的策略
令牌环网:
令牌环网采取的方式是向局域网中流放一份令牌环数据,只有持有该令牌环数据的主机才能发送消息,发完消息之后,再将令牌环数据丢到局域网中,这样就可以保证任意时刻,都只会有一个主机在发数据,不会产生多个主机同时发数据而造成碰撞的问题。
以太网:
当数据发生碰撞后,以太网执行的策略,我们称之为碰撞检测和碰撞避免算法,其实这个策略很简单,说白了就是等一等再发,但你不要高估了局域网中各个主机发送数据的量,也不要低估了光电信号(二进制数据)在局域网中传播的速度,局域网并没有那么的大,容纳的主机数并不是非常多,所以对于飞快的光电信号来讲,发生碰撞的概率本身就低,所以等一等再发这样听起来很不靠谱的策略,在实际中却是很有效的。
2.4.4 如何看待局域网
们上面说,任何时刻在局域网中只能有一个主机在向局域网中发送数据,那我们不就可以把局域网看作临界资源吗?而像碰撞检测和避免算法能够保护临界资源,保证只能有一个主机在访问临界资源,那这不就相当于互斥锁或条件变量吗?而所谓的令牌环数据,不也就相当于互斥锁吗?谁拿着锁谁才能访问临界资源!
所以系统和网络是不分家的,可能在代码层面上两者是划分开的,但在设计理念,和某些策略的设计思想上,两者一定是有重叠的!
2.5 ARP协议
概念:
ARP协议:也叫做地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。
2.5.1 ARP协议的作用
为什么回纯在ARP这样的协议:
以刚才的例子为例,当数据从主机A经过各种路由器转发到路由器J,此时路由器J就需要将数据转发给主机D完成数据的路由。
- 由于路由器J和主机D是属于同一个局域网的,因此路由器J能够直接将数据交给主机D,但要给同局域网中的一台主机发送数据,前提是得先知道对方的MAC地址。
- 但路由器J此时只知道主机D的IP地址,因此路由器J必须通过某种方式得到主机D的MAC地址。
也就是说,在同一个局域网中要给对方发消息,就必须得知道对方的MAC地址,而实际大部分情况下我们只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址。
ARP协议的定位:
- 在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层。
- 其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP、网络层最典型的协议就是IP、数据链路层最典型的协议就是MAC帧协议,但实际数据链路层还有两种协议叫做ARP和RARP。
ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议:
- 也就是说,MAC帧的上层协议不一定就直接是网络层协议,MAC帧的上层协议有可能也属于数据链路层的协议,但就是位于MAC帧的上层。
- 与之类似的,网络层当中的ICMP协议和IGMP协议,这两个协议虽然与IP协议都属于网络层,但这两个协议属于IP层的上层协议。
2.5.2 ARP数据的格式
ARP数据的格式如下:
- 硬件类型指链路层的网络类型,1为以太网。
- 协议类型指要转换的地址类型,0x0800为IP地址。
- 硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
- 协议地址长度对于IP地址为4字节,因为IP地址是32位的。
- op字段为1表示ARP请求,op字段为2表示ARP应答。
从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。
2.5.3 ARP协议的工作流程
ARP请求的过程:
- 首先,因为路由器J构建的是ARP请求,因此ARP请求当中的op字段设置为1。
- ARP请求当中的硬件类型字段设置为1,因为当前使用的是以太网通信。
- ARP请求当中的协议类型设置为0800,因为路由器是要根据主机D的IP地址来获取主机D的MAC地址。
- ARP请求当中的硬件地址长度和协议地址长度分别设置为6和4,因为MAC地址的长度是48位,IP地址的长度是32位。
- ARP请求当中的发送端以太网地址和发送端IP地址,对应的就是路由器J的MAC地址和IP地址。
- ARP请求当中的目的以太网地址和目的IP地址,对应就是主机D的MAC地址和IP地址,但由于路由器J不知道主机D的MAC地址,因此将目的以太网地址的二进制序列设置为全1,表示在局域网中进行广播。
此时ARP请求构建完成,如下:
ARP请求构建完成后,为了能够将ARP请求发送到以太网当中,还需要将ARP数据包向下交付给MAC帧协议,封装成MAC帧:
- 封装MAC帧报头时,以太网目的地址和以太网源地址,分别对应的是主机D和路由器J的MAC地址,但由于路由器J不知道主机D的MAC地址,因此MAC帧报头当中的以太网目的地址的二进制序列也只能设置为全1,表示在局域网中进行广播。
- 因为这里封装的是一个ARP请求数据包,因此MAC帧当中的帧类型字段设置为0806。
- 由于ARP请求数据包的长度只有28字节,不足46字节,因此还需要再MAC帧的有效载荷当中补上18字节的填充字段,最后再对MAC帧进行CRC校验即可。
此时ARP请求就被封装成MAC帧了,如下:
MAC帧封装完毕后,路由器J就可以将封装好的MAC帧以广播的方式发送到局域网当中了:
- 因为这个MAC帧是以广播的方式发出来的,因此局域网当中的每台主机收到这个MAC帧后,都会对该MAC帧进行解包。当这些主机识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP层。
- 当ARP层收到这个数据包后,发现ARP数据包当中的op字段为1,于是判定这是一个ARP请求,然后再提取出ARP数据包当中的目的IP地址字段,虽然局域网当中的所有主机都会将该数据包交给自己的ARP层,但最终只有主机D发现ARP数据包当中的目的IP地址与自己相同,因此只有主机D会对该ARP请求进行应答,而局域网当中的其他主机在识别到ARP数据包当中的目的IP地址与自己不匹配后,就会直接将这个ARP请求报文丢弃。
总结:
- 发起方构建ARP请求,以广播的方式发送给每一个主机。
- 每台主机都能识别接收,然后根据MAC帧的帧类型字段将有效载荷交付给每个主机的ARP层。
- 其他不相关主机立马根据目的IP,在自己的ARP协议内部丢弃ARP请求,只有目标主机会处理请求。
ARP应答的过程:
- 首先,因为主机D构建的是ARP应答,因此ARP应答当中的op字段设置为2。
- ARP应答当中的硬件类型、协议类型、硬件地址长度、协议地址长度的值与ARP请求当中设置的值相同。
- ARP应答当中的发送端以太网地址和发送端IP地址,对应的就是主机D的MAC地址和IP地址。
- ARP应答当中的目的以太网地址和目的IP地址,对应就是路由器J的MAC地址和IP地址,因为路由器J发来的ARP请求当中告知了主机D它的MAC地址和IP地址,因此主机D是知道的。

ARP应答构建完成后,为了能将ARP应答发送到以太网当中,也需要将ARP数据包向下交付给MAC帧,封装成MAC帧:
- 封装MAC帧报头时,以太网目的地址和以太网源地址,对应分别是路由器J和主机D的MAC地址。
- 因为这里封装的是一个ARP应答数据包,因此MAC帧当中的帧类型字段设置为0806.
- 由于ARP应答数据包的长度也只有28字节,不足46字节,因此也需要在MAC帧的有效载当中补上18字节的填充字段,最后再对MAC帧进行CRC校验。

MAC帧封装完毕后,主机D就可以将封装好的MAC帧发送到局域网当中了:
- 此时局域网当中的每台主机在底层都能够接收到这个MAC帧,但局域网当中的不相干的主机,在发现该MAC帧对应的以太网目的地址与自己不同后,就会将该MAC帧丢弃,而不会交付给上层ARP层,最终只有路由器J会将解包后MAC帧的有效载荷向上交付给自己的ARP层。
- 当路由器J的ARP层收到这个数据包后,发现ARP数据包当中的op字段为2,于是判定这是一个ARP应答,然后就会提取出ARP数据包当中的发送端以太网地址和发送端IP地址,此时路由器J就拿到了主机D的MAC地址。
MAC帧的报头当中已经涵盖了源和目的MAC地址,为什么ARP的报头当中还要有这两个字段:
- 需要注意的是,MAC帧和ARP虽然都在数据链路层,但毕竟是上下层关系,因此它们不会互相关心彼此报头当中的数据。
- 此外,如果底层网络采用的不是以太网,而是其他类型的网络,此时ARP层的MAC地址就是必要的了。
进行局域网通信时,为什么不直接以广播的方式发送数据:
在进行局域网通信时,就算只知道对方的IP地址,而不知道对方的MAC地址,也可以以广播的方式将数据发送到局域网当中,此时局域网当中的主机也能够在IP层比对目的IP地址与自己是否相符,来判断收到的这个数据是否是发送给自己的。
- 对于局域网当中的大多数主机来说,收到的这个报文其实早就应该被丢弃,而现在这个报文却交付到了IP层,我们都知道IP层是属于操作系统管控的,因此这对网络资源和系统资源来说都是一种浪费。
- 因此在底层MAC帧层就应该判定这个报文是不是发送给当前主机的,而不是当数据向上交付到了IP层再来判断。
什么时候要发起ARP请求:
我们刚才说的只是路由器J要将数据发送给主机D的时候,需要通过ARP获得主机D的MAC地址,但实际数据在路由的过程中的每一跳可能都要发起ARP请求,询问下一跳主机对应的MAC地址,因为在每一跳时我们一般都是只知道下一跳的IP地址,而并不知道其对应的MAC地址的。
注意: ARP属于局域网通信的协议标准,因此一台主机不能跨网络向另一台主机发起ARP请求。
RARP协议:
RARP(Reverse Address Resolution Protocol,反向地址转换协议):是根据MAC地址获取IP地址的一个TCP/IP协议。
三、结束语
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

相关文章:
【网络】数据链路层协议——以太网,ARP协议
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是以太网协议和ARP协议。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自…...
Linux分区、挂载、配额、逻辑卷、RAID、系统综合状态查看
分区与挂载 fdisk fdisk 命令是一个用于磁盘分区管理的命令行工具,可以用来创建、删除、调整分区等操作。常用的 fdisk 命令选项包括: fdisk -l:列出系统中的所有磁盘分区信息。 fdisk /dev/sdX:打开指定磁盘进行分区操作。 n&…...
3D Gaussian Splatting 代码层理解之Part1
2023 年初,来自蔚蓝海岸大学和 马克斯普朗克学会的作者发表了一篇题为“用于实时现场渲染的 3D 高斯泼溅”的论文。该论文提出了实时神经渲染的重大进步,超越了NeRF等以前方法的实用性。高斯泼溅不仅减少了延迟,而且达到或超过了 NeRF 的渲染质量,在神经渲染领域掀起了一场…...
Qt小知识-Q_GLOBAL_STATIC
你还在为创建全局静态对象烦恼嘛,它来了!它来了! qt5提供了两个宏定义Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS来实现。可以创建一个全局静态对象,对象在第一次使用时初始化自身,这意味着它不会增加应用程序或库的…...
【SpringBoot】使用过滤器进行XSS防御
在Spring Boot中,我们可以使用注解的方式来进行XSS防御。注解是一种轻量级的防御手段,它可以在方法或字段级别对输入进行校验,从而防止XSS攻击。 而想对全局的请求都进行XSS防御可以使用servlet中的过滤器或者spring mvc中的拦截器ÿ…...
创建vue插件,发布npm
开发步骤:1.创建一个vue项目,2.开发一个组件。 3.注册成插件。 4.vite和package.json配置。5.发布到npm 1.创建一个vue项目 npm create vuelatest 生成了vue项目之后,得到了以下结构。 在src下创建个plugins目录。用于存放开发的…...
【Android Compose原创组件】可拖动滚动条的完美实现
项目背景 我在使用安卓Compose开发自己的【JK管理器】的过程中,很多地方都需要使用滚动条,在Github上也有实现的比较好,但是大多都是基于View(我要的是Compose啊)。 在研究Android 官方示例项目 nowinandroid 中&…...
【模块一】kubernetes容器编排进阶实战之资源管理核心概念
kubernetes 资源管理核心概念 k8s的设计理念—分层架构 CRI-container runtime interface-容器运行接口 CNI-container network interface-容器网络接口 CSI-container storage interface-容器存储接口 k8s的设计理念—API设计原则 https://www.kubernetes.org.cn/kubernete…...
用Python设置PowerPoint幻灯片背景
使用Python自动化处理Office文档,如PowerPoint演示文稿,是提高效率和创造力的重要手段。设置PowerPoint幻灯片背景不仅能够增强演示文稿的视觉吸引力,还能帮助传达特定的情感或信息,使观众更加投入。通过编程方式批量修改幻灯片背…...
Restful API接⼝简介及为什么要进⾏接⼝压测
一、RESTful API简介 在现代Web开发中,RESTful API已经成为一种标准的设计模式,用于构建和交互网络应用程序。本文将详细介绍RESTful API的基本概念、特点以及如何使用它来设计高效的API接口。 1. 基于协议 HTTP 或 HTTPS RESTful API通常使用HTTP&am…...
[pyspark] pyspark中如何修改列名字
使用 .withColumnRenamed 来重命名,直接看demo: from pyspark.sql import SparkSessionspark SparkSession.builder.appName("example").getOrCreate()data [("Alice", 1, 200),("Bob", 2, 300),("Charlie",…...
掌握 Spring Boot 的最佳方法 – 学习路线图
在企业界,人们说“Java 永垂不朽!”。但为什么呢?Java 仍然是开发企业应用程序的主要平台之一。大型公司使用企业应用程序来赚钱。这些应用程序具有高可靠性要求和庞大的代码库。根据Java开发人员生产力报告,62% 的受访开发人员使…...
element-ui】使用el_upload上传文件无法动态修改action
问题:最近在使用el_upload上传文件时,发现无法动态修改action的值,进行提交时,caseId2还是默认值null 原因:el-upload的先执行上传,后执行action里的响应,也就是赋值等操作。 解决方法&#x…...
如何查看电脑支持的最大内存
如何查看电脑支持的最大内存 要查看电脑支持的最大内存容量,可以通过以下几种方法: 一、使用Windows命令查询 打开命令提示符:按下“WinR”键,打开运行窗口,输入“cmd”,然后点击确定。输入查询命令&…...
24 年第十届数维杯国际数模竞赛赛题浅析
本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉,无论是赛题难度还是认可度,该比赛都是数模届的独一档,含金量极高,可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易,为了帮助大家取得好成绩…...
Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新
基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了接口级的服务引入订阅的refreshInterfaceInvoker方法,当时还有最为关键的notify服务通知更新的部分源码没有学习,本次我们来学习notify通知本地服务更新的源码。 Dubb…...
排序算法 -计数排序
文章目录 1. 计数排序(Counting Sort)1.1 简介1.2 计数排序的步骤1.3 计数排序C语言实现注释说明: 1.4 时间复杂度1.5 空间复杂度 1. 计数排序(Counting Sort) 1.1 简介 计数排序(Counting Sortÿ…...
Java学习,基本数据类型
变量就是申请内存来存储值,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。Java 提供了八种基本数据类型,这些类型可以分为四大类:整数类型…...
单片机GPIO中断+定时器 软件串口通信
单片机GPIO中断定时器 软件串口通信 解决思路代码示例 解决思路 串口波特率9600bps,每个bit约为1000000us/9600104.16us; 定时器第一次定时时间设为52us即半个bit的时间,其目的是偏移半个bit时间,之后的每104us采样并读取1bit数据。使得采样…...
elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
前言 在使用el-table 表格中有些表格的表头需要加入一些提示,鼠标移入则出现提示,非常实用,我是通过el-table中的el-tooltip实现的,以下的效果预览 代码实现 <el-table ref"multipleTable" :data"data"…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...





