计算机网路实验5地址解析协议ARPWord格式文档下载.docx
- 文档编号:17377657
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:17
- 大小:251.72KB
计算机网路实验5地址解析协议ARPWord格式文档下载.docx
《计算机网路实验5地址解析协议ARPWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机网路实验5地址解析协议ARPWord格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
有些网络不支持多播或广播地址,当需要把帧发送给一组主机或所有主机时,多播地址或广播地址就需要用单播地址来模拟。
逻辑地址
在互联网的环境中仅使用物理地址是不合适的,因为不同网络可以使用不同的地址格式。
因此,需要一种通用的编址系统,用来惟一地标识每一台主机,而不管底层使用什么样的物理网络。
逻辑地址就是为此目的而设计的。
目前Internet上的逻辑地址是32位地址,通常称为IP地址,可以用来标识连接在Internet上的每一台主机。
在Internet上没有两个主机具有同样的IP地址。
逻辑地址可以是单播地址、多播地址和广播地址。
其中广播地址有一些局限性。
在实验三中将详细介绍这三种类型的地址。
二.ARP协议简介
Internet是由各种各样的物理网络通过使用诸如路由器之类的设备连接在一起组成的。
主机发送一个数据包到另一台主机时可能要经过多种不同的物理网络。
主机和路由器都是在网络层通过逻辑地址来识别的,这个地址是在全世界范围内是惟一的。
然而,数据包是通过物理网络传递的。
在物理网络中,主机和路由器通过其物理地址来识别的,其范围限于本地网络中。
物理地址和逻辑地址是两种不同的标识符。
这就意味着将一个数据包传递到一个主机或路由器需要进行两级寻址:
逻辑地址和物理地址。
需要能将一个逻辑地址映射到相应的物理地址。
ARP协议(地址解析协议)是“AddressResolutionProtocol”的缩写。
所谓“地址解析”就是主机在发送帧前将目的逻辑地址转换成目的物理地址的过程。
在使用TCP/IP协议的以太网中,ARP协议完成将IP地址映射到MAC地址的过程。
三.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数据包。
图2-2
ARP数据包的封装
五.ARP的运行过程
数据包传输过程可分为如下步骤:
发送端知道目的端的IP地址。
IP要求ARP创建一个ARP请求报文,其中包含了发送方的物理地址、发送方的IP地址和目的端的IP地址。
目的端的物理地址用0填充。
将报文传递到数据链路层,并在该层中用发送方的物理地址作为源地址,用物理广播地址作为目的地址,将其封装在一个帧中。
因为该帧中包含了一个广播目的地址,所以同一链路中的每个主机或路由器都接收到这个帧。
所有接收到该帧的主机都将其传递到ARP层进行处理。
除了目的端主机以外的所有主机都丢弃该报文。
目的端主机用一个包含其物理地址的ARP应答报文做出响应,并对该报文进行单播。
6.
发送方接收到这个应答报文,这样它就知道了目标主机的物理地址。
ARP地址解析过程如下图所示。
图2-3
ARP地址解析过程
六.ARP高速缓存
在真正的协议实现中,并不是每次发送IP报文前都需要发送ARP请求报文来获取目的MAC地址。
在大多数的系统中都存在着一个ARP缓存表。
记录着一段时间内曾经获取过的MAC地址和IP地址的映射关系,如下图所示:
图2-4
ARP高速缓存
发送IP数据报前先对ARP缓存表进行查找,查看目的MAC地址是否存在于缓存表中,如果存在,则不需要发送ARP请求报文而直接使用此地址进行IP数据包的发送。
如果不存在,则发送ARP请求报文,在收到ARP应答报文之后,使用应答报文中的目的MAC地址发送IP数据包,并将目的MAC地址存于ARP缓存表中供以后使用。
另外,ARP缓存表采用老化机制,在一段时间内如果表中的某一项没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
下图描述了ARP高速缓存的使用与更新过程:
图2-5
ARP高速缓存的使用与更新过程
七.代理ARP
代理ARP可用来产生划分子网的效应。
如果ARP请求是从一个网络中的主机发往另一个网络中的主机,那么连接这两个网络的路由器就可以回答该请求,当这个路由器收到真正的IP数据包时,它就把该数据包发送给相应的主机或路由器。
例如,在下图所示的网络中,安装在右边主机上的代理ARP应答对目标IP地址为141.23.56.23的ARP请求。
图2-6
代理ARP
八.协议栈实现代码解析
本实验将通过对netproto_arp_student.h和netproto_arp_student.c两个文件进行编码,完成协议栈中arp协议的实现。
netproto_arp_student.h文件中定义了arp协议实现相关数值,关键代码如下所示:
这段代码定义了8个宏,他们代表的含义如下表所示:
表2-1
netproto_arp_student.h中定义的宏
在实验的编码过程中,应该使用这些宏对相应的变量进行赋值。
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缓存表。
函数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的定义如下:
返回NETP_PUSH_TO_LWIP表示这个数据帧应该提交给协议栈上层继续处理,而返回NETP_NO_PUSH_LIWP则表示不需要提交给协议栈上层处理,本层处理完毕后,这个数据帧将被丢弃。
需要根据正确的逻辑关系返回适当的值,使协议栈正常工作。
在编码过程中可能会遇到一些结构体、宏和函数,下表对他们进行介绍:
表2-2
实验涉及的结构体和函数
九.各模块推荐流程
arp请求发送流程
编码实现arp请求数据包发送推荐使用如下流程:
图2-7
arp请求数据包发送推荐流程
输入arp数据包处理流程
编码实现处理arp输入数据包推荐使用如下流程:
图2-8
处理arp输入数据包推荐流程
【实验步骤】
练习1领略真实的ARP(同一子网)
各主机打开协议分析器,进入相应的网络结构并验证网络拓扑的正确性,如果通过拓扑验证,关闭协议分析器继续进行实验,如果没有通过拓扑验证,请检查网络连接。
本练习将主机A、B、C、D、E、F作为一组进行实验。
主机A、B、C、D、E、F启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取ARP、ICMP)。
主机A、B、C、D、E、F在命令行下运行“arp-d”命令,清空ARP高速缓存。
主机Aping主机D(172.16.1.4)。
主机Eping主机F(172.16.0.3)。
主机A、B、C、D、E、F停止捕获数据,并立即在命令行下运行“arp-a”命令察看ARP高速缓存。
ARP高速缓存表由哪几项组成?
结合协议分析器上采集到的ARP报文和ARP高速缓存表中新增加的条目,简述ARP协议的报文交互过程以及ARP高速缓存表的更新过程。
练习2编辑并发送ARP报文(同一子网)
在主机E上启动协议编辑器,并编辑一个ARP请求报文。
其中:
MAC层:
目的MAC地址:
设置为FFFFFF-FFFFFF
源MAC地址:
设置为主机E的MAC地址
协议类型或数据长度:
0806
ARP层:
发送端硬件地址:
发送端逻辑地址:
设置为主机E的IP地址(172.16.0.2)
目的端硬件地址:
设置为000000-000000
目的端逻辑地址:
设置为主机F的IP地址(172.16.0.3)
主机B、F启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取ARP协议)。
主机B、E、F在命令行下运行“arp-d”命令,清空ARP高速缓存。
主机E发送已编辑好的ARP报文。
主机B、F停止捕获数据,分析捕获到的数据,进一步体会ARP报文交互过程。
练习3跨路由地址解析(不同子网)
主机B在命令行方式下输入staticroute_config命令,开启静态路由服务。
主机A、B、C、D、E、F重新启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取ARP、ICMP)。
主机Aping主机E(172.16.0.2)。
主机A、B、C、D、E、F停止数据捕获,察看协议分析器中采集到的ARP报文,并回答以下问题:
单一ARP请求报文是否能够跨越子网进行地址解析?
为什么?
ARP地址解析在跨越子网的通信中所起到的作用?
主机B在命令行方式下输入recover_config命令,停止静态路由服务。
练习4发送arp请求功能的实现
本练习将主机A、B和C作为一组,主机D、E和F作为一组。
现仅以主机A、B、C所在组为例,其它组的操作参考主机A、B、C所在组的操作。
在实验中,主机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。
所有主机编码实现发送arp请求数据包
(1)各主机打开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数据包头拷贝到缓冲区。
所有主机打开协议分析器,开始捕获数据
所有主机调试并运行程序
各主机停止数据捕获,观察实验现象
参考代码如下:
练习5处理输入的arp数据包功能的实现
该练习需要在前一个练习的基础上进行。
所有主机编码实现arp数据包的过滤
(1)各主机打开netproto_arp_student.c文件,在函数netp_arp_input_student内编写实现代码,参考实验原理处理arp输入数据包推荐流程图给出的流程,思考代码编写方案。
(2)过滤arp数据包
通过判断以太网帧中的“协议类型或数据长度”字段值是否为0x0806(宏MAC_PROTO_ARP定义该数值)来过滤arp数据包。
如果接收到的数据包不是arp数据包,则应该返回NETP_PUSH_TO_LWIP交给协议栈处理。
处理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来构造以太网帧头。
操作码值为0x0002,可以使用ARP_OPCODE_RESPONSE宏。
目的端硬件地址值为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地址为发送端硬件地址。
主机C和主机D修改练习四编写的程序,将目的端逻辑地址设置为172.16.1.12
7.
8.
【思考问题】
练习2
哪些主机收到了ARP请求包,哪个主机给出了ARP响应包?
主机A、C、D是否收到ARP请求包,为什么?
练习3
哪些主机收到了ARP请求包,哪台主机给出了ARP响应包?
比较ARP协议在同网段内解析和跨网段的解析有何异同点?
ARP数据包的长度是固定的吗?
试加以解释。
试解释为什么ARP高速缓存每存入一个项目就要设置10-20分钟的超时计时器。
这个时间设置得太大或太小会出现什么问题?
至少举出两种不需要发送ARP请求数据包的情况。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网路实验5 地址解析协议ARP 计算机 网路 实验 地址 解析 协议 ARP