第四章:地址解析协议
写在前面
好久没有更新这个分类的博客了,因为实在是看不下去了。好在上了计算机网络课之后对网络有了一些基本的认识。看书会轻松一些。如果直接啃这本书,对我来说还是有些难度的。
下面是我的一些学习记录
引言
- IP协议的设计目标是为了通信能跨越不同种类的物理网络。
- 比如,两个以太网可以互相通信,但是以太网和令牌环网之间就需要通过IP协议互通。
- 但是IP层是靠IP地址来寻找主机的,链路层是靠MAC地址来寻找主机。
- 如何知道一台主机的IP地址对应的MAC地址是多少呢,这就用到了ARP协议。
- MAC地址:一个网络设备的硬件地址,在他出场的时候就被设置好,具有唯一性和永久不变性。
- IP地址:由用户或者网络管理员分配,唯一性且可以根据需要改变。
网络接口的硬件通常有一个主要的硬件地址,(例如以太网或802.11无线接口的48bitsMAC地址)由硬件交换的帧(frame)需要正确的地址定位到正确的硬件接口,否则无法传输数据。如果一个主机需要发送一个帧到另一个主机,仅知道这台主机的IP地址是不够的,还需要知道主机在网络中有效的硬件地址。这就需要两个地址之间的互相转换。
- 对于 TCP/IP网络,地址解析协议,ARP(Address Resolution Protocol)提供了一种在IPv4地址和各种网络技术中使用的硬件地址之间的映射。地址解析是发现两个地址之间映射关系的过程。
- ARP仅用于IPv4网络。IPv6使用的是邻居发现协议,是ICMPv6的一部分。
- ARP 是一个通用的协议。它被设计为支持多种地址之间的映射。不过实际上它最常被用于 IPv4地址和 MAC 地址之间的映射。ARP 提供动态映射,动态这个术语是因为它会自动执行以及随时间变化不需要系统管理员重新配置,ARP 的操作通常与用户或系统人员无关。
一个例子
- 当主机 H1 向主机 H2 发包时,由于它们两个处于不同的局域网,所以要靠路由器传送数据。
- H1 发送的数据包中,包含了源IP(H1的IP),目的IP(H2的IP)。源目IP字段是不可改变的,如果改变路由时将不知道向哪里发送。
- 我们知道链路层头部还要加入源目 MAC 字段,封装这个包中的源目 MAC 字段的过程是这样的:
- 主机 H1 自身也相当于一个路由器。
- 路由器中存有一张路由表,每一个路由表项大概的内容就是:(目的地址,下一跳地址)。
- 通过查阅路由表,目的 IP 为 H2 的下一跳地址是 R1。
- 那么我们怎么知道R1的HA3端口的MAC地址呢,这时候就要有ARP。
- 封装好源目IP和源目MAC之后,数据包达到R1的HA3端口。
- R1收到数据包之后通过解封装,发现这个包不是发给自己的,所以查路由表,发现下一跳IP地址为R2,通过ARP转换之后,再把数据包发送到R2。
- 如此下去,通信成功。
- 源目IP字段不可变,源目MAC要根据需要改变。这也说明了IP层只负责两个主机之间的通信,而链路层是要负责端到端的通信。
直接交付
当我们使用互联网服务时,例如在浏览器中打开一个网页,本地必须确定如何与相关的服务器联系。首先判断服务器是否位于本地(即是否在同一个子网)还是远程。如果是远程的需要一台可以到达目的地的路由器。只有在位于与目的地同一 IP 子网的系统时,ARP 才能工作。(上个例子中,主机和路由器是在同一个局域网的哦)
- 直接交付(Direct delivery)发生在一个 IP 数据包被发送到一个具有与发送地址相同 IP 前缀的目的地址。即发送方跟接收方为同一子网。直接交付的示意图如下:
例如,用 Web 浏览器打开如下地址:http://10.0.0.1
是一个直接交付的操作:
- 应用程序是一个外部浏览器,正常情况下:调用一个函数来解析URL,看他是否包含主机名。这里不是,这种情况,而是一个IPv4地址。
- 应用程序要求TCP协议建立一条到
10.0.0.1
的连接。 - 通过向地址
10.0.0.1
发送一个IPv4数据包,TCP尝试向远程主机发送一个连接请求(后面会介绍细节)。 - 假设发送主机与目的IP地址,具有相同的网络前缀,这意味着两台主机在同一个局域网内,数据报可以直接发送到这个地址而不经过任何路由器。
- 假设链路层使用的是以太网 MAC 地址。则发送主机必须将 32 位的IPv4目的地址转换为 48 位的以太网地址。这就是 ARP 功能。
- 在共享的链路层网段上 ARP 向所有主机发送一个称为 ARP 请求(ARP request)的以太网帧。这是被称为链路层广播。ARP 请求的内容是寻找以下问题的答案:“如果你的 IPv4 地址是
10.0.0.1
,请向我回应您的 MAC 地址。” - 同一广播域的所有系统都可以接收到 ARP 请求。这其中可能包括根本不运行IPv4的系统,但不包括位于不同 VLAN 的系统。如果某个系统使用了这个请求内包含的 IPv4 地址,需要回应一个ARP 应答(ARP reply),这个应答的内容就是其 MAC 地址。应答通常不是广播,而是直接发送给请求的发送方。收到应答的主机学习IPv4 到 Mac 地址的映射记录在内存之后,以供以后使用(缓存)。
- 发送方将数据报封装在以太网帧中,使用由 ARP 交换学习到的一台 MAC 地址作为目的地址。直接将数据交付到正确的主机。
- PPP 网络不使用ARP,因为当这些链路被确定后,在链路两端通知正在使用的地址。由于不涉及MAC地址,所以不需要ARP
ARP缓存
- 如果需要用一次就广播一次ARP请求,会造成网络流量拥挤,所以我们将每一次学习到的ARP映射存到一张表中,以便下次使用。
ARP 缓存(ARP cache)是 ARP 高效运行的关键。每个主机和路由器上有 ARP 缓存表。表存放了使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。当IP地址映射成硬件地址时,生成一个缓存表里的条目。默认到期时间是 20 分钟。
- ARP缓存存在超时,这个道理想必大家都懂。
- 命令允许管理员设置缓存条目永不超时,即设置为静态。大多数实现中,完整的条目超时时间为二十分钟,不完整的条目(例如一个到不存在的主机的请求)超时时间为三分钟。
这是一个关于软状态(soft state)的重要例子。软状态是指在超时前没有更新而被丢弃的信息。如果网络条件发生改变,软状态有助于启动自动重新配置。因此很多 Internet 协议使用软状态,软状态的成本就是必须刷新状态,以避免过期。在一些协议设计中经常包括软状态刷新,以保持软状态的活跃。
ARP帧格式
- 前面提到,在不知道目的IP的MAC地址的情况下需要广播ARP帧,那么这个帧到底长什么样子呢?我们来看看:
字段 | 长度 | 内容 | 含义 |
---|---|---|---|
DST | 6 | 请求:ff:ff:ff:ff:ff:ff 应答:发出请求的主机MAC |
请求:默认是广播地址,同一广播域所有以太网接口都可以接受到 应答:发出请求的主机MAC地址 |
SRC | 6 | 请求:发出请求主机的MAC 应答:回应方MAC地址 |
请求:由于是广播,所以是发送方 MAC 地址 应答:被请求的主机的MAC地址 |
Length or Type | 2 | 0x0806 | ARP 的以太网 type 是固定的 0x0806 |
硬件类型(Hard type) | 2 | 以太网是 1 | 硬件地址类型(链路层可能有很多不同的) |
协议类型(Prot type) | 2 | IPv4 是 0x0800 | 指出映射的网络层协议类型,ARP只能用于IPv4所以固定。 |
硬件大小(Hard size) | 1 | 以太网是 6 | 硬件地址的长度,以字节为单位,MAC 地址是 8 个字节 |
协议大小(Prot size) | 1 | IPv4 是 4 | IP地址的长度,以字节为单位,IPv4 地址是 4 个字节 |
操作类型(OP) | 2 | 1~4 | 1:ARP 请求、2:ARP应答、3:RARP 请求、4:RARP 应答 |
发送方硬件地址 | 长度可变 | 发送方MAC地址 | 发送方MAC地址。 |
发送方协议地址 | 长度可变 | 发送方IPv4地址 | 发送方IPv4地址。 |
目的硬件地址 | 长度可变 | 请求:因为是广播,所以设为0 应答:目的MAC地址 |
请求:因为是广播,所以设为0 应答:目的MAC地址 |
目的协议地址 | 长度可变 | 目的IPv4地址 | 目的IPv4地址 |
填充(Pad) | 长度可变 | 一堆0 | 为了满足最小帧长度 |
FCS | 4 | 4字节循环冗余校检码(CRC) | 检查传输是否出错 |
目标主机生成应答的方式就是填充自己的硬件地址,然后将两个发送方地址和两个接收方地址交换,将
op
字段设置为 2,然后发送自己的应答。
总结
ARP 是一个 TCP/IP 的基本协议,不过,它通常在应用程序或用户没有察觉的情况下使用和运行。ARP 用于确定本地可达的 IPv4 子网中,使用某个IPv4地址的主机对应的硬件地址。ARP 在数据报的目的地与发送方处于同一子网时发挥功效。不在同一子网,将会转发到一台路由器(详见 IP 协议)。ARP 缓存是其运行的基础,可以使用
arp
命令查看并处理缓存。缓存条目都有计时器。