首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>系统管理>内核技术>正文

Linux内核ARP的设计实现概述 ZT

http://www.oklinux.cn  2006-07-26  来源: oklinux收集整理  bear10214      会员收藏  游客收藏  【 】 
Linux内核ARP的设计实现概述 ZT

作者: 硅谷农民

ARP (Address Resolution Protocol) 是用来将IP地址转化成机器的网卡物理地址(硬件地址)。
当一台机器要向另外一台物理上相连的机器发送IP包的时候,它要先检查一下自己的ARP缓存,试图找到
对方的硬件地址,如果找不到的话,将要发送的IP包放入等待队列中,接着发出一个ARP请求。等到收到
ARP应答的时候,构造好原来正在等待的IP包的ethernet头部(目的硬件地址,源硬件地址),再将这个
IP包发送出去。
    Linux的ARP实现相当复杂,部分原因是Linux不止要支持ethernet,还要支持其它类型的网络,
另外一部分原因是ARP的实现实际上是和路由处理(routing)相关,所以理解起来不太容易。

    首先我要讲一下ARP函数的调用过程:
    (1) 当系统初始化时,调用arp_init来初始化ARP缓存(arp_tbl),并且注册ARP协议的接收
        函数。
    (2) 当网卡驱动程序收到一个网络包(packet)的时候,会分配一个sk_buff(skb),将数据拷贝进
        这个缓冲区,然后调用netif_rx把skb放入等待队列(input_pkt_queue)中,并且产生一个
        软中断。当系统处理这个软中断的时候,会调用net_rx_action,它根据网络包的类型,
        调用相应的接收函数来处理。如果是ARP包,则调用arp_rcv。
    (3) arp_rcv判断这个arp请求是不是询问本机或者本机代理的硬件地址,如果是的话,调用arp_send
       发回arp应答。另外arp_rcv还尽量保留对方机器的mac addres。
    (4) arp_send分配一个sk_buff(skb),填好arp包的类型,源硬件地址,源IP地址,目的硬件地址,
       目的IP地址,然后调用dev_queue_xmit这个arp包发送出去。

    其次,描述一下ARP主要的数据结构:

    (1) neigh_table
          neigh_table是一个用来描述物理上互相连接的机器的信息的哈希表,ARP缓存arp_tbl 就是
       这样的一个neigh_table。系统中所有的neigh_table都连在一起。下面是一些主要的域:




        +  struct neighbour        *hash_buckets[NEIGH_HASHMASK+1];           
           hash_buckets存放着所有邻居(物理上相连的机器)的信息,共有32个bucket,每一个bucket
           存放着一条neighbor链表。
         
        +  struct pneigh_entry     *phash_buckets[PNEIGH_HASHMASK+1];
           phash_buckets存放着所有proxy arp的entry,每一个entry由网卡设备和ip地址组成,指明
           由哪个网卡设备代理哪个ip的mac地址。共有16个bucket.
            
        +  int                     family;      网络类型,为AF_INET
           int                     entry_size;  大小为sizeof(struct neighbour) + 4
           int                     key_len;     键的长度,为4
        
        +  __u32                   (*hash)(const void *pkey, const struct net_device *);
           int                     (*constructor)(struct neighbour *);
           int                     (*pconstructor)(struct pneigh_entry *);
           这几个分别是ARP的哈希函数,neighbour和pneigh_entry的构造函数,

        +  struct neigh_parms      parms;
           ARP缓存的一些参数,包括ARP包传输时间,重发时间,队列长度和代理队列长度等等。

        +  int                     gc_interval;
           int                     gc_thresh1;
           int                     gc_thresh2;
           int                     gc_thresh3;
           unsigned long           last_flush;
           struct timer_list       gc_timer;
           ARP缓存有一个回收机制(garbage collection),这些参数用来设置回收的频率
           和阀值等等。

        +  struct sk_buff_head     proxy_queue;
           有时proxy arp并不马上发回应答,那么就将arp包暂时放在这个队列里。

    (2) neighbour
          neighbour包含了邻居(物理上互相连接的机器)的信息,以下是它只要的域:

        +  struct net_device   *dev;
           与邻居相连的网络设备(网卡)。

        +  __u8           nud_state;
           neighbour的状态,包括NUD_INCOMPLETE(未完成),NUD_REACHABLE(无法访问),
           NUD_STALE(过时)和NUD_FAILED(失败)等等。

        +  unsigned char  ha[(MAX_ADDR_LEN+sizeof(unsigned long)-1)&~(sizeof(unsigned long)-1)];
           邻居的硬件地址。
           
        +  struct hh_cache         *hh;
           ethernet包的头部缓存,用来加快往邻居发送的速度。Linux提高效率的努力可见一斑 :-) 。

        +  struct sk_buff_head     arp_queue;
           等待这个邻居的硬件地址的IP包队列。

        +  struct neigh_ops        *ops;
           对neighbour操作的一套函数指针。有点像c++类的成员函数。

        +  u8     primary_key[0];
           哈希表的主键,一般是IP地址。

上一篇:KGDB源码级的内核调试   下一篇:升级Linux内核奋斗记


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·升级Linux内核奋斗记
·KGDB源码级的内核调试
·linux 内核版本号
·最新Linux内核:更好的Wi-Fi和文件系统
·Linux 内核解读入门
·求教
·在 iSeries 和 pSeries 上将 Linux 内核从 2.4 迁移到
·linux内核源码目录结构
·Linux 2.6 内核的嵌入式系统应用
·Linux环境进程间通信:信号灯
·linux内核防synflood
·Linux环境进程间通信: 管道及有名管道
·Linux 内核中的 Device Mapper 机制
·小鸟学飞
·Linux 2.6内核中新的锁机制--RCU
·netfilter:Linux 防火墙在内核中的实现
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Linux系统下内核定时器的用法
·学习园地:Linux系统内核中判断大小的
·系统编译:如何给Make命令来传递参数
·Linux 2.6内核中sysfs文件系统简单概述
·Fedora 8 Linux系统的内核配置注意事项
·升级Linux内核的一般步骤方法
·Linux发行版知识普及:三个版本的CPUID
·编译安装Virtualbox驱动模块
· Linux系统的内核解读入门
·新手学堂 Linux系统的内核解读入门
·Linux系统内核中网络参数的意义及其应
·走向Linux系统高手之路 内核编译过程解
  阅读排行
· 深入理解LINUX内核中文版下载地址
·基于S3C44B0微处理器的uClinux内核引导
·Kernel command using Linux system ca
·Linux 2.6内核如何武装Fedora Core 2
·Process priority and control on AIX
·Linux操作系统的内核编译内幕详解
·推荐:Linux用户态与内核态的交互
·通过振动向Linux ThinkPad传输信息
·Linux操作系统源代码详细分析(二)
·Linux系统内核接收以太帧的处理程序
·Linux and symmetric multiprocessing
·主流嵌入式Linux系统下GUI解决方案
·揭秘Linux内核调试器之内幕
·用命令行加挂Linux的文件系统简介
·Linux内核和核心OS组件的测试与分析
网摘收藏: