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

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

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

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

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结构体。

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

时间: 2024-10-19 09:29:13

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

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

简介: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 // 7. 物理层 // TCP/IP, 由美国国防部制定 // 1. 应用层, HTTP, FTP, SMTP, DNS // 2. 传输层, TCP, UDP // 3. 网络层, IP // 4. 链路层, ARP, RARP // HTTP(短连接) // 1. 建立链接, 三次握手 // 2

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

1.该规范的发展概况 原始版本1997年9月3日作为公共评论的草案. 再版1999年3月29日,即修订版1.0. 没有大的技术改动,仅作了补充说明.增加了附录A和B作为对一些常用执行问题的回应. 该Modbus/TCP规范在万维网上公开发行.它表明开发者的意愿是把它作为工业自动化领域具有互用性的标准. 既然MODBUS和MODBUS/TCP作为事实上的"实际"标准,而且很多生产商已经实现了它的功能,此规范主要是阐述在互连网上具有普遍可用性的基于TCP通讯协议的MODBUS报文的特殊编码

tcp/ip协议学习 第四章 ARP:地址解析协议

派猴子来的救兵 关于ARP的RFC文档在此! ARP干嘛的 曾经有段时间, 六七年前了吧. 本科的时候, 流行了一阵子ARP病毒攻击, 导致整个局域网都不能上网了. 当时只听说这个东西防不住, 只要有一个人中毒, 就导致所有人上不了网. 现在也终于知道这是怎么回事了, 也能手工让某个同学上不了网了, 咳咳. 大家应该也都知道ARP是干嘛的, 我再啰嗦一下.. 比如我访问了百度, 百度回了包给我, 百度只知道我的IP是什么,不知道我的MAC地址. 这个包到网关的时候, IP这一层再把数据交给下一层

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

在TCP/IP协议族中,链路层的主要有三个目的: (1)为IP模块发送和接受数据报 (2)为ARP模块发送ARP请求和接受ARP应答 (3)为RARP发送RARP请求和接受RARP应答 TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件,如以太网,令牌环网,FDDI,及RS-232串行线等. 两个串行接口链路层协议: SLIP:(Serial Line IP)它是一种在串行线路上对IP数据报进行封装的简单形式,SLIP适合用于家庭中每台计算机及都有的RS-232串行端口和告诉调制解调

《TCP/IP详解卷2:实现》笔记--ARP:地址解析协议

Net/3中ARP的实现是和路由表紧密关联的,下图显示了我们描述ARP要用到的一个例子. 下面,我们简要概述图中的有关要点. 1.llinfo_arp结构的双向链表包含了每一个ARP已知的硬件地址的少量信息.同名全局变量llinfo_arp是该链表的头结点,图中 没有画出第一位la_prev指针指向最后一项,最后一项的la_next指针指向第一项.该链表由ARP时钟函数每个5分钟处理一次. 2.每一个已知硬件地址的IP地址都对应一个路由表结点(rtentry结构).llinfo_arp结构的la

TCP/IP 原理 --ARP:地址解析协议

ARP:ARP为 IP地址到对应的硬件地址之间提供动态映射.我们之所以用动态这个词是因为这个过程是自动完成的, 一般应用程序用户或系统管理员不必关心. ARP分组格式: 1.硬件类型:硬件地址的类型.1表示以太网地址:协议类型表示要映射的协议地址(IP地址)类型,它的值为0 x 0 8 0 0即表示I P地址. 2.接下来的硬件地址长度:6字节,其指的就是MAC地址:协议地址长度:4字节,其指的是IP地址长度. 3.op指的是操作字段.四种类型:ARP请求(1).ARP应答(2).RARP请求(

TCP/IP、UDP、HTTP、SPDY等的一些解释说明

文章大部分内容均是来自于网络和相关的官方文档,仅作整理和总结. 在理解这些名词以及他们之间的关系之前,有必要先理解下OSI模型.OSI七层模型详解 简单的用下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP.SMTP.SNMP.FTP.Telnet.SIP.SSH.NFS.RTSP.XMPP.Whois.ENRP 6 表示层 例如XDR.ASN.1.SMB.AFP.NCP 5 会话层 例如ASAP.TLS.SSH.ISO 8327 / CCITT

图解TCP/IP第五版 -- 文件夹

非常多年前买过<TCP/IP具体解释>3卷,当时可能根本没看,也可能是看了又忘了,没有留下什么印象,当时的书也当做废品卖了. 卖书时的感觉貌似是.买了太多的书,基本都没看,搬家搬来搬去的麻烦,不如从网上看些资料来的直接.三箱子书都卖了.有非常多书都是当年颇有名的,书的范围也非常广. 单说语言层面,事实上当时没有理解语言的精髓,甚至把开发工具的熟练使用当做学会语言.如今还记得的,买过的有各种<开发者指南>:Delphi.C++Builder.VB.ASP.JBuilder.C#:如今

关于TCP/IP协议栈(转)

1. TCP/IP协议栈 与OSI参考模型不同,TCP/IP协议栈共有4层,其中网络接口层对应OSI中的物理层和数据链路层,应用层对应OSI中的应用层.表示层和会话层. 在网络接口层的主要协议有:ARP.RARP等.ARP协议主要功能是根据IP地址获取物理地址,RARP协议则反之. 网络层的主要协议有:IP.路由协议(RIP.OSPF.BGP等).IP协议为网络上的每台主机编号,在此基础上才有路由协议,因此路由协议是基于IP协议的. 传输层的主要协议有:TCP.UDP.传输层有端口号的概念,端口