TCP/IP协议-地址解析协议

风尘

文章目录

  1. 1. ARP
    1. 1.1. ARP 分组格式
    2. 1.2. ARP 请求/应答
    3. 1.3. ARP 高速缓存超时设置
    4. 1.4. ARP 代理
    5. 1.5. 免费 ARP
  2. 2. RARP
    1. 2.1. RARP 分组格式
    2. 2.2. 工作原理
    3. 2.3. RARP 服务器设计

[TOC]

ARP

当一台主机把以太网的数据帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的,设备驱动程序从不检查IP数据报中的目的地IP地址。

地址解析为这两种不同的地址形式提供映射。 地址解析协议(Adress Resolution Protocol,ARP)IP地址到对应的硬件地址之间提供动态映射。

ARP 高效运行的关键是由于每个主机都有一个ARP高速缓存,存放最近Internet地址到硬件地址之间的映射记录。高速缓存从被创建起,每一项的生存时间一般为20分钟。

示例

$ ftp bsdi # 执行 ftp 命令
-----------后台执行步骤如下---------------------------------------

1.应用程序 FTP 客户端调用函数`gethostbyname(3)`把主机名转换成 IP 地址。
  这个转换过程使用`DNS`或在较小的网络使用一个静态的主机文件`/etc/hosts`。
2.FTP 用得到的 IP 地址请求 TCP 建立连接。
3.TCP 用 IP 地址发送一份数据报。
5.如果目的主机在本网络上,IP 数据报可直达目的主机;如果在远程网络上,
  通过 IP 选路函数确定下一跳路由器地址,并让它转发数据报。
6.如果是以太网,则需要将 IP 地址变换成以太网地址。这就是 ARP 的功能。
7.ARP 发送一份 ARP请求的以太网数据帧(包括 IP 地址和主机名)给以太网上的每个主机,这个过程叫做广播。
8.目的地址主机 ARP 收到广播后,识别出发送端在寻问它的地址后,发送一个 ARP 应答(包含 IP 地址和硬件地址)。
9.发送 IP 数据报到目的主机。

接口都有一个48bit硬件地址,通常称呼其为MAC地址。地址每个字节用十六进制数表示,每字节中间以:隔开,共有2^48个可能的MAC地址。通过IEEE统一分配使用,分配方式是固定一个MAC地址的前24bit,让公司自己为每个适配器生成后24bit

ARP 分组格式

以太网ARP请求/应答分组格式以太网ARP请求/应答分组格式

源地址目的地址 ,均占6字节,其中目的地址值是全为1的特殊地址表示广播地址。电缆上所有的以太网接口都要接收广播的数据帧。

帧类型 表示后面的数据类型。对于ARP请求和应答来说,该字段值均为0x0806

硬件类型 表示硬件地址的类型,值为1表示以太网地址。

协议类型 表示要映射的协议地址类型,值为0x0800表示IP地址。它的值与以太网数据帧中类型字段IP数据报类型的值相同,这是有意设计的。

硬件地址长度协议地址长度 ,单位为字节,所以对于以太网上IP地址的ARP请求和应答来说,它们的值分别为 648/8=648/8=6)和432/8=432/8=4)。

操作字段(op) 总共有四种操作类型:

  • 值为1,表示ARP请求。
  • 值为2,表示ARP应答。
  • 值为3,表示RARP请求。
  • 值为4,表示RARP应答。

这个字段是必须的,因为ARP/RARP的帧类型字段值是相同的。

最后四个字段有一些重复信息,如在以太网帧首部和ARP请求数据帧中都有 发送端硬件地址 信息。

对于一个ARP请求来说,除 目的端硬件地址 外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。

ARP 请求/应答

当一台主机bsdi通过telnet工具发送一个简单的请求时,ARP的执行情况如下:

$ arp -a # 检查 ARP 高速缓存为空
$ telnet svr4 discard # 连接 svr4
Trying 140.252.13.34..
Connected to svr4.
Escape character is '^]'.
^]            # 进入 telnet 命令行
telnet> quit  # 退出 telnet
Connection closed.

