Net/3于ARP和实施密切与路由表相关联的,下图显示了我们的叙述性说明ARP使用样品。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

以下,我们简要概述图中的有关要点。

1.llinfo_arp结构的双向链表包括了每个ARP已知的硬件地址的少量信息。同名全局变量llinfo_arp是该链表的头结点。图中

没有画出第一位la_prev指针指向最后一项,最后一项的la_next指针指向第一项。

该链表由ARP时钟函数每一个5分钟处理一次。

2.每个已知硬件地址的IP地址都相应一个路由表结点(rtentry结构)。

llinfo_arp结构的la_rt指针成员用来指向相应的rtentry

结构。相同地。rtentry结构的rt_llinfo指针成员指向llinfo_arp结构。

3.图中的最左边第四个路由表结点则没有llinfo_arp结构,该结点相应于本地以太网(140.252.13.32)的路由项。该结点的

rt_flags中设置了C比特。表明该结点是被用来复制成其它结点的。

4.rtentry结构中的rt_gateway指针成员指向一个sockaddr_dl结构变量。假设保存物理地址长度的结构sdl_alen成员为6,那么

sockaddr_dl结构就包括对应的硬件地址信息。

5.路由结点变量的rt_ifp成员的相应指针指向相应网络设备接口的ifnet结构。

中间的两个路由结点相应的是以太网上的其它主机,

这两个结点都指向le_softc[0]。而右边的路由结点指向环回结构loif。由于rt_ifp.if_output指向输出函数,所以目的为本地的数据

报被路由至环回接口。

6.每个路由结点还有指向对应的in_ifaddr结构的指针变量。

7.la_hold成员是指向mbuf链表的指针。当要想某个IP传送数据报时,就须要广播一个ARP请求。当内核等待ARP回答时,存

放该待发数据报的mbuf链的头结点的地址信息就存放在la_hold里。当收到ARP回答后,la_hold指向的mbuf链表中的IP数据

被发送出去。

8.路由表结点中rt_metric结构的变量rmx_expire存放的是与相应ARP结点相关的定时信息,用来实现删除超时ARP结点。

下图显示了ARP函数与其它内核函数的关系。

1.ARP结构

在以太网中传送的ARP分组的格式例如以下图所看到的:

结构ether_header定义了以太网帧首部;结构arphdr定义了其后的5个字段,其信息用于在不论什么类型的介质上传送ARP请求

和回答;ether_arp结构除了包括arphdr结构外,还包括源主机和目的主机的地址。

结构arphdr的定义例如以下图所看到的:

下图显示了ether_arp结构的定义。当中包括了arphdr结构、源主机和目的主机的IP地址和硬件地址。

每一个ARP结点中,都有一个llinfo_arp结构,全部这些结构组成的链表的头结点是作为全局变量分配的。我们常常把该链表

称为ARP快速缓存。

该双向链表的前两项是由insque和remque两个函数更新。

2.arpwhohas函数

arpwhohas函数通常由arpresolve调用。用于广播一个ARP请求。

它还可由每一个以太网设备驱动程序调用,在将IP地址赋予

该设备接口时主动发送一个地址联编信息(SIOCSIFADDR)。主动发送地址联编信息不但能够检測在以太网中是否存在IP

地址冲突,并能够使其它机器更新其对应信息(免费ARP)。arpwhohas仅仅是简单调用下arprequest函数。

3.arprequest函数

arprequest函数由arpwhohas函数调用。用于广播一个ARP请求。

该函数建立一个ARP分组。并将它传送到接口的输出函数。

下图显示了该函数建立的两个数据结构mbuf和sockaddr。另外还有两个函数中用到的指针eh和ea。

函数的大概处理流程例如以下:

1.分配和初始化mbuf。分配一个分组数据首部的吗mbuf,并对两个长度字段赋值。

2.初始化指针。给ea和eh两个指针赋值。并将ether_arp结构的值赋值为0。

