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应答来解析网络层地址与物理地址之间的映射关系,从而实现数据包的正确传输。
网络知识点整理-ARP、免费ARP
网络知识点整理-ARP、免费ARP1.ARP是什么?地址解析协议ARP是用来将IP地址解析为MAC地址的协议。
在局域网中,当主机或其它三层网络设备有数据要发送给另一台主机或三层网络设备时,它需要知道对方的网络层地址(即IP地址)。
但是仅有IP地址是不够的,因为IP报文必须封装成帧才能通过物理网络发送,因此发送方还需要知道接收方的物理地址(即MAC地址),因此需要一个从IP地址到MAC地址的映射。
ARP即可以实现将IP地址解析为MAC地址。
主机或三层网络设备上会维护一张ARP表,用于存储IP地址和MAC地址的关系。
一般ARP表项包括动态ARP表项和静态ARP表项。
2.动态ARP2.1.原理描述动态ARP表项由ARP协议通过ARP报文(广播ARP请求和单播ARP应答)自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。
动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。
2.2.当需要通信的两台主机处于1)同一网段时,源主机直接发送ARP广播,请求目的主机的MAC地址。
目的主机收到后,单播回复自己IP地址对应的MAC地址的ARP应答报文给源主机,源主机收到ARP应答报文后,将数据报文封装二层帧并发送目的主机。
2)不同网段时,源主机已经配置缺省网关,则会发送ARP广播,请求网关的IP地址对应的MAC地址。
网关收到后,单播回复自己该接口的IP地址对应的MAC地址的ARP应答报文给源主机,源主机收到ARP应答报文后,将数据报文封装二层帧并发给网关,再由网关将数据报文发送给目的主机。
3.ARP请求报文3.1.ARP广播包二层帧中的目的MAC是全F(广播),ARP数据包里面的目的MAC是全0(未知用0表示)。
在eNSP模拟器中抓取的ARP请求ARP数据包里面的目的MAC 可能是全F,与理论不符,抓取物理网卡数据包正常为全0。
3.2.ARP应答报文1)免费ARP报文免费ARP是一种特殊的ARP请求,所以二层帧的目的MAC也是全F,区别在于ARP数据包里面的源和IP目的IP是同一个IP地址。
arp协议
ARP协议概述ARP(Address Resolution Protocol,地址解析协议)是一种网络层协议,用于将IP地址转换为物理地址(MAC地址)。
ARP协议在局域网中用于寻找目标主机的物理地址,以便数据包可以正确地在局域网中传输和交换。
工作原理ARP协议使用一个 ARP 表来存储 IP 地址与 MAC 地址的对应关系。
在发送数据包时,源主机首先检查 ARP 表以查找目标主机的 MAC 地址。
如果目标主机的 MAC 地址存在于 ARP 表中,则源主机直接使用该地址;否则,源主机使用 ARP 协议发送一个 ARP 请求广播,请求目标主机返回自己的 MAC 地址。
ARP消息格式ARP消息包含以下字段:1.硬件类型(Hardware Type):指示帧封装中使用的硬件类型。
以太网使用1作为硬件类型的标识符。
2.协议类型(Protocol Type):指示封装在数据包中的协议类型。
IP协议使用0x0800作为协议类型的标识符。
3.硬件地址长度(Hardware Address Length):指示硬件地址的长度。
对于以太网,MAC地址长度为6字节。
4.协议地址长度(Protocol Address Length):指示协议地址的长度。
对于IP协议,地址长度为4字节。
5.操作码(Operation Code):指示ARP数据包的操作类型,例如请求或响应。
6.发送者的硬件地址(Sender Hardware Address):发送者的MAC地址。
7.发送者的协议地址(Sender Protocol Address):发送者的IP地址。
8.目标的硬件地址(Target Hardware Address):目标的MAC地址。
9.目标的协议地址(Target Protocol Address):目标的IP地址。
ARP请求过程下面是ARP请求过程的具体步骤:1.源主机检查ARP表,查找目标主机的MAC地址。
如果找到了,则使用该地址直接发送数据包。
arp命令的基本用法
arp命令的基本用法ARP(Address Resolution Protocol)命令是用于查询和修改本地主机ARP缓存中的条目的工具。
ARP协议用于将IP地址解析为物理硬件地址(例如MAC地址),以便在网络上进行通信。
基本语法:arp [-a] [-d] [-s [ip地址] [MAC地址]之间的空格] [网卡索引号]ar -d IP地址arp -s IP地址 MAC地址arp -a常见选项:-a:显示当前 ARP 缓存的所有项。
-d:在 ARP 缓存中删除指定的 IP 地址。
-s:添加一个静态 ARP 条目。
IP 地址和 MAC 地址之间用空格隔开。
查询ARP缓存的条目:使用`arp -a`命令可以查询本地主机ARP缓存中的条目。
例如:```C:\> arp -a接口: 192.168.0.1 --- 0xaInternet 地址物理地址类型192.168.0.2 00-50-56-c0-00-08 动态192.168.0.254 00-e0-4c-b7-27-20 动态239.255.255.250 01-00-5e-7f-ff-fa 静态```此命令将打印出当前主机ARP缓存中的所有条目,包括每个条目的IP地址、物理地址和类型(动态还是静态)。
删除ARP缓存中的条目:使用`arp -d IP地址`命令可以删除指定IP地址在ARP缓存中的条目。
例如:```C:\> arp -d 192.168.0.2```此命令将删除ARP缓存中IP地址为192.168.0.2的条目。
添加静态ARP条目:使用`arp -s IP地址 MAC地址`命令可以向ARP缓存中添加一个静态ARP条目。
例如:```C:\> arp -s 192.168.0.100 00-11-22-33-44-55```此命令将向ARP缓存中添加一个静态ARP条目,将IP地址192.168.0.100解析为MAC地址00-11-22-33-44-55。
ARP-Ping局域网探测IP或者MAC是否使用、部署二层特性时方便维护
ARP-Ping局域⽹探测IP或者MAC是否使⽤、部署⼆层特性时⽅便维护ARP简介ARP协议全称为地址解析协议,处于TCP/IP协议族中的链路层。
ARP概述ARP协议是任何以太⽹设备都必须⽀持的协议。
实现三层IP地址与⼆层MAC地址之间的动态映射。
局域⽹中每台主机或路由器都可配置⼀个32位的IP地址,这个地址⽤于该主机的所有通信中。
IP地址的分配是独⽴于机器的硬件地址的。
⽽在以太⽹中,主机或路由器是根据48位的MAC(Medium Access Control)地址来发送、接收以太⽹数据帧的,这个MAC地址⼜称为物理地址或硬件地址,是制造设备时分配到以太⽹接⼝中的。
因⽽,在实际的⽹络互联中,需要⼀种地址解析的机制来为这两种不同的地址形式提供映射。
ARP⽤于将⼀个IP地址映射到正确的MAC地址。
ARP可以分为动态和静态两种类型。
另外ARP还有扩展应⽤功能,包括Proxy ARP功能、免费ARP、ARP与接⼝状态联动以及ARP-Ping。
ARP仅针对IPv4协议,且只能运⾏在以太链路上。
ARP-Ping简介ARP-Ping包括ARP-Ping IP和ARP-Ping MAC,这两者统称为ARP-Ping,⽤于部署⼆层特性时⽅便维护。
ARP-Ping IP简介ARP-Ping IP是利⽤ARP报⽂在局域⽹内探测IP地址是否被其它的设备使⽤的⼀种⽅法。
⽤户对设备配置IP地址前,需要确认该IP地址有没有被⽹络上的其他设备使⽤,可以通过发送ARP报⽂,确认该IP地址的可⽤性,以便调整IP地址的部署策略。
通过ping命令也可以探测该IP地址是否被⽹络上的其他设备使⽤。
但是如果带有防⽕墙功能的⽬的主机和路由器设置了对Ping报⽂不进⾏回复的功能时,就不会响应Ping报⽂,造成该IP没有被使⽤的假象。
由于ARP是⼆层协议,⼤多数情况下可以透过设置了对ping报⽂不进⾏回复的防⽕墙,从⽽避免了此类情况的发⽣。
ARP-Ping IP原理ARP-Ping IP发送的是ARP请求报⽂。
ARP协议
介绍ARP协议的概念和作用ARP(Address Resolution Protocol)是一种网络协议,用于将IP地址(Internet Protocol Address)映射到物理MAC地址(Media Access Control Address)。
在计算机网络中,每个设备都有唯一的MAC地址和IP地址,而ARP协议的作用就是通过查询网络中的其他设备,找到与给定IP地址相对应的MAC地址。
概念ARP协议是在局域网(LAN)中实现IP地址解析的一种协议。
它的工作原理是通过广播消息,在网络中查询与目标IP 地址对应的MAC地址。
当一台设备需要与另一台设备进行通信时,它首先会检查自己的ARP缓存,如果目标IP地址的MAC地址已经存在于缓存中,就可以直接发送数据。
如果目标IP地址的MAC地址不在缓存中,设备将发送一个ARP请求,询问网络中的其他设备:“谁拥有这个IP地址对应的MAC地址?”然后,拥有该IP地址的设备会响应ARP 请求,并将自己的MAC地址发送给请求方,以建立通信。
作用ARP协议在计算机网络中发挥着重要的作用:1.IP地址解析:ARP协议解决了IP地址与MAC地址之间的映射关系,使得设备能够准确地确定通信目标的物理地址。
2.局域网通信:通过ARP协议,设备可以在局域网中直接进行通信,无需经过路由器或网关。
3.提高网络效率:ARP协议能够避免将数据发送到错误的设备,节省了网络带宽和处理资源。
4.动态更新:ARP协议具有动态更新的特性,当设备的IP地址或MAC地址发生变化时,ARP会自动更新与之相关的映射信息,确保通信的准确性。
5.支持多种网络协议:ARP协议可以与其他网络协议相结合,如IPv4、IPv6等,以满足不同网络环境下的需求。
总之,ARP协议在现代计算机网络中扮演着重要的角色,通过IP地址解析和MAC地址映射,实现了设备之间的无缝通信,提高了网络的效率和可靠性。
解释ARP协议的工作原理ARP(Address Resolution Protocol)协议是用于解析IP地址与MAC地址之间映射关系的一种协议。
关于linux双网卡arp响应问题分析
关于linux双网卡arp响应问题分析关于linux 双网卡arp响应问题分析Linux 官方内核自 2.6.4和 2.4.26开始,interface上的arp_announce/arp_ignore系统调用就可用了。
下面是内核文档中关于arp_announce/arp_ignore的描述:arp_announce –INTEGER Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface: 定义不同级别的限制,声明本地IP地址发送ARP 请求的interface: 0 - (default) Use any local address, configured on any interface 0 - (缺省) 使用任何interface上的任何本地地址1 - Try to avoid local addresses that are not in the target's subnet for this interface. This mode is useful when target hosts reachable via this interface require the source IP address in ARP requests to be part of their logical network configured on the receiving interface. When we generate the request we will check all our subnets that include the target IP and will preserve the source address if it is from such subnet. If there is no such subnet we select source address according to the rules for level 2. 1 - 避免这个interface的不在目标子网里的本地地址.当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - Always use the best local address for this target. In this mode we ignore the source address in the IP packet and try to select local address that we prefer for talks with t he target host. Such local address is selected by looking for primary IP addresses on all our subnets on the outgoing interface that include the target IP address. If no suitable local address is found we select the first local address we have on the outgoing interface or on all other interfaces, with thehope we will receive reply for our request and e ven sometimes no matter the source IP address we announce. The max value from conf/{all,interface}/arp_announce is used. Increasing the restriction level gives more chance for receiving answer from the resolved target while decreasing the level announces more valid sender's information.arp_ignore - INTEGER Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses: 为发送ARP 的请求的回应,定义不同的模式,0 - (default): reply for any local target IP address, configured on any interface 0 - (缺省): 回应任何网络接口上对任何本地IP地址的arp查询请求1 - reply only if the target IP address is local address configured on the incoming interface 1 - 仅当目标IP地址是当前收到ARP请求的interface上配置的本地IP时,才回应。
arp响应报文协议格式
arp响应报文协议格式ARP(地址解析协议)响应报文的协议格式如下:1. 硬件类型(Hardware Type),占2个字节,表示网络接口的类型,如以太网是1。
2. 协议类型(Protocol Type),占2个字节,表示上层协议类型,如IPv4是0x0800。
3. 硬件地址长度(Hardware Address Length),占1个字节,表示硬件地址的长度,以字节为单位,如以太网地址长度为6。
4. 协议地址长度(Protocol Address Length),占1个字节,表示协议地址的长度,以字节为单位,如IPv4地址长度为4。
5. 操作码(Opcode),占2个字节,表示ARP报文的操作类型,1表示请求,2表示应答。
6. 发送者硬件地址(Sender Hardware Address),占n个字节,表示发送者的硬件地址,长度由“硬件地址长度”字段决定。
7. 发送者协议地址(Sender Protocol Address),占m个字节,表示发送者的协议地址,长度由“协议地址长度”字段决定。
8. 目标硬件地址(Target Hardware Address),占n个字节,表示目标的硬件地址,长度由“硬件地址长度”字段决定。
9. 目标协议地址(Target Protocol Address),占m个字节,表示目标的协议地址,长度由“协议地址长度”字段决定。
以上是ARP响应报文的协议格式,其中各个字段描述了报文中的不同部分,包括硬件类型、协议类型、地址长度、操作类型以及发送者和目标的地址信息。
这些信息在网络通信中起着重要的作用,用于实现地址解析和通信的正常进行。
希望以上信息能够满足你的需求,如果有其他问题,欢迎继续提问。
uip源码分析
uIP的ARP协议代码分析之一ARP请求(是根据IP地址获取物理地址的一个TCP/IP协议同时将IP地址和硬件地址存入本机ARP缓存中,下次请求时直接查询ARP缓存。
)对于一个设备用的ARP协议而言,重要的东西包括三方面:1.一个本地的IP与MAC地址的缓存表.以有对应的更新和查询操作.2.一个发送ARP请求的函数。
3.一个处理ARP回复的函数.下面我们来看uIP中是如何实现的(代码见uip_arp.c:首先,定义一个缓存表的数据结构,99行起:struct arp_entry {u16_t ipaddr[2];struct uip_eth_addr ethaddr;u8_t time;};只有三个项,很简单第一项是ip地址,16*2=4*8位的,保存四个八位组。
第二项是MAC地址。
第三项是缓存更新时间.下来是ARP请求发送函数:uip_arp.c L325/*-—--—----———-—-———---—-——-—---—-————---—-—-———-————-—---—--——-———-—-——--—---——————-*//*** Prepend Ethernet header to an outbound IP packet and see if we need* to send out an ARP request。
*为传出的IP包添加以太网头并看是否需要发送ARP请求.* This function should be called before sending out an IP packet。
The* function checks the destination IP address of the IP packet to see* what Ethernet MAC address that should be used as a destination MAC* address on the Ethernet.*此函数应该在发送IP包时调用,它会检查IP包的目的IP地址,看看以太网应该使用什么目的MAC地址.* If the destination IP address is in the local network (determined* by logical ANDing of netmask and our IP address), the function* checks the ARP cache to see if an entry for the destination IP* address is found. If so, an Ethernet header is prepended and the* function returns。
ARP协议解释
前言:ARP协议的作用:1. 什么是ARP?ARP (Address Resolution Protocol) 是个地址解析协议。
最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。
2为什么要有ARP?OSI 模式把网络工作分为七层,彼此不直接打交道,只通过接口(layre interface). IP地址在第三层, MAC地址在第二层。
协议在发生数据包时,首先要封装第三层(IP地址)和第二层(MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务。
详细说明:Ø在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
因此在通讯前必须获得目的主机的硬件地址。
ARP协议就起到这个作用Ø当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48位的以太网地址来确定目的接口的,设备驱动程序从不检查IP数据报中的目的IP地址。
ARP(地址解析)模块的功能为这两种不同的地址形式提供映射:32位的IP地址和48位的以太网地址一.ARP报文各字段含义:ARP报文字段总共有28个字节1.硬件类型:占2个字节,表明ARP实现在何种类型的网络上。
Ø值为1:表示以太网。
2.协议类型:占2个字节表示要映射的协议地址类型。
ØIP:08003.硬件地址长度:占1个字节,表示MAC地址长度,其值为6个字节。
4.协议地址长度:占1个字节,表示IP地址长度,此处值4个字节5.操作类型:占2个字节,表示ARP数据包类型。
Ø值为1表示ARP请求。
Ø值2表示ARP应答。
6.源MAC地址:占6个字节,表示发送端MAC地址7.源IP地址:占4个字节,表示发送端IP地址8.目的以太网地址:占6个字节,表示目标设备的MAC物理地址9.目的IP地址:占4个字节,表示目标设备的IP地址.注意:在ARP操作中,有效数据的长度为28个字节,不足以太网的最小长度46字节长度,需要填充字节,填充字节最小长度为18个字节二.ARP请求分组或应答分组以太网首部总共有14字节数据,arp请求报文总共有28字节。
- 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的代码就说到这里,欢迎提问.。