计算机网络 (5) 数据链路层-MAC地址、IP地址及ARP协议

1,845 阅读9分钟

本文引用图片均来自 高军: 计算机网络

MAC地址

作用

两台主机之间最简单的通信方式是使用信道直接相连,彼此之间直接发送数据。但是当主机数量增多,这种两两相连的方式会导致每台主机都连接数不清的信道,这样的网络是无法使用的,因此就出现了总线型、星型等网络。

总线型、星型等网络中的主机共享信道,那么主机如何知道从信道中收到的数据是发送给自己的呢?为了区分不同的主机,这里就产生了地址的概念。主机发送数据时要带上目的主机的地址,主机从信道上收到数据后先查看数据的目的地址是否和自身地址相同,相同则处理数据否则丢弃

由于这类地址用于媒体接入控制MAC(Media Access Control),因此这类地址被称为MAC地址

共享信道要考虑的一个问题是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制

image.png

MAC地址一般固化在网卡里面,因此MAC地址也称为硬件地址,有时也被称为物理地址(注意MAC属于链路层不是物理层)。由于主机可能具有多张网卡(有线和无线)因此主机会具有多个MAC地址,所以MAC地址是对网络中各网络接口的唯一标识而不是设备的唯一标识

image.png

格式

本节讨论IEEE 802局域网的MAC地址格式,MAC地址一共6个字节

  1. 前三字节:组织唯一标识符,由IEEE的注册管理机构分配
  2. 后三字节:网络接口标识符,由厂商自行分配

下图为华为获得的组织唯一标识符,会被用在华为制造的网卡设备MAC地址的前6个字符上,反过来我们通过MAC地址的前6个字符也可以确定网卡的制造商

image.png

MAC地址第一个字节的最低两位有特殊用途:

  1. 最低位:0表示全球管理(全球唯一),1表示本地管理(本地唯一)
  2. 次低位:0表示单播(单一源到单一地址),1表示多播(单一源到多地址)
image.png image.png

MAC地址各字节在网络上的传输顺序遵循以下规则:

  1. 字节:发送顺序为第一到第六字节
  2. 字节内比特:发送顺序为b0{b_{0}}b1{b_{1}}

实例

单播

image.png

广播,网络中的主机接收到帧后检查目的地址,发现目的地址是广播地址,于是所有主机都接受该帧

image.png

组播,主机A发送帧到多播地址07-E0-12-F6-2A-D8,网络中的主机接收到帧后检查自身多播组列表,如果多播地址位于列表内则接受该帧,否则丢弃

image.png

至此,MAC地址的介绍就告一段落了。但是,目前为止描述的只是数据在一个网络内的流动,如果数据要跨网络流动呢?这就需要MAC地址的两个搭档出场了,它们是网络层IP地址ARP协议。因为三者关系密切,所以这里也做一下简单介绍

IP地址

由来

最早的时候为了避免同网络中的主机两两连接,主机都连接到一个叫连接器的设备中,连接器只是简单的将收到的数据转发给其他所有主机,其他主机根据数据的MAC地址决定是否接受该数据包。连接器位于物理层

连接器将数据转发给所有主机是低效且不安全的,于是出现了交换机。交换机内部有MAC表,记录哪个主机接在哪个端口,这样交换机在转发数据的时候只要根据目的MAC地址查表就可以做到精准转发。交换机位于数据链路层

交换机MAC表最初是空的,当收到数据包时会记录它的源MAC地址端口映射关系,如果目的MAC地址和端口的映射关系没有记录就会先转发给所有主机,然后看哪台主机回应数据包就能记录目的MAC地址和端口的映射关系。随着主机间的通信MAC表会逐渐完整(记录网络中所有MAC地址端口的映射关系)

假设一个网络中有一台交换机,那么不同网络想要通信只需将两个网络的交换机连接起来,这时候只需使用MAC地址即可实现跨网络通信。但是,此时交换机会将所有其他网络的主机MAC地址也记录进表中,当网络数量或网络中的主机数量过多表就会太大导致交换机无法工作

上述问题的原因是人们不知道所连接到的交换机代表的网络中有多少主机,于是人们提出了转发的方案——当数据需要跨交换机(网络)时,当前网络的交换机直接将数据转发到相应网络的交换机中由其进行网络内的数据传递。为了解决交换机之间转发数据的问题人们提出了路由器的概念,交换机连接在路由器上,当交换机发现目的MAC地址不在本网络中时就将数据转发给路由器,由路由器转发到相应的交换机中。路由器位于网络层

