分享

电脑网络知识:地址解析协议(ARP)的学习

 勤学苦练王中王 2019-04-17

一、物理地址与逻辑地址1.物理地址

物理地址是节点的地址,由它所在的局域网或广域网定义。物理地址包含在数据链路层的帧中。物理地址是最低一级的地址。

物理地址的长度和格式是可变的,取决于具体的网络。以太网使用写在网络接口卡(NIC)上的6字节的标识作为物理地址。

物理地址可以是单播地址(一个接收者)、多播地址(一组接收者)或广播地址(由网络中的所有主机接收)。有些网络不支持多播或广播地址,当需要把帧发送给一组主机或所有主机时,多播地址或广播地址就需要用单播地址来模拟。

2.逻辑地址

在互联网的环境中仅使用物理地址是不合适的,因为不同网络可以使用不同的地址格式。因此,需要一种通用的编址系统,用来惟一地标识每一台主机,而不管底层使用什么样的物理网络。

逻辑地址就是为此目的而设计的。目前Internet上的逻辑地址是32位地址,通常称为IP地址,可以用来标识连接在Internet上的每一台主机。在Internet上没有两个主机具有同样的IP地址。

逻辑地址可以是单播地址、多播地址和广播地址。其中广播地址有一些局限性。在实验三中将详细介绍这三种类型的地址。

二、ARP协议简介

Internet是由各种各样的物理网络通过使用诸如路由器之类的设备连接在一起组成的。主机发送一个数据包到另一台主机时可能要经过多种不同的物理网络。主机和路由器都是在网络层通过逻辑地址来识别的,这个地址是在全世界范围内是惟一的。然而,数据包是通过物理网络传递的。在物理网络中,主机和路由器通过其物理地址来识别的,其范围限于本地网络中。物理地址和逻辑地址是两种不同的标识符。这就意味着将一个数据包传递到一个主机或路由器需要进行两级寻址:逻辑地址和物理地址。需要能将一个逻辑地址映射到相应的物理地址。 ARP协议(地址解析协议)是'Address Resolution Protocol'的缩写。所谓'地址解析'就是主机在发送帧前将目的逻辑地址转换成目的物理地址的过程。在使用TCP/IP协议的以太网中,ARP协议完成将IP地址映射到MAC地址的过程。

三、ARP报文格式

下图为ARP数据报的报文格式:

电脑网络知识:地址解析协议(ARP)的学习

图2-1 ARP报文格式

ARP报文格式具有如下的一些字段:

● 硬件类型:这是16位字段,用来定义运行ARP的网络的类型。每一个局域网基于其类型被指派给一个整数。例如,以太网的硬件类型是1。ARP可用在任何网络上。 ● 协议类型:这是16位字段。用来定义协议的类型。例如,对IPv4协议,这个字段的值是0x0800。ARP可用于任何高层协议。 ● 硬件地址长度:这是一个8位字段,用来定义以字节为单位的物理地址长度。例如,以太网物理地址为6字节,所对应的硬件地址长度值为6。 ● 协议地址长度:标识用于该数据包的逻辑地址的长度,用十进制标识,单位为一个字节,例如,IPv4为4个字节,所对应的协议地址长度值为4。 ● 操作码:这是16位字段,用来定义数据包的类型。已定义了两种类型:为1时表示ARP请求,为2时表示ARP应答。 ● 发送端硬件地址:这是可变长度字段,用来定义发送端的物理地址。对于以太网这个字段是6字节长。 ● 发送端逻辑地址:这是可变长度字段,用来定义发送端的逻辑地址。对于逻辑地址为IP地址的网络,该字段长度为4字节。 ● 目的端硬件地址:这是可变长度字段,用来定义目标的物理地址。对于ARP请求,字段是全0,因为发送端不知道目标的物理地址(该字段长度为可变,如以太网硬件地址为6个字节)。 ● 目的端逻辑地址:这是可变长度字段,用来定义目标的逻辑地址(该字段长度为可变,如IPv4协议的逻辑地址为4个字节)。

四、ARP封装

ARP数据报直接封装在数据链路帧中。例如,在下图中,ARP数据包封装在以太网的帧中。类型字段值为0x0806指出了此帧所携带的数据是ARP数据包。