-----------------------------------------------
# 在 telnet 目标系统执行 tcpdump 命令监控 ARP 
$ tcpdump -e
1    0.0                  0:0:c0:6f:2d:40    ff:ff:ff:ff:ff:ff    arp    60
                          arp who-has svr4 tell bsdi
2.   0.002174 (0.0022)    0:0:c0:c2:9b:26    0:0:c0:6f:2d:40      arp    60
                          arp reply svr4 is-at 0:0:c0:c2:9b:26
3.   ...省略

1行,源端主机bsdi硬件地址0:0:c0:6f:2d:40,目的地址表示为广播地址,电缆上所有的以太网接口都要接收这个数据帧并对它进行处理。

arp说明此数据帧是一个ARP请求或应答,所以帧类型字段值是0x0806

60表示以太网数据帧长度,由于ARP数据帧长度都是42字节(帧头14字节包括目的地址、源地址、类型字段28字节ARP数据),因此,第一帧都必须加入填充字符以达到以太网60字节的最小长度要求。

最小长度指14字节的以太网帧头(包括目的地址、源地址、长度),数据字段46字节,不包括4字节以太网帧尾。

arp who-has表示ARP请求的数据帧中,目的IP地址是svr4的地址,发送端IP地址是bsdi的地址。

2行,目的主机进行ARP应答,其目的主机IPbsdi(0:0:c0:6f:2d:40)ARP应答是直接发送到请求主机,而不是广播。

arp reply表示应答svr4的地址在0:0:c0:c2:9b:26

从第2行开始,每行在括号中都包含与上一行的时间差(单位:秒)。


如果查询的主机已关机或不存在时,情况如下:

$ telnet 140.252.13.36 # 连接无效 IP 地址
Trying 140.252.13.36...
telnet: Unable to connect remote host: Connection timed out.
$ arp -a # 检查 ARP 高速缓存
? (140.252.13.36) at (incomplete)

----------------------------------------------------------------
# 在另一系统执行 tcpdump 命令
$ tcpdump
1    0.0                   arp who-has 140.252.13.36 tell bsdi
2    5.509069  (5.5091)    arp who-has 140.252.13.36 tell bsdi
3    29.509745 (24.0007)   arp who-has 140.252.13.36 tell bsdi

ARP请求按照指定规则一直重发,直到时间超过TCP请求设置的超时时间结束,通常为75秒。


ARP 高速缓存超时设置

ARP高速缓存中的表项一般都要设置超时时间,通常对完整表项的超时时间设置为20分钟,不完整的表项超时时间为3分钟。上面telnet 140.252.13.36示例中的表项就是不完整表项(incomplete),即以太网上不存在的主机发出的的ARP请求。

管理员可以通过arp命令把地址放入高速缓存中,而不设置超时时间。

Host Requirements RFC表明,即使表项正在使用时超时值也应该启动,但是大多数从伯克利系统演变而来的系统没有这样做,它们在每次使用表项时重设超时时间。

ARP 代理

如果ARP请求是从一个网络主机发往另一个网络主机,那么连接这两个网络的路由器就可以回答这个请求,这个过程称作 委托 ARP 或 ARP代理

ARP 代理 会让ARP请求发送端误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。

路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。

如下图,当子网140.252.1上的主机gemini将一份IP数据报要传递给140.252.1.29sun时,会发送ARP请求给140.252.1.29。路由器netb识别出该IP地址属于它的一个拨号主机,于是把它的以太网接口地址140.252.1作为硬件地址来回答。

主机gemini通过以太网发送IP数据报到netbnetb通过拨号SLIP将数据报转发到sun。这个过程对所有140.252.1子网上的主机都是透明的,主机sun实际上是路由器netb后面配置的。

# 在主机`gemini`上执行`arp -a`命令,经过与主机`sun`通信后,
# 发现同一个子网`140.252.1`上的`netb`和`sun`的 IP 地址映射的硬件地址是相同的。
# 这通常是使用 ARP 委托的线索。
$ arp -a
netb (140.252.1.183) at 0:80:ad:3:6a:80
sun (140.252.1.29) at 0:80:ad:3:6a:80
ARP 代理ARP 代理