3.填充以太网帧首部。目的以太网地址设为以太网广播地址。并将以太网帧类型设为ETHERTYPE_ARP。

下图显示了不同

以太网帧类型字段的常量值。

4.填充ARP字段。填充ether_arp的全部字段,除了ARP请求所要询问的目的硬件地址。

5.填充sockaddr。并调用接口输出函数。

接口地址结构的sa_family成员的值设置为AP_UNSPEC。sa_number成员的值

设为16。调用接口输出函数ether_output。

4.arpintr函数

当ether_input函数接收到帧类型字段为ETHERTYPE_ARP的以太网帧时,产生有限级为NETISR_ARP的软件中断,并将

该帧关在ARP输入队列arpintrq的后面。当内核处理该软件中断时,调用arpintr函数。

函数的大概处理流程是:

仅仅有当帧的硬件类型指明为以太网地址,而且帧的长度大于或等于arphdr结构的长度加上两个硬件地址和两个协议地址的

长度时。该帧才干被处理。假设协议地址的类型是ETHERTYPE_IP或ETHERTYPE_IPTRAILERS时,调用in_arpinput函数。

否则该帧被丢弃。

5.in_arpinput函数

该函数由arpintr调用,用于处理接收到的ARP请求/回答。ARP本身的概念比較简单,可是加上很多规则后,实现就比較

复杂。以下来看下两种典型的情况。

1.假设收到了一个针对本机IP地址的请求,则发送一个回答。这是一种普遍情况,非常明显,我们将继续从那个主机收到

数据报。随后也会向它回送报文。所以。假设我们还没有相应它的ARP结点。就应该加入一个ARP结点。由于这时我们

已经知道对方的IP地址和硬件地址。

2.假设收到一个ARP回答,那么此时ARP结点是完整的,因此就知道了对方的硬件地址,该地址存放sockaddr_dl结构中。

全部发往该地址的数据被将被发送。

3.假设其它主机发送一个ARP请求或回答,当中发送方的IP地址与本机同样,那么肯定有一个主机配置有误,Net/3将检測

到该差错,并向管理员等级一个报文。

4.假设主机收到来自其它主机的请求或回答。相应的ARP结点早已存在,但硬件地址发送了变化。那么ARP结点将被更新。

5.主机能够被配置成代理ARPserver。这样的情况下。主机能够代其它主机响应ARP请求。在回答中提供其它主机的硬件地址。

代理ARP回答中相应目的硬件地址的主机必须可以把IP数据报发至ARP请求中指定的目的地址。

该函数的大概流程例如以下:

1.查找匹配的接口和IP地址。搜索本机的Internet地址链表(in_ifaddr结构的链表)。要记住一个接口能够有多个IP地址。

2.验证发送方的硬件地址。

假设发送方的硬件地址等于本机接口的硬件地址。那是由于收到了本机发送的请求。忽略该分组。

假设发送方的硬件地址等于以太网的广播地址,说明出错了。

记录该差错,并丢弃该分组。

3.检查发送方IP地址。

假设发送方IP地址等于本本机正在使用的一个IP地址,在本机系统配置出了差错。

4.在路由表中搜索与发送方IP地址匹配的结点。arplookup函数在ARP快速缓存中查找符合发送方的IP地址。当ARP分组中

目的地址就是本机,总是要穿件ARP结点的。

5.更新已有结点或填充新的结点。仅仅有当下面三个条件为真时,语句才运行:

a.找到一个已有的ARP结点或成功创建一个新的ARP结点。

b.ARP结点指向一个路由表结点。

c.路由表结点的re_gateway字段指向一个sockaddr_dl结构。

6.检查发送方硬件地址是否已改变。假设已经改变。则记录发送方硬件地址,更新近期解析的ARP结点。

7.假设是该ARP操作不是请求。那么丢弃接收到的分组。

8.产生一个相应于ARP请求的回答。仅仅有当下面两种情况时才会产生ARP回答:

a.本机就是该请求所要查找的目的主机。

b.本机是该请求所要查找的目的主机的ARP代理server。