电脑网络知识:地址解析协议(ARP)的学习

图2-2 ARP数据包的封装

五. ARP的运行过程

数据包传输过程可分为如下步骤:

1. 发送端知道目的端的IP地址。

2. IP要求ARP创建一个ARP请求报文,其中包含了发送方的物理地址、发送方的IP地址和目的端的IP地址。目的端的物理地址用0填充。

3. 将报文传递到数据链路层,并在该层中用发送方的物理地址作为源地址,用物理广播地址作为目的地址,将其封装在一个帧中。

4. 因为该帧中包含了一个广播目的地址,所以同一链路中的每个主机或路由器都接收到这个帧。所有接收到该帧的主机都将其传递到ARP层进行处理。除了目的端主机以外的所有主机都丢弃该报文。

5. 目的端主机用一个包含其物理地址的ARP应答报文做出响应,并对该报文进行单播。

6. 发送方接收到这个应答报文,这样它就知道了目标主机的物理地址。

ARP地址解析过程如下图所示。

电脑网络知识:地址解析协议(ARP)的学习

六、ARP高速缓存

在真正的协议实现中,并不是每次发送IP报文前都需要发送ARP请求报文来获取目的MAC地址。在大多数的系统中都存在着一个ARP缓存表。记录着一段时间内曾经获取过的MAC地址和IP地址的映射关系,如下图所示:

电脑网络知识:地址解析协议(ARP)的学习

图2-4 ARP高速缓存

发送IP数据报前先对ARP缓存表进行查找,查看目的MAC地址是否存在于缓存表中,如果存在,则不需要发送ARP请求报文而直接使用此地址进行IP数据包的发送。如果不存在,则发送ARP请求报文,在收到ARP应答报文之后,使用应答报文中的目的MAC地址发送IP数据包,并将目的MAC地址存于ARP缓存表中供以后使用。

另外,ARP缓存表采用老化机制,在一段时间内如果表中的某一项没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

下图描述了ARP高速缓存的使用与更新过程:

电脑网络知识:地址解析协议(ARP)的学习

图2-5 ARP高速缓存的使用与更新过程

七、代理ARP

代理ARP可用来产生划分子网的效应。如果ARP请求是从一个网络中的主机发往另一个网络中的主机,那么连接这两个网络的路由器就可以回答该请求,当这个路由器收到真正的IP数据包时,它就把该数据包发送给相应的主机或路由器。

例如,在下图所示的网络中,安装在右边主机上的代理ARP应答对目标IP地址为141.23.56.23的ARP请求。

电脑网络知识:地址解析协议(ARP)的学习

图2-6 代理ARP

八、协议栈实现代码解析

本实验将通过对安装目录ExpCNS\work\EXPcns_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.h和netproto_arp_student.c两个文件进行编码,完成协议栈中arp协议的实现。

netproto_arp_student.h文件中定义了arp协议实现相关数值,关键代码如下所示:

电脑网络知识:地址解析协议(ARP)的学习

这段代码定义了8个宏,他们代表的含义如下表所示:

表2-1 netproto_arp_student.h中定义的宏

电脑网络知识:地址解析协议(ARP)的学习

在实验的编码过程中,应该使用这些宏对相应的变量进行赋值。 netproto_arp_student.c文件是协议栈中arp协议的实现部分,其中定义了1个全局数组以及3个函数。下面分别介绍这些协议栈的实现部分。 全局数组netp_arp_table是arp协议的缓存表,拥有NETP_ARP_TABLE_SIZE个netp_arp_table_item元素。其中NETP_ARP_TABLE_SIZE是arp缓存表的条目数,默认值为10,同学们不需要修改。netp_arp_table_item是一个结构体,代表了arp缓存表中的一个条目,包括一个物理地址hardware_addr和一个IP地址ip_address,其定义如下:

电脑网络知识:地址解析协议(ARP)的学习

