转载:uIP之ARP:地址解析协议

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

第四章 ARP:地址解析协议

虽然数据链路层的第一道关卡是MAC地址,但基于TCP/IP的网络主要使用IP地址来标识主机而不使用MAC地址。比如要连接到别人的电脑或拷贝共享文件,一般会说:“告诉我你电脑的IP”,而不是“告诉我你电脑的MAC”。从以太网帧结构知道,不知道对方网卡的MAC地址是无法正常通讯的,那主机是怎样从IP地址上自动获取到MAC地址呢?这就是这章要讲的“地址解析协议”,以下简称其英文缩写“ARP”。

41 ARP工作原理

从对方的IP地址获取MAC地址最简单的方法是静态映射,即手工建立IP地址和MAC地址的映射表。这种方法必须预先知道每个IP对应的网卡的MAC地址,并写到程序里,发送数据时先搜索这张表,找到IP地址对应的MAC地址。静态映射表内容如下:

表 4-1 静态映射表

IP地址

MAC地址

192.168.1.15

00-0B-6A-8E-3F-C2

192.168.6.82

00-1C-35-27-59-A8

静态映射表有一定的局限性,如:一台电脑换过网卡后,查找得出的MAC地址就不正确,会导致通讯不上;当对方电脑的IP地址改变后,虽然MAC地址没有变,但映射关系变了,静态映射表也必须手工改变。这样,维护一张静态映射表就很费劲。

为了避免手工维护映射表,设计人员使用ARP协议来实现地址的映射,由主机自己智能地维护一张动态映射表。具体是怎样实现地呢?通过图4-1可以形象的说明。假如MCU主机需要与IP为192.168.1.15的主机建立连接,但不知道其MAC地址,于是先在整个网络广播,查询内“192.168.1.15“对应的MAC地址,由于是广播(目的MAC地址是FF-FF-FF-FF-FF-FF),同一网络上的所有主机都收到了这个请求。但只有电脑A应答,因为它的IP就是192.168.1.15。MCU收到电脑A的应答后,将IP和MAC地址存放在动态映射表中,下次连接的时候就能直接查找动态表。

当然,动态映射表中,IP和MAC的映射关系并不是一成不变的,ARP还启动一个定时器,当映射关系存在一定的时间(如1分钟)后,会被清除掉,下次发送数据时还是需要通过ARP请求获取它们的对应关系。这个过程称为ARP表老化。

clip_image002

图4-1 ARP 工作原理

42 ARP分组结构

ARP分组是封装在以太网帧中的数据段中,当以太网帧首部的TYPE段为0806H时,表示后边的数据是ARP分组。如图4-2。

clip_image004

图4-2 ARP 分组的封装

ARP分组的具体结构如图4-3。

0 8 16 24 31

硬件类型

协议类型

硬件长度

协议长度

操作

发送方MAC地址(6字节中的0-3字节)

发送方MAC地址(4-5字节)

发送方IP地址(0-1字节)

发送方IP地址(2-3字节)

接收方MAC地址(0-1字节)

接收方MAC地址(2-5字节)

接收方IP地址(0-3字节)

     

图4-3 ARP 分组的格式

硬件类型:16位,定义运行ARP的物理网络。对以太网来说固定为0001H。还有0002H为实验以太网,0003H为业余无线电,0004H为令牌网等等。

协议类型:16位,定义发送方提供的高层协议类型。对IPV4来说,固定为0800H。

硬件长度:8位,定义物理地址(MAC地址)的长度,以字节为单位,对以太网来说,固定为06H。

协议长度:8位,定义逻辑地址(IP地址)的长度,以字节为单位,对应以太网的IPV4,长度固定为04H。

操作:16位,定义ARP分组是请求还是应答。请求则为01H,应答为02H。

发送方/接收方MAC地址:48位(针对以太网)。

发送方/接收方IP地址:32位(针对以太网)。

了解ARP的分组的格式后,就可以将图4-1 中ARP的工作原理用具体数据来表示,如图4-4。

clip_image006

图4-4 ARP 分组的图例

42 ARP的实现

uIP协议栈实现ARP的文件是Uip_arp.c,包含uip_arp_init(),uip_arp_timer(),uip_arp_update(),uip_arp_arpin(),uip_arp_out()5个函数。

4.2.1 ARP初始化

根据ARP分组的格式,uip头部结构定义如下,为了便于管理,它包含了以太网帧的头部uip_eth_hdr。

struct arp_hdr

{

struct uip_eth_hdr ethhdr; /*以太网首部,14字节*/

u16_t hwtype; /*硬件类型,0x0001*/

u16_t protocol; /*协议类型,0x0800*/

u8_t hwlen; /*硬件长度,0x06*/

u8_t protolen; /*协议长度,0x04*/

u16_t opcode; /*操作码,ARP请求:0x1;ARP应答:0x2*/

struct uip_eth_addr shwaddr; /*发送方MAC地址*/

u16_t sipaddr[2]; /*发送方IP地址*/

struct uip_eth_addr dhwaddr; /*接收方MAC地址*/

u16_t dipaddr[2]; /*接收方IP地址*/

};

前面说过,ARP协议的目的就是主机自动维护一张动态映射表,uIP对动态映射表的结构定义如下:

struct arp_entry

{

u16_t ipaddr[2]; /*IP地址*/

struct uip_eth_addr ethaddr; /*MAC地址*/

u8_t time; /*IP-MAC映射生成时间*/

};

表 4-2 uip的ARP动态映射表

IP地址

MAC地址

