uIP的ARP协议代码分析之二 ARP应答
ARP协议分析

计算机网络实验报告目录实验名称----------------------------------------------------------------------------------- 1 实验目标----------------------------------------------------------------------------------- 1 实验内容----------------------------------------------------------------------------------- 1 实验步骤----------------------------------------------------------------------------------- 1 实验遇到的问题及其解决方法-------------------------------------------------------- 1 实验结论----------------------------------------------------------------------------------- 1一、实验名称ARP协议分析二、实验目标熟悉ARP命令的使用,理解ARP的工作过程,理解ARP报文协议格式。
二、实验内容1.在DOS窗口中运行ARP命令,参照ARP命令给出的帮助,解释下列命令的用途;ARP -s inet_addr eth_addr [if_addr]ARP -d inet_addr [if_addr]ARP -a [inet_addr] [-N if_addr]2.请问你使用什么命令可以查看计算机的IP地址和MAC地址,记录下计算机的IP地址和MAC地址;3.请问你使用什么命令可以查看计算机的ARP缓冲,查看并记录下你当前ARP表的内容;4.请问你使用什么命令可以清空计算机的ARP缓冲,清空ARP缓冲后记录下你当前ARP表的内容;5.Ping A计算机,如果能够Ping通,请查看并记录下你当前ARP表的内容,并找出A计算机地址的解析记录;6.Ping通 ,查看并记录下对应的IP 地址,你当前ARP表的内容,是否能找出对用的IP地址的ARP表中的相应的解析记录,解释为什么;7.在ARP缓冲中添加一条命令关于A计算机的IP地址和00-11-22-33-44-55做一条静态映射,记录下你所使用的命令;记录下你当前ARP表的内容;8.Ping A计算机,是否能够Ping通,为什么?9.清空ARP缓冲,启用网络监视器wireshark10.Ping A计算机,如果能够Ping通,请捕获ARPRequest和Response的相关帧,并解释报文的对应的ARP解析的4个字段(sender hardware、senderinternet、target hardware、target internet)。
ARP命令详解和解决ARP攻击(双向绑定)

ARP命令详解和解决ARP攻击(双向绑定)ARP命令详解和解决ARP攻击(双向绑定)显示和修改“地址解析协议(ARP)”缓存中的项目。
ARP 缓存中包含一个或多个表,它们用于存储IP 地址及其经过解析的以太网或令牌环物理地址。
计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。
如果在没有参数的情况下使用,则arp 命令将显示帮助信息。
语法arp[-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]] [-d InetAddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]]参数-a[ InetAddr] [ -N IfaceAddr]显示所有接口的当前 ARP 缓存表。
要显示特定 IP 地址的 ARP 缓存项,请使用带有 InetAddr 参数的 arp -a,此处的 InetAddr 代表 IP 地址。
如果未指定InetAddr,则使用第一个适用的接口。
要显示特定接口的 ARP 缓存表,请将 -N IfaceAddr 参数与 -a 参数一起使用,此处的 IfaceAddr 代表指派给该接口的 IP 地址。
-N 参数区分大小写。
-g[ InetAddr] [ -N IfaceAddr]与 -a 相同。
-d InetAddr [IfaceAddr]删除指定的 IP 地址项,此处的 InetAddr 代表 IP 地址。
对于指定的接口,要删除表中的某项,请使用IfaceAddr 参数,此处的IfaceAddr 代表指派给该接口的 IP 地址。
要删除所有项,请使用星号(*) 通配符代替 InetAddr。
-s InetAddr EtherAddr [IfaceAddr]向ARP 缓存添加可将IP 地址InetAddr 解析成物理地址EtherAddr 的静态项。
要向指定接口的表添加静态 ARP 缓存项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表指派给该接口的 IP 地址。
网络基础协议之ARP