需要根据arp协议的实现原理编写代码来维护arp缓存表。 函数display_arp_table的功能是显示arp缓存表中的条目,在实验中可以直接调用该函数,便于查看arp缓存表中的内容。 函数netp_arp_output_student的功能是构造并发送一个arp请求数据包。这个函数的编码工作需要由学生完成。 当有数据到达本机网络接口时,函数netp_arp_input_student将被调用,并传递给这个函数原始数据。在本实验中该函数需要完成两个功能,一是处理针对本机的arp请求数据包,二是处理针对本机的arp应答数据包。处理针对本机的arp请求数据包时,应该发送相应的arp应答数据包。处理针对本机的arp应答数据包时,应该更新arp缓存表。这个函数的编码工作需要由学生完成。该函数的返回值为push_to_lwip的枚举类型值,push_to_lwip的定义如下:

电脑网络知识:地址解析协议(ARP)的学习

返回NETP_PUSH_TO_LWIP表示这个数据帧应该提交给协议栈上层继续处理,而返回NETP_NO_PUSH_LIWP则表示不需要提交给协议栈上层处理,本层处理完毕后,这个数据帧将被丢弃。需要根据正确的逻辑关系返回适当的值,使协议栈正常工作。 在编码过程中可能会遇到一些结构体、宏和函数,下表对他们进行介绍:

表2-2 实验涉及的结构体和函数

电脑网络知识:地址解析协议(ARP)的学习

九、各模块推荐流程1.arp请求发送流程 编码实现arp请求数据包发送推荐使用如下流程:

电脑网络知识:地址解析协议(ARP)的学习

图2-7 arp请求数据包发送推荐流程

2. 输入arp数据包处理流程

编码实现处理arp输入数据包推荐使用如下流程:

电脑网络知识:地址解析协议(ARP)的学习

图2-8 处理arp输入数据包推荐流程

【实验步骤】

练习1 领略真实的ARP(同一子网)

各主机打开工具区的'拓扑验证工具',选择相应的网络结构,配置网卡后,进行拓扑验证,如果通过拓扑验证,关闭工具继续进行实验,如果没有通过,请检查网络连接。

本练习将主机A、B、C、D、E、F作为一组进行实验。1.主机A、B、C、D、E、F启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取ARP、ICMP)。2.主机A、B、C、D、E、F在命令行下运行'arp -d'命令,清空ARP高速缓存。3.主机A ping 主机D(172.16.1.4)。 主机B ping 主机C(172.16.1.3)。 主机E ping 主机F(172.16.0.3)。4.主机A、B、C、D、E、F停止捕获数据,并立即在命令行下运行'arp -a'命令察看ARP高速缓存。● ARP高速缓存表由哪几项组成?● 结合协议分析器上采集到的ARP报文和ARP高速缓存表中新增加的条目,简述ARP协议的报文交互过程以及ARP高速缓存表的更新过程。

练习2 编辑并发送ARP报文(同一子网)

本练习将主机A、B、C、D、E、F作为一组进行实验。1.在主机E上启动协议编辑器,并编辑一个ARP请求报文。其中: MAC层: 目的MAC地址:设置为FFFFFF-FFFFFF 源MAC地址:设置为主机E的MAC地址 协议类型或数据长度:0806 ARP层: 发送端硬件地址:设置为主机E的MAC地址 发送端逻辑地址:设置为主机E的IP地址(172.16.0.2) 目的端硬件地址:设置为000000-000000 目的端逻辑地址:设置为主机F的IP地址(172.16.0.3)2.主机A、B、C、D、F启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取ARP协议)。3.主机B、E、F在命令行下运行'arp -d'命令,清空ARP高速缓存。主机E发送已编辑好的ARP报文。4.主机A、B、C、D、F停止捕获数据,分析捕获到的数据,进一步体会ARP报文交互过程。

【思考问题】

1. 哪些主机收到了ARP请求包,哪个主机给出了ARP响应包?2. 主机A、C、D是否收到ARP请求包,为什么?

练习3 跨路由地址解析(不同子网)

本练习将主机A、B、C、D、E、F作为一组进行实验。

1.主机B在命令行方式下输入staticroute_config命令,开启静态路由服务。

2.主机A、B、C、D、E、F在命令行下运行'arp -d'命令,清空ARP高速缓存。

3.主机A、B、C、D、E、F重新启动协议分析器,打开捕获窗口进行数据捕获并设置过 滤条件(提取ARP、ICMP)。

4.主机A ping 主机E(172.16.0.2)。

