【Linux网络】数据链路层协议:以太网和 ARP

        本篇博客整理了 TCP/IP 分层模型中数据链路层的 MAC 帧协议和 ARP 协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。

目录

一、数据链路层

二、以太网协议

1)广域网通信  

2)以太网通信原理

3)MAC 帧报头

.1- 帧头、帧尾与有效载荷的分离

.2- 有效载荷的上交

4)MAC 地址

5)MTU

.1- 对 IP 协议的影响

.2- 对 UDP 协议的影响

.3- 对 TCP 协议的影响

6)数据跨网络传输的具体过程

三、ARP 协议

1)ARP 的作用

2)ARP 报头

3)ARP 的工作流程

.1- 请求

.2- 应答

4)ARP 缓存表

补)RARP 协议


一、数据链路层

        数据的传输离不开网络协议栈,而网络协议栈是分层的。

        在 TCP/IP 分层模型中主要包含了应用层、传输层、网络层、数据链路层。

        进行网络通信时,通信双方发送的数据并不是直接从一方的应用层,直接发送到了另一方的应用层,而是需要应用层将数据继续向下交付。

        待发送的通信数据,会先从主机的应用层拷贝至传输层,再继续向下贯穿,在网络层和链路层经过数据封装后,通过网络发送到对方主机;而对端主机在收到数据后,也同样需要在链路层和网络层进行数据解包,并上交给传输层,再继续上交至对端的应用层。

        分层模型中的每一层都拥有自己的协议。其中,网络层的协议主要有 IP,负责将数据从一台主机送到另一台主机,即数据的路由;传输层的 TCP 协议既可以为 IP 提供可靠性的保障,保证 IP 每次都能将数据可靠送达,又可以为上层的应用层提供进程与进程之间的服务,支持网络套接字编程。

        数据在网络传输时,需要“一跳”、“一跳”地从一台主机到达另一台主机。其前提是,要先将数据转发给,与当前主机直接相连的、属于同一网段的下“一跳”主机。。而所谓“一跳”,是数据链路层中的一个区间,具体在以太网中指,从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

        总得来说,网络层为主机提供了跨网络发送数据的能力,传输层是为数据发送提供了可靠性保障,而本篇的主角——数据链路层,主要负责的是两台相连主机之间的通信问题,其中涉及的协议主要有以太网 MAC 帧、ARP、RARP。

二、以太网协议

1)广域网通信  

        在广域网通信中,也就是在跨局域网的通信中,不同的局域网所采用的通信技术可能不同,常见的局域网技术主要有以太网、令牌环网、无线 LAN/WAN,应用在数据链路层中。

  • 以太网:是一种应用最普遍的计算机局域网技术。
  • 令牌环网:常用于 IBM 系统中,在这种网络中有一种专门的帧被称为“令牌”,通过在环路上的持续传输来确定一个节点何时可以发送数据包。
  • 无线 LAN/WAN:是有线网络的补充和扩展,如今已是计算机网络的一个重要组成部分。

        虽然各个局域网的通信技术可能不同,但实际在数据链路层从网络中获取了数据,并贯穿协议栈进行向上交付时,IP 协议能够屏蔽底层网络的差异性,使通信双方无须关心底层的局域网技术。
        数据在发送之前,会贯穿协议栈而经历封装,在链路层,数据会被封装上对应的局域网报头,然后在进行跨网络传输时,从发送端到达路由器,经历路由转发。路由器也拥有协议栈,也会将数据进行向上交付,在途中会去掉数据的局域网报头,而在被转发给下一“跳”之前,又会将数据进行向下交付,给数据封装与下一“跳”网络相关的局域网报头。

        通过不断去掉旧的局域网报头,再添加上新的局域网报头,路由器就能够将数据,跨网络地送达目标网络中的目标主机。如此一来,就算跨越的网络之间采用了不同的局域网技术,也能够正确实现跨越。