映射生成时间

192.168.1.15

00-0B-6A-8E-3F-C2

13

     

可以看到,它比静态映射表多了一项time,主要用来老化ARP表,存放的是一个时间计数arptime,这个计数默认是每10秒加1,写映射关系的时候取当前的arptime值存入time项。ARP动态映射表定义成一个全局变量arp_table ,在单片机的网路设计中,定义如下:static struct arp_entry xdata arp_table[UIP_ARPTAB_SIZE],其最多保存的映射关系是UIP_ARPTAB_SIZE个,默认值是8,可修改。

ARP的初始化函数uip_arp_init()就是将动态映射表arp_table里的IP地址项全部清零。使用的语句是:memset(arp_table[i].ipaddr, 0, 4);

4.2.2 ARP分组的处理

当收到的以太网帧的类型是0x0806时,调用void uip_arp_arpin(void)函数对收到的ARP分组进行处理。其实现流程图见图4-5。其中的更新动态映射表的功能由函数uip_arp_update()完成,流程图见4-6。

clip_image008

图4-5 ARP分组的处理流程图

clip_image010

图4-5 ARP更新动态映射表流程图

4.2.2 ARP动态映射表的老化

函数void uip_arp_timer(void)执行动态映射表的老化功能,这个函数每10秒被调用一次,进入该函数时,时间计数arptime加1,同时与动态映射表里的time项比较,当发现arptime - tabptr->time >= 120时,将该项的IP清零。也就是说,动态映射表里的映射关系在连续20分钟内没有刷新的话将失效。

4.2.2 ARP请求的自动发送

前面的介绍可以知道,本机IP层的发送函数只知道对方IP地址,而不知道对方的MAC地址,按分层的概念,它填充完IP头部的信息后就交给以太网帧处理。以太网帧的头部需要填充目的MAC地址,源MAC地址,类型。其中源MAC地址是本机MAC,类型是IP 0x0800,均已知。目的MAC呢?首先要查动态映射表,找到接收方IP对应的MAC地址填充。若此时动态映射表中没有映射关系,就必须按ARP请求的格式构造一个ARP请求分组发送给本地网路上的所有网络设备,获取到IP对应的MAC地址后才能正常发送。这些功能由void uip_arp_out(void)函数完成。


本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2012/03/28/2421912.html,如需转载请自行联系原作者

相关文章
|
2月前
|
XML 监控 网络协议
云深处绝影四足机器人协议学习解析
本文详细介绍并解析了云深处绝影X20四足机器人的通信协议,包括TCP服务端端口号、基于Service的请求/响应通信机制、通信帧结构、消息类型、常见的通信示例如获取状态和导航请求,以及运动控制的参数和命令。文中还提出了对协议中某些未明确说明或可能存在的问题的疑惑。
30 0
云深处绝影四足机器人协议学习解析
|
11天前
|
域名解析 存储 网络协议
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
本文详细介绍了IP协议报头结构及其各字段的功能,包括版本、首部长度、服务类型、总长度、标识、片偏移、标志、生存时间(TTL)、协议、首部检验和等内容。此外,还探讨了IP地址的网段划分、特殊IP地址的应用场景,以及路由选择的大致流程。最后,文章简要介绍了DNS协议的作用及其发展历史,解释了域名解析系统的工作原理。
47 5
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
|
2月前
|
缓存 网络协议 安全
【网络攻防战】DNS协议的致命弱点:如何利用它们发动悄无声息的网络攻击?
【8月更文挑战第26天】DNS(域名系统)是互联网的关键组件,用于将域名转换为IP地址。然而,DNS协议存在安全漏洞,包括缺乏身份验证机制、缓存中毒风险及放大攻击的可能性。通过具体案例,如DNS缓存中毒和DNS放大攻击,攻击者能够误导用户访问恶意站点或对目标服务器实施DDoS攻击。为了防范这些威胁,可以采用DNSSEC实现数字签名验证、利用加密的DNS服务(如DoH或DoT)、限制DNS服务器响应以及及时更新DNS软件等措施。理解并应对DNS的安全挑战对于确保网络环境的安全至关重要。
74 2
|
6天前
|
前端开发 JavaScript 安全
深入解析 http 协议
HTTP(超文本传输协议)不仅用于传输文本,还支持图片、音频和视频等多种类型的数据。当前广泛使用的版本为 HTTP/1.1。HTTPS 可视为 HTTP 的安全增强版,主要区别在于添加了加密层。HTTP 请求和响应均遵循固定格式,包括请求行/状态行、请求/响应头、空行及消息主体。URL(统一资源定位符)用于标识网络上的资源,其格式包含协议、域名、路径等信息。此外,HTTP 报头提供了附加信息,帮助客户端和服务端更好地处理请求与响应。状态码则用于指示请求结果,如 200 表示成功,404 表示未找到,500 表示服务器内部错误等。
14 0
深入解析 http 协议
|
16天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
48 3
|
21天前
|
消息中间件 安全 Kafka
Kafka支持SSL/TLS协议技术深度解析
SSL(Secure Socket Layer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。这些协议在传输层对网络连接进行加密,确保数据在传输过程中不被窃取或篡改。
40 0
|
2月前
|
域名解析 监控 网络协议
利用DNS协议的弱点
【8月更文挑战第17天】
41 1
|
2月前
|
网络协议 安全 网络安全
ARP协议详解及其工作原理
【8月更文挑战第31天】
46 0
|
2月前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
85 0
|
2月前
|
安全 5G 数据安全/隐私保护

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面