5.主机A、B、C、D、E、F停止数据捕获,察看协议分析器中采集到的ARP报文,并回答以下问题:

● 单一ARP请求报文是否能够跨越子网进行地址解析?为什么?

● ARP地址解析在跨越子网的通信中所起到的作用?

6.主机B在命令行方式下输入recover_config命令,停止静态路由服务。

【思考问题】

1.哪些主机收到了ARP请求包,哪台主机给出了ARP响应包?

2.比较ARP协议在同网段内解析和跨网段的解析有何异同点?

3.ARP数据包的长度是固定的吗?试加以解释。

4.试解释为什么ARP高速缓存每存入一个项目就要设置10-20分钟的超时计时器。这个时间设置得太大或太小会出现什么问题?

5.至少举出两种不需要发送ARP请求数据包的情况。

练习4 发送ARP请求功能的实现

本练习将主机A、C和D作为一组,主机B、E和F作为一组。现仅以主机A、C、D所在组为例,其它组的操作参考主机A、C、D所在组的操作。实验开始前,先单击'初始环境'。

在实验中,主机A将新接口的IP地址设置为172.16.1.12、主机B使用物理接口2,将新接口的IP设置为172.16.0.11、主机C将新接口的IP地址设置为172.16.1.13、主机D使用处于连接状态的物理接口,将新接口的IP地址设置为172.16.1.14、主机E使用处于连接状态的物理接口,将新接口的IP地址设置为172.16.0.12、主机F将新接口的IP地址设置为172.16.0.13。所有主机使用子网掩码255.255.255.0,默认网关设置为0.0.0.0。

1.所有主机编码实现发送arp请求数据包

(1)各主机打开安装目录ExpCNS\work\EXPcns_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.c文件,在函数netp_arp_output_student内编写实现代码。

(2)参考实验原理arp请求数据包发送推荐流程图给出的流程,分析已经存在的代码。

已经存在的代码定义了一个能容纳arp请求数据包的缓冲区arp_buffer、一个以太网帧头结构变量eth_header和一个arp包头结构变量arp_header、以及将缓冲区数据发送到网络中的实现。

(3)构造、填充以太网数据帧头

构造并填充一个以太网数据帧头。目的MAC地址设置为广播地址即FF-FF-FF-FF-FF-FF。源MAC地址设置为本接口的MAC地址,可以使用netp_current_hw_addr函数获取本接口的MAC地址。协议类型或数据长度字段值应设置为0x0806,表示上层协议为arp协议,可以使用MAC_PROTO_ARP宏。

(4)构造、填充ARP数据包头 构造并填充一个ARP数据包头。ARP数据包头中各字段值的填充如下: 硬件类型值为0x0001,可以使用ARP_HWTYPE_ETH宏。 协议类型值为0x0800,可以使用ARP_PROTOTYPE_IP宏。 硬件地址长度值为0x06,可以使用ARP_HWADDR_LEN_ETH宏。 协议地址长度值为0x04,可以使用ARP_PROTOADDR_LEN_IP宏。 操作码值为0x0001,可以使用ARP_OPCODE_REQUEST宏。 发送端硬件地址值为本接口的MAC地址,可以使用netp_current_hw_addr函数获取本接口的MAC地址。 发送端逻辑地址值为本接口的IP地址,可以使用netp_current_ip_addr函数获取本接口的IP地址。 目的端硬件地址值为0。 主机A使用172.16.1.3作为目的端逻辑地址、主机C使用172.16.1.4作为目的端逻辑地址、主机D使用172.16.1.2作为目的端逻辑地址。 (5)将构造完成的以太网数据帧头和ARP数据包头拷贝到缓冲区。 2.所有主机打开协议分析器,开始捕获数据 3.所有主机调试并运行程序 4.各主机停止数据捕获,观察实验现象 5.参考代码如下:

电脑网络知识:地址解析协议(ARP)的学习

练习5 处理输入的arp数据包功能的实现

本练习将主机A、C和D作为一组,主机B、E和F作为一组。现仅以主机A、C、D所在组为例,其它组的操作参考主机A、C、D所在组的操作。实验开始前,先单击'初始环境'。

该练习需要在前一个练习的基础上进行。