【补】“底层屏蔽”技术

        “底层屏蔽”技术的实现与 IP 地址有关。

         IP 地址既可以帮助数据“路由”以外,又可以屏蔽底层网络的差异。

        对于通信主机双方的 IP 层及其上层的协议而言,它们并不需要关心底层是以太网还是令牌环网,只需关心数据的源 IP 地址和目的 IP 地址,即可将数据发送出去,因此现在主流的网络也叫“IP 网络”。

        而这种类似的底层屏蔽技术又例如:

  • 进程地址空间: 屏蔽了内存之间的差别,让所有的进程看到的都是同一块内存,且这块内存的布局都相同,能够支持统一的管理操作。
  • “Linux下一切皆文件”: 通过文件结构体和函数指针的方案,让用户能够统一地对待文件和某些资源。

2)以太网通信原理

        以太网,或称 MAC 帧,其实是一种技术标准,而并不是一种物如其名的具体网络,它既包含了数据链路层的内容,也包含了一些物理层的内容,例如其中规定了网络拓扑结构、访问控制方式、传输速率等。且以太网中的网线也比较特殊,必须使用双绞线,其传输速率可以分为10M、100M、1000M 等。

        在以太网中,所有的主机共享了同一个通信信道,当一台主机发出数据后,该网中的所有主机都能够收到数据。

        例如下图中,处于同一个局域网的主机 A 和主机 B 要进行通信。主机 A 想要发数据给主机 B的时候,其实局域网内的其他主机也都收到了 A 发的数据,只不过其他主机都能够识别数据的接收者是谁,从而筛选需要自己处理的数据,由此,除了主机 B 外,其他主机都会将 A 发的数据丢弃。

        然而同一个局域网内,可能存在不止两台主机要进行通信,甚至可能存在一台主机对多台主机要进行通信。所有主机在通信时,使用的都是同一个通信信道,那么多台主机同时进行通信,就会使通信的数据之间互相产生干扰,引发碰撞。

【Tips】网络通信中的碰撞

        其实每一个局域网都可以看作是一个碰撞域,对于同一个碰撞域中的主机,如果有一台主机发送的数据与其他主机发送的数据之间产生了干扰,就称这两台主机在该碰撞域中发生了碰撞。

        但由于计算机的处理速度和网线传播数据的速度都很快,因此在网络通信压力不大的时候,碰撞发生的概率其实也是不大的。

        每个主机是能够通过某种方式,得知自己发送的数据是否发生了碰撞。这是因为,当一台主机将数据发送出去后,该主机本身也是能够收到这个数据的,此时只需将收到的数据与之前发送的数据进行对比,若不相同则说明在发送过程中数据发生了碰撞。

        而发生碰撞后,主机会执行“碰撞避免”算法。所谓“碰撞避免”算法是指,如果一台主机发送的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据,这就好比两个人在对话时,突然同时说话从而影响了对话的质量,然后其中一人说“你先说吧”。

【Tips】以太网通信原理

        以太网是一种基于碰撞域、碰撞检测的局域网通信标准,其底层也有重传机制,即碰撞避免算法,以保证局域网中的数据能够从一台主机送达另一台主机。

 【补】令牌环网

        令牌环网(Token-ring network)的传输方法,在物理上采用了星形拓扑结构,但在逻辑上却是环形拓扑结构。它的通信传输介质可以是无屏蔽双绞线,也可以是屏蔽双绞线、光纤等。其中各节点之间采用 MAU(Multistation Access Unit,多站访问部件,是一种专业化集线器,用来围绕工作站计算机的环路进行传输)来连接在一起。另外,其中还有一种专门的帧称为“令牌”,会在环路上持续地传输,使拿到“令牌”的主机才能发送数据,保证数据不会发生碰撞。

        “令牌”是令牌环网的特色。就像操作系统中保护临界资源的互斥锁一样,“令牌”也有“忙”和“闲”两种状态,“忙”表示令牌已经被占用,而“闲”则表示令牌尚未被占用。想要发送数据的主机,必须首先检测到“闲”令牌,并将其置为“忙”状态,然后才可以发送数据。由于“令牌”在网环上是按顺序依次传递的,因此对于所有入网的计算机而言,它们获取令牌的机会都是相等的,因此不会在某台主机发送数据时造成“令牌”的饥饿问题。

