赞
踩
最近很多人发现了,我写了好几篇协议解析文章,但是大部分人都不怎么熟悉以太网点对点协议之pppoe协议讲解、PPTP协议详解及报文解析的协议,从事网络安全开发的,可能常见!今天主要研究ARP协议。
什么是ARP协议
ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。
ARP协议在网络层下面作为OSI网络和OSI链路层之间接口的一部分运行。在通过以太网使用IPv4时使用。
ARP有哪些类型
ARP协议延伸出来的"代理ARP"、“免费ARP”、“RARP”、“IARP”,类型,而这些不同种类的ARP,主要应用在:
代理ARP
代理ARP是一种技术,通过该技术,给定网络上的代理设备可以响应ARP请求以获取不在该网络上的IP地址。代理知道流量目的地的位置,并提供自己的MAC地址作为目的地。
免费ARP
免费ARP几乎就像一个管理程序,是网络上的主机简单地宣布或更新其IP到MAC地址的一种方式。ARP请求不会提示免费ARP将IP地址转换为MAC地址。
RARP
不知道自己IP地址的主机可以使用反向地址解析协议(RARP)进行发现。
IARP
ARP使用IP地址查找MAC地址,而IARP使用MAC地址查找IP地址。
为什么需要ARP
ARP是必需的,因为连接到网络的主机或计算机的软件地址(IP地址)需要转换为硬件地址(MAC地址)。
如果没有ARP协议,则主机将无法找出另一台主机的硬件地址。
ARP工作流程
ARP整个完整交互过程仅需要两个包,一问一答即可搞定! 一个是 ARP 请求过程,一个是 ARP 应答过程。
为了让大家更好的理解ARP协议以及广播和单播的概念,我们来看一下用Wireshark抓取到的真实网络中的ARP过程,通过数据包的方式来呈现。
ARP 请求过程:
当主机PC1想要给主机PC2发送数据时,主机PC1会首先在自己的本地ARP缓存表中检查与主机PC2相匹配的MAC地址。如果主机PC1在自己的缓存表中没找到主机PC2的相关条目,那么它就要想办法获取主机PC2的MAC地址。这就需要将ARP的请求帧广播到本地网络上的所有主机中。
ARP请求包:
在分析 ARP 协议包之前,先介绍一下它的报文格式,以帮助用户更清楚的理解每个包。
以太网头部信息来确定这个数据包是不是一个真的广播数据包。发现这个数据包目的地址是ff:ff:ff:ff:ff:ff,这是一个广播地址,是因为主机 PC2 不知道 PC1 主机的 MAC 地址,说明当前数据包会被广播到当前网段中的所有设备上。而这个数据包中以太网的源地址就是本机的MAC地址。
Hardware type :占2字节,硬件类型,标识链路层协议。
Protocol type: 占2字节,协议类型,标识网络层协。
Hardware size :占1字节,硬件地址大小,标识MAC地址长度,这里是6个字节(48bit)。
Protocol size: 占1字节,协议地址大小,标识IP地址长度,这里是4个字节(32bit)。
Opcode: 占2字节,操作代码,标识ARP数据包类型,1表示请求,2表示回应。
Sender MAC address :占6字节,发送者MAC。
Sender IP address :占4字节,发送者IP。
Target MAC address :占6字节,目标MAC,此处全0表示在请求。
Target IP address: 占4字节,目标IP。
ARP 应答过程:
主机PC2将包含有自己MAC地址的ARP响应消息直接回复给主机PC1(单播)。主机PC1收到从主机PC2发来的ARP响应消息后,会将主机PC2的IP地址和MAC地址添加到自己的ARP缓存表中。接下来,主机PC1就可以向主机PC2发送消息了。
ARP响应包:
arp应答报文和arp请求报文类似。不同的是,此时以太网头部帧头部分的目的MAC地址为发送ARP协议地址解析请求的MAC地址,而源MAC地址为被解析的主机MAC地址。同时操作类型为2表示是应答数据报文。
Hardware type :占2字节,硬件类型,标识链路层协议。
Protocol type: 占2字节,协议类型,标识网络层协。
Hardware size :占1字节,硬件地址大小,标识MAC地址长度,这里是6个字节(48bit)。
Protocol size: 占1字节,协议地址大小,标识IP地址长度,这里是4个字节(32bit)。
Opcode: 占2字节,操作代码,标识ARP数据包类型,1表示请求,2表示回应。
Sender MAC address :占6字节,发送者MAC。
Sender IP address :占4字节,发送者IP。
Target MAC address :占6字节,目标MAC,此处全0表示在请求。
Target IP address: 占4字节,目标IP。
按wireshark格式解析ARP协议:
int main(int argc, char* argv[]) { char errbuf[1024]; pcap_t *desc = 0; char *filename = argv[1]; if (argc != 2) { printf("usage: ./dissect_pppoe [pcap file]\n"); return -1; } printf("ProcessFile: process file: %s\n", filename); if ((desc = pcap_open_offline(filename, errbuf)) == NULL) { printf("pcap_open_offline: %s error!\n", filename); return -1; } pcap_loop(desc, pkt_number, (pcap_handler)ace_pcap_hand, NULL); pcap_close(desc); return 0; }
输出结果:
ARP到底是链路层还是网络层?
这里给一下我的观点,协议到底所属哪一层,ARP协议能获取到MAC信息,服务于链路层,是不是属于链路层?如果往这方面想的话,ARP是链路层。
以太网协议类型0x0800是IP协议,0x0806是ARP协议,都是在一个层面上,IP是网络层,那么ARP认为是网络层。
在《TCP/IP详解卷一》里面就提到了这个问题,感兴趣的小伙伴可以去看看。
总结
在发送数据的时候,只知道目标IP地址,不知道MAC地址,而又不能跨越第二、三层实现通讯,这就需要使用地址解析协议(ARP)。
ARP协议是在RFC826中定义的。RFC是定义各种协议实现标准的官方文档,建议大家在学习网络知识的时候,应当多多参考这些资料,因为它最权威,也最全面。
参考: https://www.rfc-editor.org/info/rfc826
欢迎关注微信公众号【程序猿编码】,需要ARP源代码和报文的添加本人微信号(17865354792)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。