ARP协议实现原理

上传人:公**** 文档编号:483604352 上传时间:2023-06-28 格式:DOCX 页数:10 大小:27.74KB
返回 下载 相关 举报
ARP协议实现原理_第1页
第1页 / 共10页
ARP协议实现原理_第2页
第2页 / 共10页
ARP协议实现原理_第3页
第3页 / 共10页
ARP协议实现原理_第4页
第4页 / 共10页
ARP协议实现原理_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《ARP协议实现原理》由会员分享,可在线阅读,更多相关《ARP协议实现原理(10页珍藏版)》请在金锄头文库上搜索。

1、ARP 协议实现原理作者 2002/11/01ARP 是 Address Resolution Protocol 的缩写。中文译做“地址解析协议”,本质是完成网 络地址到物理地址的映射。从概念上讲就是找到一个映射方法f,使得“物理地址=f(网络 地址)”。物理地址有两种基本类型:以太网类型和proNET令牌环网类型,网络地址特指IP 地址,对映射方法的要求就是高效。具体到以太网,它使用的是动态绑定转换的方法。为什 么不直接使用同一种地址,而要这么麻烦呢?因为TCP/IP网络就是为将不同种类计算机互 联而发明的,它的体系结构是分层的,层和层之间相互独立,改变物理层的实现不会影响到 网络层。32

2、位IP地址到以太网48位物理地址的映射,采用动态绑定转换的方法会遇到许多细 节问题,例如:减少广播, ARP 包丢失,物理地址变更(更换网卡)、移动(移动设备到另一 子网)、消失(关机)等。一般是设置ARP高速缓存,通过学习、老化、更新、溢出算法处理 ARP映射表来解决这些问题。其中,学习指ARP收到任何指向本节点IP地址的ARP/IP 包, 从中提取出地址对,而ARP缓存中无对应项时,由ARP接收部分添加;老化指为每项设置 寿命域,以便代谢掉陈旧的地址映射项;更新指ARP提取到新的地址对时,用其更新缓存 里已有的对应项;溢出算法指当缓存满时,采取何种方法替换旧有的地址对儿。我找到了几个TCP

3、/IP源代码,对比他们的实现,深感差别巨大,灵活多变。有的代码 未实现ARP缓存,只用几个全局变量记录源目的IP地址和源目的MAC地址,每次通信前 直接操作全局变量,这在使用 51 单片机,进行点对点通信时不失为一个有效的方案;而有 的代码庞大复杂,细节处理精益求精。比如实现了 ARP高速缓存、支持多址节点、支持网 管查看/动态改变ARP相关参数、重发处理、支持IPv6等。我的看法是:ARP的本质是地 址转换,只要抓住这个灵魂,设计的大方向就把握住了。具体实现过程各具特色,因人而异, 没有统一要求,有些功能可以不实现,有些优点不能兼得,而唯一不变的只有思想。我参考了几种已有的IP协议栈并结合5

4、1单片机的特点,实现了自己的基于UCOS51的 TCP/IP 协议栈方案。它只是一种具体的实现范例,不同的人有不同的设计方法。我保证自 己的方案可以正常使用并具有较好的完备性。1状态1寿命ttllIP地址IMAC地址1学习老化l 0 lFF lX:X:X:Xl XXXX l | | 学习 /更新 | | 1 ARP表IV1 ARP处理丨| | | | V人ARP应答I学习便新III IP_in III图 3 ARP 处理过程0 8 16 24 31I硬件类型I协议类型II硬件地址长度(HLEN )1协议长度(PLEN)I操作II发送方首部(八位组 0-3)II发送方首部(八位组4-5) I 发

5、送方IP地址(八位组0-1) II 发送方IP地址(八位组2-3) I目标首部(八位组0-1) II目标首部(八位组 2-5)I图4 ARP包结构如图3,整个ARP处理过程,我主要用5个函数实现。ARP初始化(ARP_init)、ARP 请求(ARP_request)、ARP 应答(ARP_answer)、ARP 回应处理(ARP_process)、IP 包接收预处 理(IP_in)。在实现网卡驱动程序后,所有ARP处理操作就是填写ARP 包(ARP包结构见图 4),详见伪代码清单。ARP_init完成ARP表初始化,概括说就是ARP表state字段清0。ARP_request完成ARP请求操