3)MAC 帧报头

【Tips】MAC 帧的数据报格式

  • 目的地址、源地址: 48 位的网卡硬件地址,或称 MAC 地址,是在网卡出厂时固化的。
  • 帧协议类型:该字段有三种值,分别对应 IP 协议、ARP 协议和 RARP 协议。
  • CRC:是一种位于帧末尾的校验码,主要用于判断是否要执行碰撞执行算法。

.1- 帧头、帧尾与有效载荷的分离

       MAC 帧的报头较为特殊,分为帧头、帧尾,将有效载荷首尾包裹起来。

        MAC 帧的帧头和帧尾,都是定长的,因此从底层收到报文中,直接提取出 MAC 帧中定长的帧头和帧尾,即可分离报头与有效载荷。

.2- 有效载荷的上交

        MAC 帧对应的上层网络层协议不止一种,因此在分离报头和有效载荷之后,MAC 帧需要确定有效载荷上交给的哪一个协议,而这个过程与帧头中的类型字段有关。

        帧头中 2 字节的类型字段有三种值,分别对应 IP 协议、ARP 协议和 RARP 协议。

        假设某局域网中,主机 A 要将 IP 数据报发送给同一局域网中的主机 B,那么在主机 A 封装MAC帧中,目的地址就是主机B的 MAC 地址,源地址就是主机 A 的MAC地址,而帧协议类型对应为 0800,即要上交给 IP 协议,后面还紧跟着的是,要发送的 IP 数据报、位于帧尾的 CRC 校验。

        该 MAC 帧被主机 A 发送到局域网中后,局域网中的所有主机都可以收到,包括主机 A 自己。 

        主机 A 收到该 MAC 帧后,会在链路层对其进行 CRC 校验,如果校验失败,则说明发生了碰撞,主机 A 就会执行碰撞避免算法,然后重发 MAC 帧。
        主机 B 收到该 MAC 帧后,会在链路层从中提取出目的地址,核对其与自己的 MAC 地址是否相同,如果相同,且 CRC 校验成功,就会根据帧协议类型,将有效载荷向上交给主机 B 的 IP 层。
        局域网中的其他主机收到该 MAC 帧后,同样也会提取出目的地址,但会发现其与自己的 MAC 地址不匹配,然后直接将该 MAC 帧丢弃。

【Tips】局域网中的主机在收到一个报文后,会在链路层根据 MAC 帧报头来判断该报文是否保留,否则丢弃,是则继续 CRC 校验,不通过则执行碰撞避免算法以重发报文,通过则根据帧协议类型,将报文上交给相应的上层协议。

4)MAC 地址

        MAC 地址主要用于识别数据链路层中相连的节点,且具有如下特点:

  • 长度为 48 位(即 6 个字节),一般用 16 进制数字 + 冒号来表示,例如:08:00:27:03:fb:19。
  • 一般是唯一的,不能修改,在网卡出厂时就确定。

        指令 ifconfig 可以查看当前主机的 MAC 地址:

 【补】MAC 地址与 IP 地址
        数据在路由过程中,会存在两套地址,一套是源 IP 地址和目的 IP 地址,还有一套是源 MAC 地址和目的 MAC 地址。其中,IP 地址主要用来表明数据的最终去向或最初来源,在数据传输之初就已确定,在传输过程中一般不会改变(但可能因 NAT 技术而变化);而 MAC 地址主要用来表明数据的最近去向或最近来源,会随着数据的传输,因路由器不断的解包和封装而不断发生变化。

