免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 958 | 回复: 0
打印 上一主题 下一主题

ARP协议实现原理(以单片机51为例) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-28 14:01 |只看该作者 |倒序浏览
  ARP是Address Resolution Protocol的缩写。中文译做“地址解析协议”,本质是完成网络地址到物理地址的映射。从概念上讲就是找到一个映射方法f,使得“物理地址 = f(网络地址)”。物理地址有两种基本类型:以太网类型和proNET令牌环网类型,网络地址特指IP地址,对映射方法的要求就是高效。具体到以太网,它使用的是动态绑定转换的方法。为什么不直接使用同一种地址,而要这么麻烦呢?因为TCP/IP网络就是为将不同种类计算机互联而发明的,它的体系结构是分层的,层和层之间相互独立,改变物理层的实现不会影响到网络层。
    32位IP地址到以太网48位物理地址的映射,采用动态绑定转换的方法会遇到许多细节问题,例如:减少广播,ARP包丢失,物理地址变更(更换网卡)、移动(移动设备到另一子网)、消失(关机)等。一般是设置ARP高速缓存,通过学习、老化、更新、溢出算法处理ARP映射表来解决这些问题。其中,学习指ARP收到任何指向本节点IP地址的ARP/IP包,从中提取出地址对,而ARP缓存中无对应项时,由ARP接收部分添加;老化指为每项设置寿命域,以便代谢掉陈旧的地址映射项;更新指ARP提取到新的地址对时,用其更新缓存里已有的对应项;溢出算法指当缓存满时,采取何种方法替换旧有的地址对儿。
    我找到了几个TCP/IP源代码,对比他们的实现,深感差别巨大,灵活多变。有的代码未实现ARP缓存,只用几个全局变量记录源目的IP地址和源目的MAC地址,每次通信前直接操作全局变量,这在使用51单片机,进行点对点通信时不失为一个有效的方案;而有的代码庞大复杂,细节处理精益求精。比如实现了ARP高速缓存、支持多址节点、支持网管查看/动态改变ARP相关参数、重发处理、支持IPv6等。我的看法是:ARP的本质是地址转换,只要抓住这个灵魂,设计的大方向就把握住了。具体实现过程各具特色,因人而异,没有统一要求,有些功能可以不实现,有些优点不能兼得,而唯一不变的只有思想。
    我参考了几种已有的IP协议栈并结合51单片机的特点,实现了自己的基于uCOS51的TCP/IP协议栈方案。它只是一种具体的实现范例,不同的人有不同的设计方法。我保证自己的方案可以正常使用并具有较好的完备性。
   
    ------------------------------
    |状态|寿命ttl|IP地址 |MAC地址|        学习
    ------------------------------
    |  0 |   FF  |X:X:X:X| XXXX  |  
            |       |  学习/更新  |         | | ARP表 |
            ---------             -----------
            |发信号量|  |  收完/收溢出错
            |SemPost |---->-------------- RxSemPost
            ----------  |>
                |       |  发完/发被中断错
                ---------->-------------- TxSemPost
          图5 网卡中断处理程序
         
         
                进入
                 |   ------
                 V   |    |                          发
             ----------   |                       低优先级
     ------> |  等待  |------        |
           |已发了N次吗?|---------->--------
           ---------------       Y
              
              图6 发送流程图
              
              
                                    进入
                                     |   -----
                                     V   |   |                       收
                                -----------  |                    高优先级
             ------------------>|   等待  ||RxSemPend|-    |    |
             |        |      --------------------       |    |
            /|\       |(不执行       | N                |    |
             |        |RxSemPost)    V                  |    |
             |        |         ------------  Y         |    |
             |        |         | 收溢出错 |--->---------    |
             |        |         | ISR之OVW |                 |
             | Y      | N       ------------                 |
        ------------------           | N                     |
        |网卡中还有包吗?|           V                       |
        |  CURR!=BNRY+1  | ------------------------  Y       |
        ------------------ |读出包头,查有无逻辑错|--->-------
               |           ------------------------
              /|\                    | N
               |                     V
               |           ------------------------
           ----------      |按包长度申请合适的大中|
           |释放内存|      |小号内存,并存入整个包|
           ----------      |,再调整BNRY          |
             /^\ /^\       ------------------------
              |   |                  |
              |   |                  V
              |   |   N  ----------------------------
              |   ---=ARPTabSize) index=0;
}
IP_in(*pIP) //IP包过滤(ARP地址学习) 注:这里处理的是IP包,伪代码与上面程序相似,但源代码差别很大。
{
  //更新
  for(i=0;i=ARPTabSize) index=0;
}
timer() //软定时器任务,用于ARP老化
{
  for(;;){
    taskDelay(1秒);
    for(i=0;i

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/50545/showart_472514.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP