目录
[1. 数据链路层所要解决的问题](#1. 数据链路层所要解决的问题)
[2. 以太网](#2. 以太网)
[2.1. 认识以太网](#2.1. 认识以太网)
[2.2. 认识 MAC地址](#2.2. 认识 MAC地址)
[2.3. 以太网帧的格式](#2.3. 以太网帧的格式)
[2.4. 局域网的通信原理](#2.4. 局域网的通信原理)
[2.5. MTU 和 MSS](#2.5. MTU 和 MSS)
[2.6. 数据跨网络传输的过程](#2.6. 数据跨网络传输的过程)
[3. ARP 协议](#3. ARP 协议)
[3.1. 为什么要有ARP协议](#3.1. 为什么要有ARP协议)
[3.2. ARP 的大致过程](#3.2. ARP 的大致过程)
[3.3. ARP 帧的格式](#3.3. ARP 帧的格式)
[3.4. 模拟一次ARP过程](#3.4. 模拟一次ARP过程)
[3.5. ARP 的相关问题](#3.5. ARP 的相关问题)
1. 数据链路层所要解决的问题
IP协议所做的工作是什么呢?
IP协议提供一种能力,将数据跨网络从一个主机传输到另一个主机的能力。
而对于一件事情,可以分为做决策和执行两个步骤,而对于网络传输也可以分为这两个过程:
- 网络层做决策:在网络层的决策过程中,路由器或主机 (在网络层) 通过目的IP地址和路由表进行判定,决定将IP数据报转发给当前主机所在的网段的其他主机还是转发到下一跳路由器;
- 在网络层决策过程完成后,数据会向下交付给数据链路层进行执行;
- 数据链路层执行:数据链路层负责实际的数据传输操作,包括将IP数据报封装成MAC数据帧、通过物理链路传输数据、进行差错检测和重传等。数据链路层的执行确保数据在物理网络中得以传输,并最终到达正确的目的地。
可是,将数据从一台主机跨网络传输到另一台主机的前提是不是:需要先将数据传输到与当前主机相连的下一跳路由器或者主机呢?因为,只有解决了如何传输到相连的下一跳路由器和主机,才可能将数据从一台主机跨网络传输到另一台主机。
比如,如下图所示,数据要从主机A传输到主机B,是不是应该首先考虑的是,如何将数据从主机A传输到路由器A呢? 即如何将数据传输到与当前主机相连的下一跳路由器。
因此,数据链路层所要解决的问题就是:直接相连的节点 (主机和路由器) 之间,如何进行数据转发的问题。
2. 以太网
2.1. 认识以太网
以太网并不是指特定的网络,而是一种通用的局域网技术标准。它规定了数据链路层和部分物理层的内容,包括网络拓扑结构、访问控制方式、传输速率等。
在以太网中,使用双绞线的网线是标准要求,传输速率可以有不同的标准,如10M、100M、1000M等。
以太网是目前应用最广泛的局域网技术之一,其灵活性和性能使其成为各种规模和类型的网络中的首选方案。除了以太网外,还有其他局域网技术如令牌环网、无线LAN等,它们各有特点适用于不同的场景和需求。
2.2. 认识 MAC地址
- 每一台主机和路由器不仅有IP地址,还会有MAC地址,这里的MAC地址主要用来:在同一个局域网中,区分不同的节点 (主机和路由器);
- MAC地址的长度是48位,即6个字节,一般用16进制数字加上冒号的形式来表示,比如 (fe80::216:3eff:fe04:f028), 可以在云服务器通过 ifconfig 命令查看MAC地址;
- MAC地址是在网卡出厂时就确认了,不能修改,MAC地址通常是唯一的。
2.3. 以太网帧的格式
- 源MAC:源主机的MAC地址, 当前主机的MAC地址;
- 目的MAC地址: 目的主机的MAC地址,下一跳的MAC地址;
- MAC地址的长度是48位,其在网卡出厂时就固定了;
- MAC帧协议类型有三种,分别为IP,ARP,RARP;
- MAC帧末尾是CRC校验码;
- 上面的每个字段的单位都是字节。
如何将MAC帧的报头和有效载荷分离?MAC帧采用的是定长报头,当数据链路层收到一个MAC帧时,通过定长报头就可以将MAC帧的报头和有效载荷分离。
当可以将MAC帧的报头和有效载荷分离后,如何判定向上交给那一层协议呢?此时就需要根据报头中的类型,判定向上交付给哪一层协议。比如:
- 如果是0800,代表有效载荷是IP数据报,向上交付给IP协议;
- 如果是0806,代表有效载荷是 ARP报文,向上交付给 ARP 协议 (注意,ARP协议是数据链路层的)。
2.4. 局域网的通信原理
当一台主机向局域网发送数据时,在当前局域网中的所有主机都会收到这个数据,同时,所有主机会对数据进行解包,得到MAC帧的报头,并通过报头中的目的MAC地址和当前主机的MAC地址,进行对比,如果匹配成功,那么继续向上交付,如果匹配失败,直接将这个MAC帧丢弃。
举个例子:
假设主机A要向主机E发送数据, 数据会首先到局域网中,局域网中的所有主机都会得到这份数据,如图所示:
接下来,这些主机会对这份MAC帧数据进行解包,得到目的MAC地址,并和自己的MAC地址进行比对,此时,B、C、D 主机,发现这份数据的目的MAC地址不是自己,因此,将这个MAC帧数据丢弃,只有E主机才会将MAC帧数据解包后根据类型继续向上交付。
现在有一个隐藏问题,局域网通信时,可能不止一台主机发送信息,可能会有多台主机同时发送数据,此时数据帧就可能发生数据碰撞。
当发生数据碰撞后,发送数据的主机是能够检测到的,此时这些主机就要进行碰撞避免算法,即发送主机会等一等,随后进行数据重发,你没有看错,数据重发可不只有TCP具有,在数据链路层也会进行数据重发。
通过碰撞避免算法,尽量保证在同一局域网中的任意一个时刻只有一台主机向局域网发送数据,这只是预期,但在实际中,如果一个局域网的主机数非常多,那么也会存在一定的概率发生数据碰撞 ,即主机数越多,发生数据碰撞的概率也就越大;
总而言之,在一个局域网中,通过碰撞避免算法,尽量保证在任意一个时刻只有一台主机发送数据。
如何看待局域网?站在系统的角度,首先这个局域网是被所有主机共享的,任意时刻只允许一台主机向局域网发送数据 (碰撞避免算法),因此,局域网可以看成多台主机的临界资源;
局域网中,主机数越多,发生碰撞的概率越大,如何解决呢?数据链路层有一个设备叫交换机,交换机可以划分碰撞域,通过划分碰撞域减少数据碰撞。
- 划分碰撞域:是指在一个局域网络中,将网络设备分成若干个独立的区域,每个区域内的设备在发送数据时不会与其他区域内的设备发生碰撞;
- 具体来说,当一台主机发送数据帧时,交换机会根据数据帧中的目标MAC地址来决定将数据帧发送到哪一个主机。这样,相同局域网络内的主机之间的通信可以直接传输而无需广播给所有主机。这种端到端的通信方式有效地减少了网络拥塞和碰撞,提高了网络通信的效率和性能。
那么在局域网通信中,主机发送的数据帧是长一点好呢? 还是短一点比较好?先说结论,在局域网中,主机发送的数据帧是短一点比较好。
- 首先,如果主机在局域网通信中,发送的数据帧太长,那么就需要更长的传输时间,因此就会导致数据帧会在局域网中逗留更长的时间,进而增加了数据碰撞的可能性;
- 但如果主机发送的数据帧比较短,那么就可以更快地传输并释放带宽,减少数据帧在局域网中的逗留时间,从而降低了数据碰撞的概率。
因此,MAC帧的有效载荷是有上限的,这个上限我们称之为MTU (Maximum Transmission Unit),即最大传输单元,不同的网络设备和网络类型可能存在不同的MTU大小限制,常见的以太网MTU大小为1500字节。
2.5. MTU 和 MSS
记住,MTU 并不是MAC帧的大小,而是MAC帧的有效载荷的最大值。
正因为数据链路层有MTU的存在,且网络层无法决定传输层向下交付的数据的大小,因此,也就倒逼着网络层需要具有数据分片和组装的功能,可是我们说过,数据分片会增高丢包的可能性,因此,站在操作系统的视角,是不愿意进行分片的,因此,需要在协议栈层面进行减少分片,可是如何减少呢?首先,网络层收到的数据大小不是由网络层决定的,网络层收到的数据是由传输层向下交付的,如果数据大于了数据链路层的MTU,那么网络层就需要进行分片,可是,内核层面不想分片,想要减少分片,因此,矛头就指向了传输层 (TCP) ,即减少分片的根源在 TCP。
接下来我们就用例子用来理解TCP是如何减少分片的, 也就是需要引出MSS, 假设MTU就是1500 Byte,且TCP报头和 IP报头都是 20 Byte (不考虑任何特殊情况):数据链路层的MAC帧有MTU,而这个MTU是MAC帧有效载荷的最大长度,而MAC帧有效载荷不就是IP数据报 (一般情况下)吗?
即IP数据报的最大长度是MTU (不考虑分片),但是IP数据报分为两部分:IP报头和 IP有效载荷,IP数据报的有效载荷不就是TCP的数据段吗?
因此,TCP数据段的最大长度就是MTU - IP报头,可是TCP数据段也分为 TCP 报头和 TCP的有效载荷;
而我们知道,TCP 是有发送缓冲区的,因此,TCP在构建TCP数据段时,一次最多能从发送缓冲区发出的数据 = MTU - IP报头 - TCP 报头;
因为我们不考率任何特殊情况,因此此时TCP一次最多能从发送缓冲区发出的数据 = MTU - 20 - 20,即1460,而这个数据大小我们称之为 MSS (Maximum Segment Size),TCP数据段中的有效载荷的最大大小。
如下图所示:
现在,我们就能理解之前的一个疑惑了,假如接收端的接受能力是4096Byte,发送方的滑动窗口也是4096Byte,暂不考虑网络情况 (即拥塞窗口),为什么发送方不直接构建一个数据段,将这些数据一起发送给对端,因为我们知道,网络传输本质上就是一个IO过程,很明显,一次IO总比多次IO效率高啊,可是,事实上,滑动窗口依旧将数据分成多个数据段向下交付,为什么呢?
原因就在于MSS, 它约束了TCP,即每次构成TCP数据段的时候,这个TCP数据段的有效载荷不能超过MSS,其根本原因就是TCP为了适应底层数据链路层的MTU限制,避免网络层对数据进行分片 (因为内核不想分片),提高数据传输的效率和稳定性。
因此,在网络通信中,数据链路层有MTU,传输层 (TCP) 为了适应底层的限制 (减少分片) 有了MSS。事实上,还有一个细节,因为网络传输数据并不是单向的,而是双向的,因此对于通信双方主机而言,它们的TCP层都有MSS,那么你说了,MSS是TCP数据段中有效载荷的最大长度,那如果双方的MSS不一样呢?
首先,MSS最理想的状态应该是在网络层不会被分片处理的最大长度 (取决于MTU),因此,在实际传输过程中,通信双方的MSS也会进行协商处理,具体就是在双方在三次握手过程中,双方会交换各自支持的MSS值,然后选择双方中较小的MSS值作为最终的通信MSS;
通过MSS值的协商和确定,可以保证在双方通信时,发送方发送的TCP数据段的有效载荷大小不会超过接收方和发送方都能够接受的最大MSS值,从而减少分片、重传等问题,提高网络通信的效率和性能;
我们可以查看MSS的值,MSS的值在TCP报头中的选项中;
最后再补充一点,尽管TCP有MSS,通信时,双方主机也会协商MSS的值,但是,由于不同设备的MTU是不一样的,因此,数据在跨网络传输中,经过不同的设备 (MTU不一样),也会存在数据分片的情况,但是,MSS 能在很大程度上减少分片的可能,进而在一定程度上,提高了网络传输效率和稳定性。
MTU 对 UDP 的影响, 假设 MTU 是1500 Byte:如果UDP报文的有效载荷超过了 1472 (1500 - 20(IP报头) - 8 (UDP报头)),那么当数据向下交付给网络层时,网络层就会对数据进行分片;
当分片后,就会有若干个IP数据报,这若干个IP数据报只要有一个丢失,那么对端网络层收到后,对其进行组装就会失败,随后将这些数据全部丢弃,而由于 UDP 是没有重传策略的,这也就意味着,这些数据就真正的丢失了;
从上面也可以看出,如果采用UDP协议,并进行了分片,那么此时数据丢失的概率会大大增加。
在Linux下,可以通过 ifconfig 命令查看当前机器的MTU和MAC地址:
2.6. 数据跨网络传输的过程
假设主机A要将数据跨网络传输给主机B:
之前说过,主机A要将数据跨网络传输给主机B,首先需要将数据传输到与当前主机相连的下一跳路由器,在这里也就是路由器A,因此主机A要添加MAC帧的报头,主要是,目的MAC地址,就是路由器A的MAC地址,源MAC地址也就是主机A的MAC地址;
- 因为主机A和路由器A在同一局域网,因此,路由器A可以收到这个MAC帧数据,收到后,路由器A的数据链路层进行解包,得到目的MAC地址,并和自己的MAC地址进行比对,发现是匹配的,向上交付MAC帧的有效载荷 (IP数据报);
- 到达网络层后,会对IP数据报进行解包,得到IP报头,将IP中的源IP替换成当前路由器的WAN口IP,并通过IP报头中的目的IP和路由表确认下一跳,确认接下来将数据转发给路由器B,封装IP报头,向下交付给数据链路层;
- 数据链路层收到后,重新封装MAC帧的报头,但是此时的MAC帧的源MAC地址是路由器A的MAC地址,目的MAC地址是路由器B的MAC地址;
- 路由器A通过局域网将数据转发给路由器B,继续重复上述过程,最终,数据到达主机B。
总而言之,我们可以发现,数据在跨网络传输中,MAC帧数据是不断发生变化的。具体就是,当MAC帧数据在跨越不同的局域网时,其MAC帧中的目的MAC地址和源MAC地址会随之变化,换言之,MAC帧只在局域网内有效,当局域网发生变化,原MAC帧数据则无效了。
3. ARP 协议
3.1. 为什么要有ARP协议
我们发现,所谓的跨网络将数据从主机A传输到主机B,本质上是通过跨越不同的子网 (局域网) 来实现的, 比如,上面的主机A和路由器A是一个局域网、路由器A和路由器B是一个局域网等等。
当数据需要跨越子网时,网络设备 (路由器或者主机) 会根据目标主机的IP地址和路由表信息,确定数据的下一跳路由器,并指导数据包沿着正确的路径到达目标主机所在的子网。这样,数据就能够实现在不同局域网之间的传输。
上面这个图的过程,我们在 2.7 分析过,但是有一个问题,假设数据通过上面的方式路由到了路由器C。
- 路由器C在数据链路层对MAC帧数据解包,得到目的MAC地址,并和路由器自身的MAC地址对比,发现匹配,进而将MAC帧的有效载荷 (IP数据报) 向上交付给路由器C的网络层;
- 路由器C的网络层收到后,对IP数据报进行解包,得到IP报头,将IP中的源IP替换成路由器C的WAN口IP,并通过IP报头中的目的IP和路由表确认下一跳,确认接下来将数据转发给主机B,并封装IP报头,向下交付给数据链路层;
- 可是,到了数据链路层,问题就来了:
- 因为,此时要对IP数据报进行封装,即添加MAC帧报头,源MAC地址很好获得,就是路由器C的MAC地址, 可是目的MAC地址是主机B的MAC帧地址,但是,此时路由器C不知道,它只知道主机B的IP地址,不知道主机B的MAC地址。
因此,此时就无法对IP数据报进行封装,形成MAC数据帧,也就无法进行后续传输。
正因为有上面的问题,因此,在数据链路层中还有一层协议 (在MAC帧的上层),即ARP协议,ARP(Address Resolution Protocol)协议是一种局域网协议,它的核心目的:在特定的局域网中,通过目标主机的IP地址获取其对应的MAC地址。
具体到上面的问题:通过ARP协议,路由器C可以向局域网中的其他主机发送广播请求,询问目标主机B的MAC地址。一旦接收到主机B的响应,路由器C就能够获取目标主机B的MAC地址,然后顺利地封装IP数据报成为完整的MAC数据帧进行传输。
3.2. ARP 的大致过程
3.3. ARP 帧的格式
- 源MAC地址、目的MAC地址在以太网帧头和ARP请求/响应中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址,代表将IP地址转化为MAC地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于IP地址为4字节;
- 操作类型字段为1,表示ARP请求;
- 操作类型字段为2,表示ARP应答。
3.4. 模拟一次ARP过程
接下来,我们就来模拟一次ARP过程,即通过ARP和目的主机的IP地址获得目标主机的MAC地址。
场景如下, 主机A要向主机E传输数据,但是由于主机A的没有主机E的MAC地址,因此,主机A在数据链路层无法添加MAC帧报头,即无法形成MAC数据帧,因此,需要通过ARP和目的主机的IP获得目的主机的MAC地址。
首先,ARP协议和MAC帧的关系如下:
当主机A的网络层做决策后,发现没有目标主机的MAC地址,因此,主机A首先会进入ARP软件层,构建ARP请求。
首先,ARP报文格式如下:
- 硬件类型为1,表示以太网;
- 上层协议类型为0800,表示要将IP地址转化为MAC地址;
- MAC地址长度为6;
- IP地址长度为4;
- 操作类型为1,表示这个ARP报文是ARP请求;
- 源MAC地址:MACA;
- 源IP地址:IPA;
- 目的MAC地址:FFFFFFFFFFFF;
- 目的IP地址:IPE。
主机A在ARP软件层构建的ARP请求如下所示:
构建好ARP请求后,并不是直接发送到局域网中,而是要向下进入MAC帧层,封装MAC帧报头,形成MAC帧;
- 添加目的MAC地址,FFFFFFFFFFFF,全F的目的MAC地址,代表广播MAC帧;
- 添加源MAC地址,MACA;
- 添加帧类型,0806,表征MAC帧的有效载荷是ARP报文;
- 添加PAD,因为MAC帧的最小长度是46字节,当要传输的数据长度不足时,需要填充一些东西使得整个MAC帧满足最小长度要求;
- 添加CRC校验码。
主机A在MAC帧层构建的MAC帧如下所示:
当主机A在数据链路层构建好MAC帧后,会向局域网发送这个MAC帧数据,这个局域网中的所有主机都会收到这个MAC帧数据,如图所示:
- 当这些主机收到这份MAC帧数据后,这些主机首先会将MAC帧的报头和有效载荷分离,分离后,得到MAC帧的报头和有效载荷。
- 通过MAC帧的报头得到目的MAC地址,发现其全是FFFF...,代表这是一个广播MAC数据帧,因此,所有的主机都会处理这个MAC帧,然后根据MAC帧报头中的帧类型,发现是0806,因此,这些主机就会将这个MAC帧的有效载荷向上交付给ARP软件层 (注意,这里不是网络层);
- 当MAC帧的有效载荷到达ARP软件层后,首先做的是将ARP报文的报头和有效载荷分离,并根据ARP报头的操作类型来判断这是一个ARP请求,还是ARP响应, 注意,这里不能先看目的IP地址。
插曲:为什么要先查看ARP报头中的操作类型,而不是先查看ARP报文的有效载荷中的目的IP呢?
首先,任何一台主机在未来都可能会收到ARP请求和ARP响应。
如果是ARP请求,直接看目的IP地址,可以直接判断这个ARP请求是想得到我的MAC地址,而是其它主机的MAC地址。
但如果是ARP响应呢? 如果此时直接看目的IP地址,是不好的,因为对于ARP响应来说,我这台主机更想关心的是源MAC地址,因为此时的这个源MAC地址才是我这台主机想要获得的MAC地址。
因此,我们发现,对于ARP请求和响应来讲,它们所关心的ARP报文中的有效载荷的字段是不一样的,因此我们需要根据ARP报文中报头的操作类型来判断这是一个ARP请求还是一个ARP响应,进而确定要访问ARP报文中有效载荷的什么字段。
因此收到一个ARP报文,首先需要将ARP报文的报头和有效载荷分离,通过报头中的操作类型判断这是一个ARP请求还是ARP响应,在进行后续处理。
继续上面的过程:这些主机将ARP报文的报头和有效载荷分离后,通过ARP报头得到操作类型,发现这是一个ARP请求,随后再根据ARP报文中有效载荷中的目的IP地址和当前主机的IP地址进行比对:
- 如果不匹配,当前主机直接将这个ARP报文丢弃即可;
- 如果匹配,那么说明这个ARP请求就是给我这台主机的,因此,这台主机会在特定时机构建ARP响应。
如图所示:
主机E在ARP软件层构建ARP响应:
- 硬件类型为1,表示以太网;
- 上层协议类型为0800,表示要将IP地址转化为MAC地址;
- MAC地址长度为6;
- IP地址长度为4;
- 操作类型为2,表示这个ARP报文是ARP响应;
- 源MAC地址:MACE;
- 源IP地址:IPE;
- 目的MAC地址:MACA;
- 目的IP地址:IPA。
主机E在ARP软件层构建的ARP响应如下所示:
主机A在ARP软件层构建ARP响应完成后,向下交付给MAC帧协议,添加MAC帧报头,形成MAC帧:
- 添加目的MAC地址,MACA;
- 添加源MAC地址,MACE;
- 添加帧类型,0806,表征MAC帧的有效载荷是ARP报文;
- 添加PAD,因为MAC帧的最小长度是46字节,当要传输的数据长度不足时,需要填充一些东西使得整个MAC帧满足最小长度要求;
- 添加CRC校验码。
当主机E在数据链路层构建了MAC数据帧之后,将MAC帧数据发送到局域网中,这个局域网中的所有主机都会收到这个MAC帧数据,如图所示:
当所有主机收到这个MAC帧数据后,首先会将MAC帧的报头和有效载荷分离, 注意,此时和ARP请求就有差异了,当MAC帧的报头和有效载荷分离后,这些主机就可以通过MAC帧报头中的目的MAC地址和当前主机的MAC地址对比:
- 如果不匹配,则说明这个数据帧不是给当前主机的,故当前主机直接将这个MAC帧数据丢弃;
- 如果匹配,当前主机在根据MAC报头中的帧类型判断,这是一个ARP报文,因此,将MAC帧的有效载荷向上交付给ARP软件层。
可以发现,如果是ARP请求,如果不匹配,则是在ARP软件层丢弃的ARP报文 (相当于MAC帧数据被丢弃了);而如果是ARP响应,如果不匹配,则是在MAC帧层丢弃的MAC帧数据。
因此,最终只有A主机会将MAC帧的有效载荷向上交付给ARP软件层,如图所示:
当主机A将MAC帧数据的有效载荷向上交付给ARP软件层后,主机A会将ARP报文的报头和有效载荷分离,前面说了,必须先获取ARP报文中报头的操作类型,以判断这是一个ARP请求还是一个ARP响应。
获取ARP报头中的操作类型,发现是2,得知这是一个ARP响应;
接下来,主机A就可以通过ARP响应报文中有效载荷得到主机E的MAC地址,至此,整个ARP过程就完成了。
当主机A有了主机E的MAC地址后,就可以在数据链路层成功封装MAC帧了,进而将数据通过局域网传输给主机E。
上述过程总结:我们发现,对于一个ARP报文而言,首先需要将报文中报头和有效载荷分离,通过ARP报头中的操作类型判断这是一个ARP请求还是一个ARP响应;
对于ARP请求而言,如果不匹配 (接收到的ARP请求中的目的IP地址与当前主机IP地址不匹配),那么这个MAC帧数据会在ARP软件层丢弃;
对于ARP响应而言,如果不匹配 (接收到的MAC帧中报头的目的MAC地址与当前主机的MAC地址不匹配),那么这个MAC帧数据会在MAC帧层就丢弃;
如果是ARP请求,那么匹配的主机只关注ARP报文中有效载荷中的目的MAC地址和目的IP地址;
如果是ARP响应,那么匹配的主机只关注ARP报文中有效载荷中的源MAC地址和源IP地址。
如图所示:
每台主机都会维护一个ARP缓存表,用来存储IP地址和MAC地址之间的映射关系,可以用 arp -a 命令查看。通过ARP缓存表,主机可以在一定时间内直接获取目标主机的MAC地址,而不需要每次通信都发送ARP请求。
通常,ARP缓存表中的表项会包含IP地址、MAC地址和过期时间。过期时间一般设置为20分钟,如果在过期时间内没有再次使用某个表项,那么该表项会失效,即被清除。下次需要与该目标主机通信时,主机会再次发送ARP请求来获取目标主机的新的MAC地址。
云服务器下:
Windows环境下:
3.5. ARP 的相关问题
- **并不是每次通信都会触发ARP动作,只有在需要时才会进行ARP查询和更新。**ARP缓存表中保存了IP地址和对应的MAC地址的映射关系,当主机需要和目标主机通信时,首先会在ARP缓存表中查找对应的MAC地址,因此只有当ARP缓存表中不存在目标主机的MAC地址,或者对应的条目已经过期失效时,主机才会发送ARP请求重新获取目标主机的MAC地址。
- 在跨网络传输过程中,任意相连的两个节点之间通信时,都有可能触发ARP动作。因为每个子网都有自己的ARP缓存表,当跨越不同子网时,需要通过路由器进行转发,此时可能会出现需要重新获取目标主机的MAC地址的情况;
- 通过当前主机的IP地址和子网掩码,可以得到当前网段的网络号。在局域网中,可以通过ping命令扫描当前网段中的所有主机,获取它们的IP地址和MAC地址;
- 当某个节点收到多次同样的ARP应答时,ARP缓存表会以最新MAC地址和IP地址的为准。这是因为ARP缓存表中存储的是最新获取到的IP地址和MAC地址的映射关系,如果收到多个不同的ARP应答,节点会更新ARP缓存表以保持最新的地址映射关系。
我们可以通过一些工具想特定主机发送大量的ARP应答,告诉这台主机,当前主机的MAC地址是它对应的网关的MAC地址,这样,这台主机转发数据帧时,就会转到我这台主机,此时我这台主机将数据直接丢弃,就实现了让某台主机断网的操作,这种操作,我们称之为ARP欺骗。同时,既然可以欺骗特定主机,我也可以欺骗路由器,让路由器以为我的MAC地址是特定主机的MAC地址,因此,当特定主机和路由器在进行数据转发时,都会先通过我这台主机,因此,这种方式,我们称之为基于ARP欺骗成为中间人。
RARP全称为 Reverse Address Resolution Protocol,即逆地址解析协议。它也是在数据链路层,在MAC帧的上层,用于将MAC地址解析为IP地址的过程。