5)MTU

        MAC 帧携带的有效载荷,其最大长度是有限制的,而这个值就是最大传输单元 MTU(Maximum Transmission Unit),是因数据链路层对应不同的物理层而产生的。

        以太网对应的 MTU 一般为 1500 字节。

        不同的网络类型,其对应的 MTU 也不同,如果在发送数据时,一次性发送的数据量超过了 MTU,则需要在 IP 层进行数据分片。
        以太网规定, MAC 帧中数据报的最小长度为 46 字节,如果发送的数据量小于 46 字节,则需要在数据后面补填充位,例如 ARP 数据包的长度是不够46字节的,一般就需要在 ARP 数据包的后面补填充位。

.1- 对 IP 协议的影响

【Tips】MTU 可能导致数据在 IP 层经历分片或组装。

        如果发送端的 IP 层,一次性发送的数据量超过了链路层规定的 MTU,就需要 IP层先对该数据进行分片,再将分片后的数据向下交付给链路层;如果数据在发送端的 IP 层进行了分片,那么在送达对端后,数据也需要在对端的 IP 层进行组装,再向上交付给传输层。

        IP 层会通过设置 IP 报头中的16位标识、3位标志和13位片偏移,来给每个分片数据包进行标记。

【补】IP 报头

  • 16 位标识:唯一标识主机发送的报文,如果数据在 IP 层进行了分片,那么每一个分片报文的 16 位标识是相同的。
  • 3 位标志:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过 MTU,IP 模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为 0,如果报文进行了分片,则除了最后一个分片报文设置为 0 以外,其余分片报文均设置为 1 。
  • 13 位片偏移:分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值 × 8 得到的。因此除了最后一个报文之外,其他报文的长度必须是 8 的整数倍,否则报文就不连续了。

        其中,由同一个数据分片得到的各个分片报文,其 IP 报头中的 16 位标识都是相同的;在每一个分片报文的 3 位标志字段中,第 2 位设置为 0,表示允许分片,第 3 位则用作结束标记,最后一个分片报文特别设置为 0,而其余分片报文设置为 1。当对端 IP 层收到这些分片报文后,需要先将这些分片报文按顺序进行组装,再向上交付给传输层。如果分片后的某个报文在网络传输过程中丢包了,那么对端在进行数据组装时就会失败,然后提醒发送端进行数据重传。

        此外,不仅源端主机可能会对数据进行分片,在数据路由时,路由器也可能对数据进行分片。这是因为,不同网络的 MTU 可能不同,如果传输路径上的某个网络,其 MTU 比源端网络的小,路由器就可能要对 IP 数据报再次进行分片。

.2- 对 UDP 协议的影响

【Tips】MTU 会增加 UDP 报文丢包的概率。

        IP 报头由基本报头和选项字段组成,最大为 60 字节,最小为 20 字节。如果不携带选项字段,那么 IP 报头的长度就是 20 字节。

        UDP 采用的定长报头为 8 字节。

        假设一台主机的 MTU 为 1500 字节,其传输层 UDP 一次性携带的数据量超过了 1500 − 20 − 8 = 1472 字节,那么数据就需要在 IP 层进行分片。

         由于只要有一个分片报文丢包,就等同于一个报文整体丢包,因此,分片后得到的多个 IP 数据报,如果有任意一个在传输过程中丢失,都会导致数据在接收端 IP 层重组失败,进而导致报文整体丢包。在网络传输时丢包的概率,哪怕是万分之一,如果将数据拆分为一百份进行发送,丢包的概率也会上升到了百分之一。
        也就是说,分片其实会增加 UDP 报文丢包的概率,更进一步地说,就是 MTU 会增加 UDP 报文丢包的概率。

.3- 对 TCP 协议的影响

【Tips】MTU 既会增加 TCP 报文丢包的概率,也可能促使 TCP 的重传机制影响数据传输的效率。

        MTU 导致的分片,也会增加 TCP 报文丢包的概率。

        TCP 的单个数据报的最大报文长度,被称为 MSS(Max Segment Size),封装在 TCP 报头的 40 字节选项字段中。通信双方在建立连接的过程中,就会进行 MSS 协商,最终从双方支持的 MSS 中选取一个较小值,最终作为通信所使用的 MSS。最理想的情况是,MSS 的值正好等于 MTU 的值,这样就不必进行分片,也不会发生分片报文的丢包了。

        如果分片报文真的丢包了,与 UDP 不同,TCP 还会在丢包后进行数据的重传。但丢包的数量多了,重传的次数也就多了,进而可能影响传输效率,因此除了取合适的 MSS 值外,TCP 还应尽量减少因分片报文丢包导致的数据重传。

6)数据跨网络传输的具体过程

        以主机 A 将数据跨网络传输给主机 B 为例:

        主机 A 先要将数据交给同局域网中的路由器 A,其手段是,将封装好的 MAC 帧发送到当前局域网中,该 MAC 帧中的源 MAC 地址和目的 MAC 地址,就是主机 A 的 MAC 地址和路由器 A 的 MAC 地址。虽然局域网中的所有主机都能收到该 MAC 帧,但核对其中的目的 MAC 地址与自己的 MAC 地址是否相同后,只有路由器 A 会保留下该 MAC 帧,并对其进行解包,然后将解包后剩下的 IP 数据报交付给自己的 IP 层。
        路由器 A 的 IP 层拿到解包的 IP 数据报后,会提取出 IP 报头中的目的IP地址,通过查询路由表,确定了需要将该数据转发给路由器 B。然后路由器 A 会将数据向下进行交付,重新封装 MAC 帧的帧头和帧尾,但其中的源 MAC 地址和目的 MAC 地址,就变成了路由器 A 的 MAC 地址和路由器 B 的 MAC 地址。最终,封装好的 MAC 帧被主机 A 发送到自己所在的局域网中。
        同理,路由器 B 会以相同的方式将数据发给路由器 C,以此类推......最终,数据成功跨网络地,被转发至主机 B。

        总得来说,数据的源 IP 地址和目的 IP 地址一般是不会变化的,其源 MAC 地址和目的 MAC 地址会一直变化。

三、ARP 协议

1)ARP 的作用

【Tips】ARP 协议可以根据数据报文中的目的 IP 地址,来获取下一跳的目的 MAC 地址。

        以主机 A 将数据跨网络传输给主机 B 为例, 数据从主机 A 经过各种路由转发到达路由器D,然后由路由器 D 送达主机 B:

        路由器 D 和主机 B 是直接相连的,属于同一个局域网,因此路由器 D 能直接将数据交给主机B,不过,前提是路由器 D 知道主机 B 的 MAC 地址。
        在数据发送之前、填充 MAC 帧报头时,路由器 D 只能从数据报文中得知主机 B 的 IP 地址,而无法从中得知主机 B 的 MAC 地址。但在路由器 D 之前的主机 A 、其他路由器等,都在 MAC 帧报头顺利地填充了下一跳的 MAC 地址,数据才能在此时到达路由器 D ,因此,路由器 D 还有其他方式得到主机 B 的 MAC 地址。
        具体的方式是,通过 ARP 协议来根据数据报文中的目的 IP 地址来获取下一跳的目的 MAC 地址。

【补】ARP 在协议栈中的定位

         ARP 是 MAC 帧的直接上层协议。

        在 TCP/IP 分层模型中,网络协议栈被自顶向下分为应用层、传输层、网络层、数据链路层,每一层都有属于自己的协议。其中,数据链路层的协议主要有 MAC 帧、ARP、RARP。

         虽然 MAC 帧、ARP、RARP 都属于数据链路层,但 ARP 和 RARP 其实是位于 MAC 帧上层的协议。换句话说,MAC 帧的上层协议未必就直接是网络层的协议,也可能是属于数据链路层的协议,但就是位于 MAC 帧的直接上层。

        与之类似的,还有网络层中的 ICMP 协议和 IGMP 协议,它们虽然和 IP 协议一样属于网络层,但位于 IP 的上层,是 IP 的直接上层协议。

2)ARP 报头