路由器需要决定什么样的数据转发给哪个交换机,如果仍然使用MAC地址,那么它需要建表记录MAC地址端口(交换机接在路由器端口)的映射关系,这会导致和交换机之间直接相连一样的问题,另外由于MAC地址格式问题,想要做到通配也不容易,所以人们提出了IP地址

IP地址标识两部分信息:

  1. 网络编号:用于标识不同的网络
  2. 主机编号:用于标识同一网络中的不同主机

路由器会建立路由表,使用子网掩码确定IP地址网络号,据网络号查表找到对应的端口(交换机)进行转发。子网掩码的存在使得路由器可以对IP地址进行通配,这样就不用为每一个IP地址记录端口映射关系,而是为一批IP地址记录映射关系

图片来源: 闪客sun image.png

每个交换机都会记录默认网关(路由器)的地址,只要通过子网掩码发现数据包目的地址不在本网络就转发给路由器由其进行转发

当然,网络与网络之间会存在多个路由器,各个路由器如何相互发现以及路由表如何建立就是另一个复杂的问题了,这里不再展开

协作

下图展示MAC地址IP地址协作的例子,主机H1H2位于不同的网络,网络间通过路由器相连,主机和路由器分别有自己的IP地址MAC地址

image.png
1. 主机H1发送的数据分组包含自身的IP地址(IP1)和主机H2的IP地址(IP2),包含自身的MAC地址(MAC1)和路由器
R1的MAC地址(MAC3)
2. 路由器R1收到数据分组后根据目的IP地址(IP2)查表转发,同时将源MAC地址设置为自身端口的MAC地址(MAC4),
将目的MAC地址设置为R2的MAC地址(MAC5)
3. 路由器R2收到数据分组后根据目的IP地址(IP2)查表转发,同时将源MAC地址设置为自身端口的MAC地址(MAC6),
将目的MAC地址设置为H2的MAC地址(MAC2)

可以发现其实跨网络通信就是一次次的网络内通信组成的,在数据分组的转发过程中源IP地址目的IP地址不变的,但是MAC地址随着发送方接收方的改变而改变(或者说随着网络的改变而改变),这也侧面验证了IP地址用于跨网络通信,MAC地址用于同一个网络的通信

不知道读者有没有考虑过这样一个问题——IP地址能实现跨网络通信自然也能实现本网络间的通信,那么为什么还需要MAC地址呢?本人认为这跟网络的发展历程有关,MAC地址早于IP地址,基于MAC设计并实现了大量的算法、协议和硬件设备,想要取代MAC并不是容易的事。另外,IP地址的出现是为了解决跨网络通信时路由表过大的问题并不是为了取代MAC,因此设计的时候也没有为取代MAC做过多考虑,因此在以太网网络层的IP和数据链路层的MAC就一直共存着。当然查资料的过程中发现有各种各样的说法,但是本人还是认为这两者才是主要原因。

ARP协议

ARP(Address Resolution Protocol)协议用于解决知道IP地址不知道MAC地址的问题,比如主机在配置默认网关时知道路由器的IP地址,但是主机给路由器转发数据时在数据链路层需要将路由器的MAC地址写进帧首部,此时主机没有路由器的MAC地址,那么就需要使用ARP协议来获取路由器的MAC地址

网络中每台主机都有ARP高速缓存表,在封装帧时会查表找到目的IP地址对应的MAC地址,如果找不到则在网络中发送广播帧

image.png

网络中的主机收到帧后检查请求帧中目的IP地址是否为自身IP地址,不是则丢弃帧,是则将广播帧中的源IP地址MAC地址记录进自身ARP表并返回单播响应帧

image.png

主机收到响应帧后将信息记录进自身ARP表即可

ARP表中的记录分为动态记录和静态记录,动态记录就如前文所述是通过广播和响应获取的,生命周期为2分钟,静态记录就是手动设置的,生命周期不定。

image.png

额外提一下,在动态获取记录的时候是可能被攻击的,攻击者只需要伪装自己是目的主机并返回构造好的帧就能污染受害者的ARP表,使得数据被错误的发送给攻击者,这就是ARP攻击

参考文献