9.用以太网帧首部填充sockaddr。

10.将ARP回答传送至接口输出函数。并返回。

6.ARP定时器函数

ARP结点通常是动态的,须要时创建。超时时自己主动删除。也同意管理员创建永久性结点。

arp_rtrequest函数使arptimer函数第一次被调用。随后arptimer每隔5分钟使自己被调用一次。

arptimer查看ARP结点链表

中的每个结点,假设不是一个永久结点,并且时间已经超时,那么arptfree就删除该结点。

7.arpresolve函数

ether_output函数调用arpresolve函数以获得相应某个IP地址的以太网地址。arpresolve函数利用llinfo_arp结构的la_hold

成员指针“保持”待发IP数据报,并发送一个ARP请求,收到ARP回答后,再将保持的IP数据报发送出去。

ARPresolve应避免ARP洪泛,也就是说。它不应在尚未收到ARP回答时快速反复发送ARP请求,出现这样的情况主要有两个

原因,第一,有多个IP数据报要发往同一个尚未解析硬件地址的主机。第二。一个IP数据报的每一个分片都会作为独立分组

调用ether_output。

Net/3採用下面方法来避免ARP泛洪。

1.Net/3不在同一秒内发送多个相应同一目的地的ARP请求。

2.假设在连续5个ARP请求(也就是5秒钟)后还没有收到回答,路由结点的RTF_REJECT标志置1。实现设为往后的20秒。

这会使ether_output在20秒内拒绝发往该目的地址的IP数据报。

3.20秒后,arpresolve会继续发送该目的主机的ARP请求。

8.arplookup函数

arplookup函数调用选路函数rtalloc1在Internet路由表中查找ARP结点,我们已经看到过3次调用arplookup的情况:

1.在in_arpinput中。在接收到ARP分组后,相应源IP地址查找或创建一个ARP结点。

2.在in_arpinput中,接收到ARP请求后。查看是否存在目的硬件地址的代理ARP结点。

4.在arpresolve中。查找或创建一个相应待发送数据报IP地址的ARP结点。

假设arplookup运行成功,则返回一个指向相应llinfo_arp结构的指针,否则返回一个空指针。

9.arp_rtrequest函数

在ARP中,我们将调用两个路由表函数。
1.arplookup调用rtalloc1查找ARP结点。假设找不到匹配结点,则创建一个新的ARP结点。

2.arptfree以RTM_DELETE命令为參数调用rtrequest。删除相应ARP结点的路由表结点。

此外,arp命令通过发送和接收路由插口上的路由报文来操纵ARP快速缓存。arp以命令RTM_RESOLVE、RTM_DELETE和
RT_GET为參数公布路由信息。前两个參数用于调用rtrequest,第三个參数用于rtalloc1。

最后,当以太网设备驱动程序获得了赋予该接口的IP地址后,rtinit添加一个网路理由,于是rtrequest函数被调用,參数是
RTM_ADD,标志位是RTF_UP和RTF_CLONING。
每个ifaddr结构都有一个指向函数(ifa_rtrequest成员)的指针。该函数在创建或删除一个路由表结点时被自己主动调用,对于
全部的以太网设备,in_ifinit将该指针指向arp_rtrequest函数。因此,当调用路由函数为ARP创建或删除路由表结点时,总是
会调用arp_rtrequest,当随意路由表函数被调用,arp_rtrequest函数的作用是做各种初始化或退出处理所需的工作。比如:
当创建新的ARP结点时,arp_rtrequest内要为llinfo_arp结构分配内存。相同。当路由函数处理完一个RTM_DELETE命令
后,arp_rtrequest这项工作是删除llinfo_arp结构体。

版权声明:本文博主原创文章。博客,未经同意不得转载。