【Tips】ARP 的数据报格式

  • 以太网目的地址:用于标识下一跳设备的目的 MAC 地址。
  • 以太网源地址:用于标识当前设备的源 MAC 地址。
  • 硬件类型:链路层的网络类型,其中,1 为以太网。
  • 协议类型:要转换的地址类型,其中,0x0800 为 IP 地址。
  • 硬件地址长度:对于以太网地址为 6 字节,因为MAC地址是 48 位的。
  • 协议地址长度:对于IP地址为 4 字节,因为IP地址是 32 位的。
  • op字段:为 1 表示 ARP 请求,为 2 表示 ARP 应答。

        ARP是 MAC 帧的直接上层协议,其报头中的前三个字段和最后一个字段也是 MAC 帧报头中的字段。

        由于 ARP 数据包的长度不足 46 字节,因此 ARP 数据包在向下封装成为 MAC 帧时,还需要补上 18 字节的填充字段。

3)ARP 的工作流程

        仍以上文中,主机 A 将数据跨网络传输给主机 B 为例, 数据从主机 A 经过各种路由转发到达路由器D,然后由路由器 D 送达主机 B:

 

.1- 请求

         为了将数据送达主机 B,路由器 D 必须知道主机 B 的 MAC 地址,于是会先构建 ARP 请求。

        其中:

  • op字段设置为 1,表示这是一个ARP 请求。
  • 协议类型设置为 0800,表示要根据主机 B 的IP地址来获取主机 B 的MAC地址。
  • 硬件地址长度设置为 6,因为 MAC 地址的长度是 48 位。
  • 协议地址长度设置为 4,因为 IP 地址的长度是 32 位。
  • 发送端以太网地址,对应就是路由器 D 的 MAC 地址。
  • 发送端 IP 地址,对应就是路由器 D 的 IP 地址。
  • 目的以太网地址,对应就是主机 B 的 MAC 地址。但由于路由器 D 尚不知道主机 B 的 MAC地址,因此将目的以太网地址的二进制序列设置为全 1,表示在局域网中进行广播。
  • 目的 IP 地址,对应就是主机 B 的 IP 地址。

         ARP 请求构建完成后,为了能将其发送到局域网中,还需要将 ARP 数据包向下交付给 MAC 帧,并封装上 MAC 帧报头。

        其中:

  • 以太网目的地址设置为主机 B 的 MAC 地址。但由于路由器 D 尚不知道主机 B 的 MAC 地址,因此以太网目的地址的二进制序列也只能设置为全1,表示在局域网中进行广播。
  • 以太网源地址设置为路由器 D 的 MAC 地址。
  • 帧类型字段设置为 0806,因为这里封装的是一个 ARP 请求数据包。
  • 由于ARP请求数据包的长度只有 28 字节,不足 46 字节,因此还需要在 ARP 请求数据包中填补18字节的填充字段,再对 MAC 帧报文进行 CRC 校验即可。 

        封装完毕后,路由器 D 就可以将报文以广播的方式发送到局域网中。

        局域网中的每台主机收到这个报文后,解包并识别到 MAC 帧报头中的帧类型字段为 0806,便知道这是一个 ARP 的请求或应答的数据包,于是会将 MAC 帧的有效载荷向上交付给 ARP 层。
        ARP 层收到这个报文后,发现其中的 op 字段为 1,于是确定这是一个 ARP 请求,再提取出其中的目的 IP 地址字段。最终只有主机 B 发现该目的 IP 地址与自己的相同,因此只有主机 B会对该 ARP 请求进行应答,而局域网中的其他主机会直接将这个 ARP 请求丢弃。

【Tips】ARP 请求的送达过程

  1. 发送端构建 ARP 请求,以广播的方式发给局域网中的每一台主机。
  2. 每台主机都能识别接收,然后根据 MAC 帧报头中的帧类型字段,将有效载荷交付给每台主机的 ARP 层。
  3. 最终,根据其中的目的 IP 地址,只有目标主机会处理该 ARP 请求,其他主机则丢弃该 ARP 请求。

 

