《计算机网络:自顶向下方法》:数据链路层

1. ARP 工作原理

每台主机或路由器在其内存中具有一个 ARP 表,这张表包含 IP 地址到 MAC 地址的映射关系。该 ARP 表也包含一个 TTL 值,它指示了从表中删除每个映射的时间。这张表不必为该子网上的每台主机和路由器都包含一个表项;某些可能从来没有进入到该表中,某些可能已经过期。

假设同一个子网下的 222.222.222.220 要向 222.222.222.222 发送数据报。在这种情况下,发送方用 ARP 协议来解析这个地址。首先,发送方构造一个称为 ARP 分组的特殊分组。一个 ARP 分组有几个字段,包括发送和接收 IP 地址以及 MAC 地址。ARP 查询和响应分组都具有相同的格式。ARP 查询分组的目的是询问子网上其他所有主机和路由器,以确定对应于要解析的 IP 地址的那个 MAC 地址。

222.222.222.220 向它的适配器传递一个 ARP 查询分组,并且指示适配器应该用 MAC 广播地址(即 FF:FF:FF:FF:FF:FF)来发送这个分组。适配器在链路层帧中封装这个 ARP 分组,用广播地址作为帧的目的地址,并将该帧传输进子网中。包含该 ARP 查询的帧能被子网上的所有其他适配器收到(交换器转发到所有非来源端口),并且(由于广播地址)每个适配器都把在该帧中的 ARP 分组向上传输到 ARP 模块。这些 ARP 模块中的每个都检查它的 IP 地址是否与 ARP 分组中的目的 IP 地址相匹配。与之匹配的一个给查询主机发送回一个带有所希望映射的响应 ARP 分组。然后查询主机222.222.222.220能够更新它的 ARP 表,并发送它的 IP 数据报,该数据报封装在一个链路层帧中,并且该帧的目的 MAC 就是对先前 ARP 请求进行响应的主机或路由器的 MAC 地址。

关于 ARP 协议有两件事情需要注意。首先,查询 ARP 报文是在广播帧中发送的,而响应 ARP 报文是在一个标准帧中发送。其次,ARP 是即插即用的,这就是说,一个 ARP 表是自动建立的。并且如果某主机与子网断开连接,它的表项最终会从留在子网中的结点的表中删除掉。

最好把 ARP 看成是跨越链路层和网络层边界两边的协议。

链路层帧在路由器之间转发时,源路由器会用自己的 MAC 地址替换帧的 源 MAC 地址,用下一跳路由器的 MAC 地址替换帧的目的 MAC 地址。

2. 交换机转发和过滤

过滤(filtering)是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能,转发(forwarding)是决定一个帧应该被导向哪个接口,并把该帧接口移动到那些接口的交换机功能。交换机的过滤和转发借助于交换机表完成。交换机表中的一个表项包含:

  1. 一个MAC地址;
  2. 通向该地址的交换机接口;
  3. 表项放置在表中的时间;

为了理解交换机过滤和转发的工作过程,假定目的地址为 DD-DD-DD-DD-DD-DD 的帧从交换机接口 x 口到达,交换机用 MAC 地址 DD-DD-DD-DD-DD-DD 索引它的表。有 3 种可能的情况:

  • 表中没有对于 DD-DD-DD-DD-DD-DD 的表项。在这种情况下,交换机向除接口 x 外的所有接口前面的输出缓存转发该帧的副本。换言之,如果没有对于目的地址的表项,交换机广播该帧。
  • 表中有一个表项将 DD-DD-DD-DD-DD-DD 与接口 x 联系起来。在这种情况下,该帧从包括适配器 DD-DD-DD-DD-DD-DD 的局域网网段到来。无需将该帧转发到任何其他接口,交换机通过丢弃该帧执行过滤功能即可。
  • 表中有一个表项将 DD-DD-DD-DD-DD-DD 与接口 $ y \neq x$ 联系起来。在这种情况下,该帧需要被转发到与接口 y 相连的局域网网段。交换机通过将该帧放到接口 y 前面的输出缓存完成转发功能。

3. RARP

反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。RARP 可以使用于以太网、光纤分布式数据接口及令牌环 LAN。

4. DHCP 和 RARP 的区别

RARP 在功能上有点类似于 DHCP 协议,确切的说 DHCP 是 BOOTP 协议的升级,而 BOOTP 在某种意义上又是 RARP 协议的升级。BOOTP 和 RARP 的区别在于 RARP 是在数据链路层实现的,而 BOOTP 是在应用层实现的,作为 BOOTP 的升级版 DHCP 也是在应用层实现的。这种实现层面的差别也从 RARP 和 BOOTP/DHCP 的报文封装格式的差别上体现出来了,RARP 直接封装在以太网帧中,协议类型置为0x0800以标识这个报文是 ARP/RARP 报文,BOOTP/DHCP 报文是直接封装在 UDP 报文中,作为 UDP 的数据段出现的。

从功能上说,RARP 只能实现简单的从 MAC 地址到 IP 地址的查询工作,RARP server 上的 MAC 地址和 IP 地址是必须事先静态配置好的。但 DHCP 却可以实现除静态分配外的动态IP地址分配以及IP地址租期管理等等相对复杂的功能。

RARP 是早期提供的通过硬件地址获取 IP 的解决方案,但它有自己的局限性,比如 RARP 客户与 RARP 服务器不在同一网段,中间有路由器等设备连接,这时候利用 RARP 就显得无能为力,因为 RARP 请求报文不能通过路由器,BOOTP/DHCP 提供了很好的解决方法。

RARP、BOOT 和 DHCP 都是动态学习 IP 地址的协议。起初,客户端主机要发送一个广播以启动发现进程,有一台专门的服务器负责监听这些请求并提供 IP 地址给客户端主机。

RARP 使用的是和 ARP 相同的消息,只不过它的消息中列出的目标 MAC 地址是其自己的 MAC 地址,而目标 IP 地址是 0.0.0.0。预先配置好的 RARP 服务器(必须处于客户端同一子网中)接收请求并进行查询。如果目标 MAC 地址匹配到,RARP 服务器就发送 ARP 响应(包含配置的 IP 地址在其源 IP 地址字段中)。