《TCP/IP作品详细解释2:达到》注意事项--ARP:地址解析协议的更多相关文章

  1. 《TCP/IP作品详细解释2:实现》笔记--Radix树路由表

    通过IP完整的路由是路由机制,它通过搜索路由表来确定从哪个分组被发送的接口执行此,它是不一样的路由策略,路由策略 它是一组规则,这些规则可以被用来确定哪些路由编程到路由表,Net/3内核实现的路由机制 ...

  2. 《TCP/IP作品详细解释2:达到》注意事项--IP地址

    1.接口和地址 如下面的图全部本文中讨论的接口和地址的结构看一个示例配置: 上图中显示了我们三个接口样例:以太网接口,SLIP接口和环回接口. 它们都有一个链路层地址作为地址列表中的第一个结点. 显示 ...

  3. TCP/IP超详细总结

    网络的基础知识 一.协议 1.简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词.互联网中常用的具有代表性的协议有IP.TCP.HTTP等.而LAN(局域网)中常用的协议有IPX/SPX” ...

  4. Java——TCP/IP超详细总结

    网络的基础知识 一.协议 1.简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词.互联网中常用的具有代表性的协议有IP.TCP.HTTP等.而LAN(局域网)中常用的协议有IPX/SPX” ...

  5. 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议

    4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络如 ...

  6. TCP/IP详解学习笔记(4)-- ARP 和 RARP

    1.ARP      地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确地址解析协议定其物理地址的一种协议.      在TCP/IP协议中,A ...

  7. iOS中 HTTP/Socket/TCP/IP通信协议具体解释 韩俊强的博客

    简介: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 / ...

  8. MODBUS TCP/IP协议规范详细介绍

    1.该规范的发展概况                                    原始版本1997年9月3日作为公共评论的草案.     再版1999年3月29日,即修订版1.0.     ...

  9. <再看TCP/IP第一卷>关于链路层的知识细节及相关协议

    在TCP/IP协议族中,链路层的主要有三个目的: (1)为IP模块发送和接受数据报 (2)为ARP模块发送ARP请求和接受ARP应答 (3)为RARP发送RARP请求和接受RARP应答 TCP/IP支 ...

随机推荐

  1. Python每隔一秒钟打印当地时间

    import threading,time global t def sayHello(): print time.strftime('%Y-%m-%d %H:%M:%S',time.localtim ...

  2. SPOJ 375(树链剖分)

    题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#problem/I 题意:一棵包含N 个结点的树,每条边都有一个权值, ...

  3. VC6.0入门使用

    软件下载地址 http://pan.baidu.com/s/1qWuqFAO 新建win console 32 project,然后新建header文件.最后新建source cpp文件.如图所看到的

  4. Redis深入之数据结构

    Redis主要数据结构 链表 Redis使用的C语言并没有内置这样的数据结构,所以Redis构建了自己的链表实现.列表键的底层实现之中的一个就是链表,一个列表键包括了数量比較多的元素,列表中包括的元素 ...

  5. 王立平--Failed to push selection: Read-only file system

    往android模拟器导入资源,失败. 提示:仅仅读文件. mnt是仅仅读文件.应点击sdcard.,在导入

  6. 实现Android ListView 自动加载更多内容

    研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...

  7. 【翻译】Why JavaScript Is and Will Continue to Be the First Choice of Programmers

    花费2半小时,那么最终会被翻译.假设有问题,请提出,毕竟,自己的6不超过级别. 附加链接 Why JavaScript Is and Will Continue to Be the First Cho ...

  8. poj2348(博弈)

    poj2348 给定两个数a,b,大的数能减少小的数的倍数,不能是的数小于0,谁先使得数等于0,谁就赢了 有三种情况 ① a % b ==0  这个状态是必胜的 ② a - b < b  这个状 ...

  9. 足球和oracle列(4):巴西惨败于德国,认为,差额RAC拓扑控制!

    足球与oracle系列(4):从巴西慘败于德国,想到,差异的RAC拓扑对照! 前期回想: 本来想说今晚,回头一想,应该是今早第二场半决赛就要开战了!先来回味一下之前的比赛,本届8支小组赛第一名已经所有 ...

  10. Firefox双击关闭标签