.2- 应答

        主机 B 收到来自路由器 D 的 ARP 请求后,要对其进行应答,于是会先构建构建 ARP 应答。

        其中:

  • op 字段设置为 2,表示这是一个 ARP 应答。
  • 硬件类型、协议类型、硬件地址长度、协议地址长度的值,与 ARP 请求中设置的值均相同。
  • 发送端以太网地址,对应就是主机 B 的MAC地址。
  • 发送端 IP 地址,对应就是主机 B 的 IP 地址。
  • 目的以太网地址,对应就是路由器 D 的 MAC 地址。
  • 目的 IP 地址,对应就是路由器 D 的 IP 地址。

         ARP 应答构建完成后,为了能将其发送到局域网中,还需要将 ARP 数据包向下交付给 MAC 帧,并封装上 MAC 帧报头。

         封装完毕后,主机 B 就可以将报文以广播的方式发送到局域网中。

        局域网中的每台设备收到这个报文后,解包并识别到 MAC 帧报头中的以太网目的地址,最终只有路由器 D 会将 MAC 帧的有效载荷向上交付给自己的 ARP 层,而其他设备会将该 MAC 帧直接丢弃,不会向上交付给 ARP 层。
        路由器 D 的ARP层收到这个报文后,发现其中的 op 字段为2,于是确定这是一个 ARP 应答,然后就会提取出其中的发送端以太网地址和发送端 IP 地址,至此,路由器 D 就得知了主机 B 的 MAC 地址。

【Tips】通过局域网广播、 ARP 层与 MAC 帧层之间的一来一回,当前设备即可得知下一跳的目的 MAC 地址。

 【补】MAC 帧报头中已有源、目的 MAC 地址,为什么 ARP 报头中还要有这两个字段?

        MAC 帧和 ARP 虽然都在数据链路层,但它们之间还存在上下层的关系,因此它们并不会关心彼此报头中的数据,于是 ARP 报头中也得有源、目的 MAC 地址,以便在 ARP 层进行处理。
        此外,如果底层采用的不是以太网,而是其他类型的网络,ARP 层能够独立处理源、目的 MAC 地址就更加必要了。


【补】为什么在进行局域网通信时,一般以单播的方式发送数据,而不以广播的方式?

        在进行局域网通信时,就算只知道对端的 IP 地址,而不知道对端的 MAC 地址,也可以以广播的方式将数据发送到局域网中,让局域网中的所有主机在 IP 层去比对目的 IP 地址与自己的是否相符,来判断是对数据进行保留还是丢弃。

        理论上这样确实可行,但其实非常不妥。

        因为对于局域网中的大多数主机来说,收到的这个报文其实早就应该被丢弃,而现在却交付到了 IP 层,这对网络资源和系统资源来说,都是一种大量的浪费。
        以单播的方式发送数据,在 MAC 帧层就足够判断是对数据进行保留还是丢弃,而无须将数据向上交付到 IP 层再来判断,保护了网络资源和系统资源。

        切忌无脑以广播的方式在局域网中发送数据!

 

4)ARP 缓存表

        每台主机都维护了一个 ARP 缓存表,在每次ARP请求后都会记录对应主机 IP 地址和 MAC 地址的映射关系,使得在获取下一跳的 MAC 地址时,无须每次都发起 ARP 请求。

        不过,缓存表中的表项是有过期时间的,如果在过期时间内,没有再次使用到某个表项,那么该表项就会失效,之后就需要重新发起 ARP 请求来获取下一跳的 MAC 地址。这个过期时间一般为 20 分钟。

        指令 arp -a 可查看当前主机维护的 ARP 缓存表:

补)RARP 协议

        RARP(Reverse Address Resolution Protocol,反向地址转换协议),可以根据 MAC 地址来获取 IP 地址。 

        某些情况下,一台设备可能只知道另一台设备的 MAC 地址,此时要得知该设备的 IP 地址,就可以使用 RARP 协议。

        理论上讲,RARP 协议一定比 ARP 协议实现起来更简单。既然已经知道一台设备的 MAC 地址了,那么就已经可以直接向给该设备发送数据了,也就是说,其实可以向该设备直接询问它的 IP 地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值