⽹络基础协议之ARPARP 报⽂格式硬件类型:16位字段,⽤来定义运⾏ARP的⽹络类型。
每个局域⽹基于其类型被指派⼀个整数。
例如:以太⽹的类型为1。
ARP可⽤在任何物理⽹络上。
协议类型:16位字段,⽤来定义使⽤的协议。
例如:对IPv4协议这个字段是0800。
ARP可⽤于任何⾼层协议硬件长度:8位字段,⽤来定义物理地址的长度,以字节为单位。
例如:对于以太⽹的值为6。
协议长度:8位字段,⽤来定义逻辑地址的长度,以字节为单位。
例如:对于IPv4协议的值为4。
操作码:16位字段,⽤来定义报⽂的类型。
已定义的分组类型有两种:ARP请求(1),ARP响应(2)。
源硬件地址:这是⼀个可变长度字段,⽤来定义发送⽅的物理地址。
例如:对于以太⽹这个字段的长度是6字节。
源逻辑地址:这是⼀个可变长度字段,⽤来定义发送⽅的逻辑(IP)地址。
例如:对于IP协议这个字段的长度是4字节。
⽬的硬件地址:这是⼀个可变长度字段,⽤来定义⽬标的物理地址,例如,对以太⽹来说这个字段位6字节。
对于ARP请求报⽂,这个字段为全0,因为发送⽅并不知道⽬标的硬件地址。
⽬的逻辑地址:这是⼀个可变长度字段,⽤来定义⽬标的逻辑(IP)地址,对于IPv4协议这个字段的长度为4个字节。
ARP报⽂总长度⾸先要知道帧的概念,帧是在数据链路层传输的数据格式,⽐如以太⽹v2,以太⽹IEEE802.3和PPP等。
Wireshark抓到的帧是包含帧头的,即包含以太⽹v2的帧头,长14 bytes;⽽ARP数据包的长度固定为28 bytes;正常应⽤数据包帧总长度 = 帧头 + ⽹络层包头 + 传输层报⽂头 + 应⽤数据;⽽ARP请求中ARP包已经是最⾼层,之上没有传输层和应⽤层,所以总长度为:帧总长度 = 帧头 + ARP包头 = 14 + 28 = 42 bytes;⽽真正发包时为了保证以太⽹帧的最⼩帧长为64 bytes,会在报⽂⾥添加⼀个padding字段,⽤来填充数据包⼤⼩。
uIP地址解析协议ARP分析

地址解析协议 ARPuIP是什么?uIP是一款TCP/IP协议套件,该套件为使用者的网络会话提供网络协议栈支持。
我曾尝试将uIP提供的TCP/IP协议栈移植到单片机中,当然在只有单片机而没有网卡(MAC+PHY)的情况下,这项工作是不能完成的。
在做这项工作之前,我也在网络上搜索整理了很多资料,用以充实自己的知识体系。
单方面看,TCP/IP 协议栈是一组纵向生长的协议集合;多方面看,TCP/IP协议栈是实现双方正确,有效交互的一种机制,它实现了等层协议实体之间的透明传输。
而uIP是一款轻型TCP/IP协议栈,设计目标是为无法运行开源或者付费系统的广大接入终端提供一种网络接入交互机制。
鉴于国内几乎没有开发协议栈的工作,而国外一款比较好的协议栈大概在数十万美金,对于国内的很多软件开发,设备生产的公司来说,无疑是有点奢侈,因为我们的设备不需要对网络协议的完全支持。
对接入设备而言,“通道”和对“通道上的流”的规则,是他们的关注重点。
但是,就是这么简单的需求,对网络协议的最小化支持的软件,国内几乎无有。
以单片机为例,一个简单的网络模块就是给单片机外接资源增加一个网络控制器—一般是dm9000X或者marvell等厂家的以太网控制器,通过编程实现网卡驱动后(一般u-boot源码中都提供了这些厂家芯片的裸编程序),封装一个初始化、一个接收和发送接口,就可以同uIP整合,完成运行在单片机上的网络协议处理模块了。
UIP对基本的网络协议支持的比较好,当然一个人不是一个团队,开发协议栈还是相当有挑战性的。
我想将自己调试过程中遇到的问题,以及对uIP为什么这样做的理解,沿着我的思路做一个解说。
笔墨浅显,仅供自己和需要的人参考。
做这一系列的分析,前提需要一个主题框架。
但是一时又想不起来该怎么系统的完成这些任务,所以编边写边看,边看边修改。
二层请求协议:地址解析协议-ARP。
ARP/RARP作为一个二层协议,提供在局域网内请求对端MAC(ARP)地址或者逆向请求对端IP(RARP)地址的协议。
ARP协议