通过上图发现,bsdislip之间分别有一个IP,所以路由器netb下方SLIP链路显然缺少一个IP地址,这是因为路由器不需要知道拨号SLIP链路每一端的IP地址(减少了IP的使用)。

通过分组到达的串行线路接口来确定发送分组的拨号主机,因此对于连接到路由器的每个拨号主机不需要用唯一的IP地址,所有拨号主机使用同一个IP地址作为SLIP链路的目的地址。

通过ifconfig命令可以显示该拨号SLIP链路的目的地址是140.252.1.183

免费 ARP

免费ARP(Gratuitous ARP) 包是一种特殊的ARP请求,它并非期待得到IP对应的MAC地址,而是当主机启动的时候,发送一个Gratuitous ARP请求,即请求自己的IP地址的MAC地址。

它与普通ARP请求报文的区别在于报文中的目标IP地址。普通ARP报文中的目标IP地址是其他主机的IP地址,而免费ARP的请求报文中,目标IP地址是自己的IP地址。

作用

  • 用于检测IP地址冲突。当一台主机发送了免费ARP请求报文后,如果收到了ARP响应报文,则说明网络内已经存在使用该IP地址的主机。
  • 用于更新其他主机的 ARP 缓存表。当主机更换了网卡(接口卡),而其他主机的ARP缓存表仍然保留着原来的MAC地址。这时,可以发送免费的ARP数据包。其他主机收到该数据包后,将更新ARP缓存表,将原来的MAC地址替换为新的MAC地址。

RARP

逆地址解析协议(Reverse Address Resolution Protocol,RARP),与ARP作用相反,用于将MAC地址通过读取ARP缓存表获取其IP地址。

具有本地磁盘的主机,一般通过磁盘上配置文件读取IP地址,但是无盘主机(如X终端或无盘工作站)则需要通过其他方法来获取IP地址。

网络上每个系统都具有唯一的硬件地址,它由网络接口生产厂商配置,无盘系统就可以从接口网卡读取硬件地址,再通过RARP协议获取IP地址。

RARP 分组格式

ARP分组格式基本一致,主要区别是RARP请求/应答帧类型是0x8035,请求操作代码是3,应答操作代码是4

RARP请求以广播方式传送,而RARP的应答一般是单播传送。

工作原理

  • 发送主机发送一个本地RARP广播,声明自己的MAC地址并请求任何收到该请求的RARP服务器分配一个IP地址;
  • 本地网段上的RARP服务器收到此请求后,检查其RARP列表中MAC地址对应的IP地址;
  • 如果存在,RARP服务器给源主机发送一个响应数据包并将该IP地址提供给对方主机使用;
  • 如果不存在,RARP服务器对此不做任何响应;
  • 源主机收到RARP服务器响应信息,就可利用得到IP地址进行通信;如果一直没收到RARP服务器响应,则表示初始化失败。

RARP 服务器设计

RARP在原理上很简单但是实现比较复杂,由于RARP的请求是在硬件层上的广播,因此不能通过路由器进行转发。为了让无盘系统在RARP关机的状态下也能引导,通常在每个网络上都要实现多个RARP服务器,服务器数量增加,网络流量也随之增加。

发送RARP请求的无盘系统一般采用最先收到的RARP应答(ARP没有这种情况,因为只有一台主机发送ARP应答),另外在同一网络中不同主机可能会同时进行RARP应答,这样增加了以太网发生冲突的概率。

RARP服务器一般要为多个主机提供硬件地址到IP地址的映射,该映射包含在一个磁盘文件中(Uinx系统一般位于/etc/ethers目录中)。由于内核一般不读取和分析磁盘文件,因此RARP服务器的功能就由用户进程来提供,而不是作为内核的TCP/IP实现的一部分。

更为复杂的是,RARP请求是作为一个特殊类型的以太网帧类型(0x8035)来传送,这说明RARP服务器必须能够发送和接收这种类型的以太网数据帧。由于发送和接收这些数据帧与系统有关,因此RARP服务器的实现是与系统捆绑在一起的。