《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_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.主机可以被配置成代理ARP服务器,这种情况下,主机可以代其他主机响应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代理服务器。

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-12-22 14:05:35

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

《TCP/IP详解卷1:协议》第14章 DNS:域名系统---读书笔记

<TCP/IP详解卷1:协议>第14章 DNS:域名系统---读书笔记 1.引言 5.指针查询 DNS中一直难于理解的部分就是指针查询方式,即给定一个IP地址,返回与该地址对应的域名. 当一个组织加入Internet,并获得DNS域名空间的授权,如noao.edu,则它们也获得了对应IP地址的in-addr.arpa域名空间的授权.在noao.edu这个例子中,它的网络号是140.252的B类网络.在DNS树中结点in-addr.arpa的下一级必须是该IP地址的第一字节(例中为140),再下

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 1.引言 具有本地磁盘的系统引导

《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 1.引言 IP是TCP/IP协议族中最核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输.IP提供不可靠.无连接的数据报传送服务. (1)不可靠 它不能保证IP数据报能成功地到达目的地.IP仅提供最好的传输服务.如果发生某种错误,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端.

《TCP/IP详解卷2:实现》笔记--IP的分片和重装

IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0,:比特1是"不分片"(DF)标志:比特2是"更多分片"(MF)标志. Net/3中,标志和偏移字段结合起来,由ip_off访问,如下图所示: ip_off的其他13bit指出在原始数据报内分片的位置,以8字节为单位计算.因此,除最后一个分片外,其他的分片都希望是一个 8

《TCP/IP详解卷2:实现》笔记--域和协议

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Net/3组把协议关联到一个域,并且用一个协议族常量来标识每个域.Net/3还通过所有的编址方法将协议分组.在一个域中</span> 的每个协议使用同类地址,并且每种地址只被一个域使用.作为结果,一个域能通过它的协议族或地址族常量唯一标识. 下图是是我们讨论的协议和常量. 1

《TCP/IP详解卷2:实现》笔记--IP编址

1.接口和地址 在本文中讨论的所有接口和地址结构的一个例子配置如下图所示: 上图中显示了我们三个接口例子:以太网接口,SLIP接口和环回接口.它们都有一个链路层地址作为地址列表中的第一个结点. 显示的以太网接口有两个IP地址,SLIP接口有一个IP地址,并且环回接口有一个IP地址和一个OSI地址. 所有的IP地址都被链接到in_ifaddr列表中,并且所有链路层地址能从ifnet_addrs数组访问. 后面的部分讨论上图的数据结构以及用来查看和修改这些结构的IP专用ioctl命令. 2.sock

《TCP/IP详解卷2:实现》笔记--接口层

提示:该实验所在的平台是在RedHat 6下 该实验成功的前提有三个: (1):windows能ping通linux系统 (2):关闭linux的防火墙 :执行指令 /etc/init.d/iptables  stop (3):让SeLinux关闭  :执行指令:  setenforce permissive 补充: SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.SELinux 是一个

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协