介绍ARP协议的作用和功能ARP(Address Resolution Protocol)是一种用于在IPv4网络中解析IP地址和物理MAC地址之间映射关系的协议。
它在局域网中起着至关重要的作用,使得网络设备能够通过IP地址找到对应的MAC地址,从而实现数据的正确传递。
IP地址和MAC地址在理解ARP协议之前,需要了解IP地址和MAC地址的概念。
IP地址是全球唯一标识网络中设备的地址,它由32位二进制数组成,通常以点分十进制表示(例如:192.168.0.1)。
而MAC地址是网络设备的物理地址,由48位二进制数组成,通常以冒号分隔的十六进制表示(例如:00:1A:2B:3C:4D:5E)。
ARP协议的功能ARP协议的主要功能是将IP地址解析为对应的MAC地址,或者将MAC地址解析为对应的IP地址。
具体来说,ARP 协议提供了以下两个重要的功能:1.地址解析:当一台设备需要与另一台设备通信时,它需要知道目标设备的MAC地址。
通过发送ARP请求广播,源设备可以询问局域网中的所有设备:“谁拥有这个IP地址?”目标设备收到请求后,会回复一个ARP响应,包含自己的MAC地址。
这样,源设备就可以得到目标设备的MAC地址,从而建立通信。
2.地址缓存:为了避免频繁的ARP请求和响应,设备会在本地维护一个ARP缓存表(也称为ARP缓存或ARP表)。
ARP缓存表记录了已解析的IP地址和对应的MAC地址的映射关系。
当设备需要与已知IP地址通信时,它可以直接查找ARP缓存表,而无需发送ARP请求。
如果在ARP缓存表中找不到对应的条目,设备将重新发送ARP请求以更新缓存。
ARP协议的重要性ARP协议在局域网中的作用非常重要。
它使得设备能够通过IP地址进行通信,并且在需要时能够动态地解析IP地址和MAC地址的映射关系。
ARP协议的正常运行对于实现数据包的正确传递和网络通信的顺畅性至关重要。
然而,由于ARP协议的工作机制较为简单,存在一些安全风险,例如ARP欺骗攻击和ARP缓存中毒攻击。
实验2 地址解析协议ARP

1.掌握 ARP 协议的报文格式2.掌握 ARP 协议的工作原理3.理解 ARP 高速缓存的作用4.掌握 ARP 请求和应答的实现方法5.掌握 ARP 缓存表的维护过程2 学时该实验采用网络结构二物理地址是节点的地址,由它所在的局域网或者广域网定义。
物理地址包含在数据链路层的帧中。
物理地址是最低一级的地址。
物理地址的长度和格式是可变的,取决于具体的网络。
以太网使用写在网络接口卡(NIC)上的 6 字节的标识作为物理地址。
物理地址可以是单播地址 (一个接收者) 、多播地址 (一组接收者) 或者广播地址 (由网络中的所有主机接收) 。
有些网络不支持多播或者广播地址,当需要把帧发送给一组主机或者所有主机时,多播地址或者广播地址就需要用单播地址来摹拟。
在互联网的环境中仅使用物理地址是不合适的,因为不同网络可以使用不同的地址格式。
因此,需要一种通用的编址系统,用来惟一地标识每一台主机,而不管底层使用什么样的物理网络。
逻辑地址就是为此目的而设计的。
目前 Internet 上的逻辑地址是 32 位地址,通常称为 IP 地址,可以用来标识连接在 Internet 上的每一台主机。
在 Internet 上没有两个主机具有同样的 IP 地址。
逻辑地址可以是单播地址、多播地址和广播地址。
其中广播地址有一些局限性。
在实验三中将详细介绍这三种类型的地址。
Internet 是由各种各样的物理网络通过使用诸如路由器之类的设备连接在一起组成的。
主机发送一个数据包到另一台主机时可能要经过多种不同的物理网络。
主机和路由器都是在网络层通过逻辑地址来识别的,这个地址是在全世界范围内是惟一的。
然而,数据包是通过物理网络传递的。
在物理网络中,主机和路由器通过其物理地址来识别的,其范围限于本地网络中。
物理地址和逻辑地址是两种不同的标识符。
这就意味着将一个数据包传递到一个主机或者路由器需要进行两级寻址:逻辑地址和物理地址。
需要能将一个逻辑地址映射到相应的物理地址。
实验二、分析ARP及IP协议

