4-5_ARP,RARP

  • 数据链路层如以太网或令牌环网都有自己的寻址机制(常常为 48 bit 地址),这是使用数据链路的任何网络层都必须遵从的,所以就需要将网络层使用的协议地址转换为数据链路层使用的硬件地址.

  • 地址解析,用于将协议地址转换为硬件地址,或者将硬件地址转换为协议地址.

  • 将协议地址转换为硬件地址的整个流程:

    1. 首先查询内核 ARP 高速缓存表.

    2. 若表中已经存在,则直接从表中取出硬件地址.

    3. 否则广播 ARP 请求报文,然后等待回应.然后从收到的 ARP 应答报文中取出硬件地址.

ARP 高速缓存表

  • 一般情况下,当系统收到 ARP 请求或 ARP 应答报文时,都会将发送端的硬件地址,协议地址存放在 ARP 高速缓存中. 

  • 不完整的表项,即只知道协议地址,却不知道硬件地址的表项.如:

地址          硬件地址        接口
10.223.0.1   (incomplete)   wlan0  #这个就是不完整的表项.

ARP 分组格式

硬件地址类型: 2 字节. /* 值为 1 表示以太网硬件地址 */
协议地址类型: 2 字节. /* 值为 0x0800 表示 IP 层协议地址 */   
硬件地址长度: 1 字节.
协议地址长度: 1 字节.
op: 2 字节 /* ARP 请求(值为1),ARP 应答(值为 2),RARP 请求(值为 3),RARP 应答(值为 4) */
发送端硬件地址: 6 字节(由硬件地址长度字段决定,一般为 6 个字节)
发送端协议地址: 4 字节(由协议地址长度字段决定)
接收端硬件地址: 6 字节(由硬件地址长度字段决定)
接收端协议地址: 4 字节(由协议地址长度字段决定)

  • 发送 ARP 请求报文

构建 ARP 请求报文:{1;0x8000;6;4;1;自身硬件地址;自身协议地址;0;接收端协议地址};
广播该 ARP 请求报文;
/* 此时请求获取'接收端协议地址'对应的硬件地址. */

  • 接受到 ARP 请求报文时.

if(arp_rece.接收端协议地址 == 当前网络接口.协议地址){ 
    arp_rece.接收端硬件地址=当前网络接口.硬件地址.
    op=2; /* arp 应答 */
    swap(arp_rece.发送端硬件地址,arp_rece.接收端硬件地址);
    swap(arp_rece.发送端协议地址,arp_rece.接收端协议地址);
    将 arp_rece 发送到请求方.
}else 丢弃该 ARP 请求报文

ARP 代理

  • 当 ARP 请求是从一个物理网络 N 上的主机 A 发送到另一个物理网络 M 上的主机 B,此时 ARP 请求报文只能在物理网络 N 内广播,不会被转发到物理网络 M 上,所以理论上不应该会收到回应的.

  • 设 C 为链接 N,M 的路由器,若 C 被配置成 ARP 代理,则 C 在收到 ARP 请求报文后,会将自身的硬件地址填入并发送 ARP 应答报文.此时 M,N 可以共用一个子网号(一般情况下,一个子网号中只能容纳一个物理网络).整个过程如下:

    1. 由于 A,D 具有相同的子网号,所以此时 A 准备将 IP 数据包直接传送给 D.即 A 将 (D的协议地址,IP 数据包) 送往网络接口.

    2. 网络接口广播 ARP 请求分组请求得到 D 的硬件地址,此时帧的格式:

ff:ff:ff:ff:ff:ff;A 的硬件地址;ARP;1;0x8000;6;4;1;A 的硬件地址;A 的协议地址;0;D 的协议地址

 3. 路由器 C 收到该 ARP 请求帧,并且 C 已经被配置成 ARP 代理,所以此时 C 用自己的硬件地址来回答,帧的格式:

A 的硬件地址;C 的硬件地址;ARP;1;0x8000;6;4;2;C 的硬件地址;D 的协议地址;A 的硬件地址;A 的协议地址

 4. A 收到了'D 的硬件地址'(实际上是 C 的硬件地址),此时构建数据帧发送 IP 数据包,帧格式:

C 的硬件地址;A 的硬件地址;IP;IP 数据包的内容....

4-5_ARP,RARP

  • 此时在 A 上运行 arp 命令

A$ arp -n
地址                     类型    硬件地址            标志  Mask            接口
10.201.1.62              ether   68:5d:43:f3:c3:e3   C                     eth0
10.201.1.100             ether   f8:0f:41:58:63:fb   C                     eth0
10.201.1.28              ether   18:9e:fc:7a:57:53   C                     eth0
10.201.1.254             ether   00:03:0f:12:c8:00   C                     eth0
10.201.1.107             ether   f8:0f:41:58:63:fb   C                     eth0
# f8:0f:41:58:63:fb 具有2个 IP 地址,所以可以推测出 f8:0f:41:58:63:fb 起着 ARP 代理的功能.

免费 ARP 请求

  • 指主机发送 ARP 查找自己的IP地址,通常,它发生在系统引导期间进行接口配置的时候.此时 ARP 请求分组格式:

1;0x8000;6;4;1;主机的硬件地址;主机的协议地址;0;主机的协议地址.
# 此时接收端协议地址 == 发送端协议地址.

  • 免费 ARP 请求的用途:

    • 一个主机可以通过它来确定另一个主机是否设置了相同的 IP 地址,若主机在发送免费 ARP 请求之后收到了 ARP 应答,则表明另一个主机与当前主机设置了相同的 IP 地址.

    • 用于更新其他主机高速缓存表中相应的表项

RARP

  • 用于将硬件地址转换为协议地址.一般无盘机(没有硬盘的主机)在引导时会发送 RARP 请求报文来获取自身的 IP 地址.

  • RARP 分组格式与 ARP 分组格式相同.见上.

  • 无盘主机广播 RARP 请求报文,此时 RARP 分组格式:

1;0x8000;6;4;3;自身硬件地址;0;0;0 # 注意 RARP 请求时,op==3

  • 由 RARP 服务器负责 RARP 的响应,RARP 响应报文以单播的形式发送,此时 RARP 分组格式:

1;0x8000;6;4;4;RARP 服务器硬件地址;RARP 协议地址;无盘主机硬件地址;无盘主机协议地址



















你可能感兴趣的:(4-5_ARP,RARP)