在实验中,主机A将新接口的IP地址设置为172.16.1.12、主机B使用物理接口2,将新接口的IP设置为172.16.0.11、主机C将新接口的IP地址设置为172.16.1.13、主机D使用处于连接状态的物理接口,将新接口的IP地址设置为172.16.1.14、主机E使用处于连接状态的物理接口,将新接口的IP地址设置为172.16.0.12、主机F将新接口的IP地址设置为172.16.0.13。所有主机使用子网掩码255.255.255.0,默认网关设置为0.0.0.0。

1.所有主机编码实现arp数据包的过滤

(1)各主机打开安装目录ExpCNS\work\EXPcns_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.c文件,在函数netp_arp_input_student内编写实现代码,参考实验原理处理arp输入数据包推荐流程图给出的流程,思考代码编写方案。 (2)过滤arp数据包 通过判断以太网帧中的'协议类型或数据长度'字段值是否为0x0806(宏MAC_PROTO_ARP定义该数值)来过滤arp数据包。如果接收到的数据包不是arp数据包,则应该返回NETP_PUSH_TO_LWIP交给协议栈处理。 2.处理arp请求数据包 (1)判断arp类型 通过arp包头中的'操作码'字段的值来判断arp数据包类型,如果该值为0x0001(宏ARP_OPCODE_REQUEST定义了该数值),则这个arp包为arp请求报文,应该返回arp应答数据包。 (2)构造arp应答数据包的以太网帧头 使用已经定义的变量response_eth_header来构造以太网帧头。其中:目的MAC地址为arp请求数据包头中的发送端硬件地址;源MAC地址为本接口的MAC地址;'协议类型与数据长度'字段值为0x0806(宏MAC_PROTO_ARP定义该数值)。 (3)构造arp应答数据包的arp包头 使用已经定义的变量response_arp_header来构造以太网帧头。其中: 硬件类型值为0x0001,可以使用ARP_HWTYPE_ETH宏。 协议类型值为0x0800,可以使用ARP_PROTOTYPE_IP宏。 硬件地址长度值为0x06,可以使用ARP_HWADDR_LEN_ETH宏。 协议地址长度值为0x04,可以使用ARP_PROTOADDR_LEN_IP宏。 操作码值为0x0002,可以使用ARP_OPCODE_RESPONSE宏。 发送端硬件地址值为本接口的MAC地址,可以使用netp_current_hw_addr函数获取本接口的MAC地址。 发送端逻辑地址值为本接口的IP地址,可以使用netp_current_ip_addr函数获取本接口的IP地址。 目的端硬件地址值为arp请求数据包头中的发送端硬件地址。 目的端逻辑地址为arp请求数据包头中的发送端逻辑地址。 3.处理arp应答数据包 (1)判断arp类型 通过arp包头中的'操作码'字段的值来判断arp数据包类型,如果该值为0x0001(宏ARP_OPCODE_REQUEST定义了该数值),则这个arp包为arp请求报文,应该返回arp应答数据包。 (2)判断arp应答数据包是否发送给本接口 判断以太网帧'目的MAC地址'字段值是否为本接口的MAC地址,如果不是则返回NETP_PUSH_TO_LWIP交给协议栈处理。 判断arp应答数据包头中'目的端逻辑地址'字段值是否为本接口的IP地址,如果不是则返回返回NETP_PUSH_TO_LWIP交给协议栈处理。 (3)更新arp缓存表 根据arp应答数据包中的发送端逻辑地址和发送端硬件地址字段的值来更新arp缓存表,arp缓存表是命名为netp_arp_table的一个数组,如果发送端逻辑地址已经在arp缓存表中,则只需要更新相应的MAC地址即可。如果发送端逻辑地址没有在arp缓存表中,则需要在新的位置创建arp缓存表条目,其中ip地址为发送端逻辑地址,MAC地址为发送端硬件地址。 4.主机C和主机D修改练习四编写的程序,将目的端逻辑地址设置为172.16.1.12

5.所有主机打开协议分析器,开始捕获数据6.所有主机调试并运行程序7.各主机停止数据捕获,观察实验现象8.参考代码如下:

电脑网络知识:地址解析协议(ARP)的学习

1

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多