【目录】:一、实验目的 (1)三、实验步骤 (1)四、实验后应能回答的问题 (13)【小总结】 (15)实验二:分析ARP及IP协议一、实验目的1.学会使用PacketTracer进行包跟踪及数据包协议格式分析。
2.理解ARP工作机制,熟悉ARP协议格式。
3.熟悉典型的IP协议格式。
4.理解IP分段机制。
二、预计实验学时2学时三、实验步骤1、用PacketTracer(5.3或以上版本)打开文件21_ARP&IP_Testing.pkt.pkt。
注意:R1的S0/3/0的MTU=1420B,其余均为1500B。
2、分析ARP的工作原理。
(1)在Realtime模式下,尽量清除所有设备(PC机及路由器)中的ARP缓存信息,对于不能清除(有些路由器中的ARP缓存信息不能清除)的记录下相关缓存信息。
注:PC机中查看ARP缓存的命令为arp –a,清除ARP缓存的命令为arp –d。
路由器中查看ARP缓存的命令为Router#show arp,清除的命令为Router#clear arp-cache。
(2)在simulation模式下,由PC1向PC2发送一个Ping包,观察包(ICMP及ARP)的传递过程,同时注意相关PC机、路由器的ARP缓存变化情况,记录下相关信息,并对其中的ARP包进行协议格式分析。
注意:在Filter中同时选中ICMP及ARP。
●PC1 会有一个arp包发送到交换机,然后交换机向两边发送arp包●看到arp包中有target mac :0000.0000.0000(48bits) / target IP 为pc2的IP地址●当arp包发送到交换机的时候,点击打开可以看arp包在inbound 和outbound●路由器的arp缓存没有变化.●当arp包发到pc2机的时候,pc2机的arp缓存发生变化,多了一条记录●当arp包从pc2返回到pc1 的时候,pc1的arp缓存中多了一条记录(3)重复(2)一次,观察结果有何不同,分析原因。
arp协议格式