6、作。ARP协议要求程序根据子网掩码判断IP地址是否属 于同一子网,如果在同一子网内,ARP请求目的MAC地址,否则请求默认网关MAC地址。ARP_answer比较简单,只要交换ARP请求包地址内容,填写自己的MAC地址和很少 的改动后发送即可。ARP_process完成ARP回应回来的信息处理。主要进行ARP表的学习和更新。IP_in完成IP包接收预处理,用于提取地址映射信息,以便主动学习和及时更新。我的 程序不会主动学习不是发给自己IP地址的MAC地址信息,因为ARP表在51中的容量有 限,只有频繁用到的地址对才应该存放在里面,否则一旦出现“颠簸” ARP表就失效了。有的 ARP 实现方案采

7、用数据驱动方式,参数可配置,使用统一的程序,通过加载不同 的配置数据,执行不同的操作。这样做使程序版本统一,不同的应用只要加载不同的配置数 据即可,不用更换程序,有利于后期维护。但是考虑到51资源紧张和安全性,我的方案只 能显示ARP表不允许修改其内容,用户可发挥想象力在此处增加新功能。另外,ARP程序 应该记住上一次发过的请求,以避免重发,但同样考虑到资源紧张,也免了。其实无所谓, 重发就重发了。表满处理采用有损性能的加速算法,快速有效。另外,本程序不能直接用于 嵌入式网关产品。uCOS51 操作系统本身提供了良好的内存管理功能,我利用它设置了大中小三种缓冲区 存放不同类型的数据包。内存使用

8、前申请,使用后释放,有效利用了资源。系统特点是:1.抢占式优先级;2.消息驱动;3.串行服务器模式。系统优点是:1.等待时不耗费CPU资源;2有超时保护,不会死锁;3思路清晰易懂。系统基于中断驱动,使用Int0做网卡中断输入口。ISR寄存器只用到4 位: OVW收溢 出错/TXE发被中断错/PTX 发送成功/PRX接收成功。TCP/IP协议栈做成任务,脱离内核。 整体框架如图5、6、7所示。主程序框架见伪代码清单(RxSem和TxSem初始化为0)|网卡中断 |V |发信号量| | 收完/收溢出错|SemPost |RxSemPost | 发完/发被中断错 TxSemPost 图5 网卡中断处

9、理程序进入| V | | 发 | 低优先级 | 等待 |-| |TxQPend | | | | | | TxQFIFO 非空 | | | V |-| |-| |数据源 | | 各任务发送来的数据| | 发送包 | | | | | | | | TxQFIFO| V | | | 释放内存 | |(包已存入网卡 RAM 里 )| | | | V | | | | | | 等待|-| (等效发送包被抛弃)| |TxSemPend| | | | | 发完 /超时| | V | | Y |Y-I发送成功吗?丨I重发第n次I丨|(无错且不超时)| n II已发了 N次吗? I Y图 6 发送流程图进入I V

10、I I收 I高优先级|IRxSemPostI I| 等待 |RxSemPend|-|I NV YI 收溢出错 I-I ISR 之 OVW I/A|/A|网卡中还有包吗?| CURR!=BNRY+1I YI读出包头,查有无逻辑错I-|/|释放内存|按包长度申请合适的大中|小号内存,并存入整个包| |,再调整 BNRY|/A /AIIIIIIIIIII|-Y-I是否是发给自己IP地址的包? I| 包分发 |V| ARP| IP_in 过滤VVVICMP(Ping) UDP TCP| | 串行处理| (32bitMCU 可设计成并发模式)图 7 接收流程图我仔细检查了几遍,似乎比较完备了,各种情况下

11、均可以正常工作。在超负荷流量下 只会抛包,不会死机。当然,由于本人接触资料有限和个人局限性,肯定有错误和疏漏之处 希望大家提出意见和建议。伪代码清单:ARP_init() /ARP缓存初始化for(i=0;iARPTabSize;i+)ARPTablei.status=0;ARP_request(目的 IP 地址)/ARP 请求判断IP地址是否属于同一子网的任务交给上层软件处理/(由它决定请求网卡IP地址还是默认网关IP地址), /这有利于减少代码量。/申请小号内存pARP=OSMemGet();/填以太网帧以太网协议=0x0806;/ARP协议目的MAC地址=Oxffff;/广播地址源 MAC 地址=自己的 MAC 地址;/填 ARP 表硬件类型=0x0001;协议类型=0x0800;硬件地址长度=0x06;协议长度=0x04;操作=0x0001;/请求 发送方首部=自己的 MAC 地址; 发送方IP地址=源IP地址; 目标首部=0x0000;目标IP地址=目的IP地址;/填充 PAD 没有内容处填充0;发送ARP包至TxQFIFO缓存OSQSend(QID,*pARP);ARP_answer(*pARP) /ARP 应答学习/更新ARP缓存表;修改收到的ARP包,形成ARP应答/填以太网帧目的MAC地址=对方(网卡

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号