arp协议格式ARP(Address Resolution Protocol)是一种用于在局域网中解析网络层地址(如IP地址)与物理地址(如MAC地址)的协议。
它的主要功能是将网络层地址映射到物理地址,以便在数据包在网络中传输时能够正确地发送到目标设备。
ARP协议的格式如下:1. 硬件类型(2字节):指示网络中使用的硬件类型,如以太网(Ethernet)。
2. 协议类型(2字节):指示网络层使用的协议类型,如IPv4或IPv6。
3. 硬件地址长度(1字节):表示硬件地址的长度,通常是6字节(对应MAC地址的长度)。
4. 协议地址长度(1字节):表示协议地址的长度,通常是4字节(对应IPv4地址的长度)。
5. 操作码(2字节):指示ARP请求或应答的类型,常见的操作码有ARP请求(1)和ARP应答(2)。
6. 发送方硬件地址(6字节):发送ARP请求或应答的设备的物理地址(MAC地址)。
7. 发送方协议地址(4字节):发送ARP请求或应答的设备的网络层地址(如IPv4地址)。
8. 目标硬件地址(6字节):ARP请求中为空,ARP应答中为请求设备的物理地址(MAC地址)。
9. 目标协议地址(4字节):ARP请求中为要解析的目标设备的网络层地址(如IPv4地址),ARP应答中为发送设备的网络层地址(如IPv4地址)。
ARP协议的工作原理是,当一个设备需要发送数据包到一个目标设备时,首先查询本地ARP缓存以查找目标设备的物理地址。
如果缓存中没有目标设备的条目,则发送一个ARP请求广播到局域网中的所有设备,请求目标设备的物理地址。
收到请求的设备会检查请求中的网络层地址,如果匹配则返回一个ARP应答,其中包含自己的物理地址。
发送方设备会将目标设备的物理地址存储在ARP缓存中,以便以后发送数据包时可以直接使用。
总结起来,ARP协议是通过发送ARP请求和接收ARP应答来解析网络层地址与物理地址之间的映射关系,从而实现数据包的正确传输。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARP应答部分代码为uip_arp.c中的void uip_arp_arpin(void)函数.这个函数是在设备接收到ARP包时,由驱动程序调用的.如果收到是ARP包是一个对本地主机上次发送的ARP请求的应答,那么就从包中取得自己想要的主机的MAC地址,加入自己的ARP缓存表中.如果收到是一个ARP请求,那就把自己的MAC地址打包成一个ARP应答,发送给请求的主机. 看代码uip_arp.c的254行:1./*-----------------------------------------------------------------------------------*/2./**3.* ARP processing for incoming ARP packets.4.*对传入的ARP包的处理.5.* This function should be called by the device driver when an ARP6.* packet has been received. The function will act differently7.* depending on the ARP packet type: if it is a reply for a request8.* that we previously sent out, the ARP cache will be filled in with9.* the values from the ARP reply. If the incoming ARP packet is an ARP10.* request for our IP address, an ARP reply packet is created and put11.* into the uip_buf[] buffer.12.*此函数在收到ARP包时由设备驱动调用,函数行为会因包类型而有不同.如果收到的是一个对前先发送的请求的应答13.*则根据应答的值填充缓存.如果传入的包是对我们的IP的请求,则创建一个ARP应答,并放入uip_buf[]中.14.* When the function returns, the value of the global variable uip_len15.* indicates whether the device driver should send out a packet or16.* not. If uip_len is zero, no packet should be sent. If uip_len is17.* non-zero, it contains the length of the outbound packet that is18.* present in the uip_buf[] buffer.19.*函数返回时,全局变量uip_len的值指明了设备驱动要不要发送包.若uip_len为0,则不需发送,若uip_len不是0,20.* 则其值是uip_buf[]中包含的要传出的包的大小.21.* This function expects an ARP packet with a prepended Ethernet22.* header in the uip_buf[] buffer, and the length of the packet in the23.* global variable uip_len.此函数预期中的uip_buf中有一个带以太网头的ARP包.其长度存为uip_len中.24.*/25./*-----------------------------------------------------------------------------------*/26.void27.uip_arp_arpin(void)28.{29.30.if(uip_len < sizeof(struct arp_hdr)) {31.uip_len = 0;32.return;33.}34.uip_len = 0;35.36.switch(BUF->opcode) {37.case HTONS(ARP_REQUEST):38./* ARP request. If it asked for our address, we send out a39.reply. 如果是一个ARP请求,则发送应答.*/40.if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) {41./* First, we register the one who made the request in our ARP42.table, since it is likely that we will do more communication43.with this host in the future.首先,我们将发送请求的主机注册到ARP缓存表中,因为我们很可能要跟它要有更多的交流 */44.uip_arp_update(BUF->sipaddr, &BUF->shwaddr);45.46./* The reply opcode is 2. 应答的操作码为2*/47.BUF->opcode = HTONS(2);48.49.memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);50.memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);51.memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);52.memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);53.54.BUF->dipaddr[0] = BUF->sipaddr[0];55.BUF->dipaddr[1] = BUF->sipaddr[1];56.BUF->sipaddr[0] = uip_hostaddr[0];57.BUF->sipaddr[1] = uip_hostaddr[1];58.59.BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);60.uip_len = sizeof(struct arp_hdr);61.}62.break;63.case HTONS(ARP_REPLY):64./* ARP reply. We insert or update the ARP table if it was meant65.for us. 如果收到的是一个ARP应答,而且也是我们所要的应答的话,就插件并更新ARP缓存表*/66.if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) {67.uip_arp_update(BUF->sipaddr, &BUF->shwaddr);68.}69.break;70.}71.72.return;73.}复制代码这里有一件事是很有意思的,就是说如果某个主机请求得到我们的MAC的地址,我们先把它的MAC地址加入到自己的表中.就好比社交网络中,别人请求加我们为好友,如果我们接收的话,也自动加对方为好友一样.既然对方找上我们了,肯定是要做进一步的交流,互加MAC地址也很自然的.有了上一篇文章,这里似乎不必做过多的解释了.但还是说一下吧,看看我们怎么做应答的. 如果收到了一个请求,我们要做应答:1./* The reply opcode is2. */2.BUF->opcode = HTONS(2);3.4.memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);5.memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);6.memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);7.memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);8.9.BUF->dipaddr[0] = BUF->sipaddr[0];10.BUF->dipaddr[1] = BUF->sipaddr[1];11.BUF->sipaddr[0] = uip_hostaddr[0];12.BUF->sipaddr[1] = uip_hostaddr[1];13.14.BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);15.uip_len = sizeof(struct arp_hdr);复制代码由于请求和应答包很多地方是相同的,如上文中的绿色部分.我们只需将收到的请求稍加修改就可以发送回去了.首先,要改一下MAC地址,四个地方.然后要将目标主机IP设为设为请求包的源主机IP,目的主机IP设为我们的IP.就可以了.另外说下对ARP缓存表的设置:1.这个函数是集插入,更新一体的,有两个参数,IP地址,MAC地址.2.static void3.uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr)4.{5.register struct arp_entry *tabptr;6./* Walk through the ARP mapping table and try to find an entry to7.update. If none is found, the IP -> MAC address mapping is8.inserted in the ARP table. 遍历ARP映射表,看看有没有需要更新的表项,如果没有,就将新的表项插入.*/9.for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {10.11.tabptr = &arp_table[i];12./* Only check those entries that are actually in use. 所谓更新就是传入参数IP在表中己经存在了,这时不需要新建表项,而是要修改己存表项.只查使用中的表项,如果有些表项IP是0,那么就不是使用中的*/13.if(tabptr->ipaddr[0] != 0 &&14.tabptr->ipaddr[1] != 0) {15.16./* Check if the source IP address of the incoming packet matches17.the IP address in this ARP table entry. 看看传入的IP有没有匹配项.*/18.if(ipaddr[0] == tabptr->ipaddr[0] &&19.ipaddr[1] == tabptr->ipaddr[1]) {20.21./* An old entry found, update this and return. 如果有己存的匹配项,修改该项的MAC地址和更新时间.*/22.memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);23.tabptr->time = arptime;24.25.return;26.}27.}28.}29.30./* If we get here, no existing ARP table entry was found, so we31.create one. 如果运行到这里,说明没有己存的表项,则创建一个.*/32.33./* First, we try to find an unused entry in the ARP table. 先看看有没有空表项可用.*/34.for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {35.tabptr = &arp_table[i];36.if(tabptr->ipaddr[0] == 0 &&37.tabptr->ipaddr[1] == 0) {38.break;39.}40.}41.42./* If no unused entry is found, we try to find the oldest entry and43.throw it away. 如果没空表项,就找到一个最旧的表项,扔掉它,换成我们的.*/44.if(i == UIP_ARPTAB_SIZE) {45.tmpage = 0;46.c = 0;47.for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {48.tabptr = &arp_table[i];49.if(arptime - tabptr->time > tmpage) {50.tmpage = arptime - tabptr->time;51.c = i;52.}53.}54.i = c;55.tabptr = &arp_table[i];56.}57. /* Now, i is the ARP table entry which we will fill with the new58. information. 现在i就是我们最终得到的表项,我们把新的信息插入到这里.*/59. memcpy(tabptr->ipaddr, ipaddr, 4);60. memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);61. tabptr->time = arptime;复制代码OK,uip_arp.c中还有两个函数,楼下继续.1.看代码:1./*-----------------------------------------------------------------------------------*/2./**3.* Periodic ARP processing function.4.*ARP周期性处理函数.5.* This function performs periodic timer processing in the ARP module6.* and should be called at regular intervals. The recommended interval7.* is 10 seconds between the calls.8.*此函数在ARP模块中施行周期性处理,它应该每隔一段时间就调用一次.推荐为10秒.9.*/10./*-----------------------------------------------------------------------------------*/11.void12.uip_arp_timer(void)13.{14. struct arp_entry *tabptr;15.16. ++arptime;17. for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {18. tabptr = &arp_table[i];19. if((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 &&20. arptime - tabptr->time >= UIP_ARP_MAXAGE) {21. memset(tabptr->ipaddr, 0, 4);22. }23. }24.}复制代码1.#define UIP_ARP_MAXAGE 120//即20分钟.复制代码从这里可以看出,ARP表项中的更新时间是一个数,每调用一个上面这个函数,这个数就加1. 这个周期性处理函数的作用就是每隔一段时间把超过20分钟都没有更新过的表项扔掉.2.看代码:1./*-----------------------------------------------------------------------------------*/2./**3.* Initialize the ARP module.初始化ARP模块.4.*5.*/6./*-----------------------------------------------------------------------------------*/7.void8.uip_arp_init(void)9.{10.for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {11.memset(arp_table[i].ipaddr, 0, 4);12.}13.}复制代码一目了解,所谓初始化就是把数组中很一个表项都扔掉,清空成0,变成空表项.到这里,并于ARP的代码就说到这里,欢迎提问.。