网络安全 频道

TCP/IP researching之ARP协议浅析

 在大学就一直想写一个局域网IP查看工具,用来查询一个局域网的以使用的IP地址。毕业一年多了,这个网络小工具也没能有时间写。当时由于水平有限未能完成,8月底正好有这个时间,于是花了一个星期的时间来做这件事,最后终于完成了。其间的一些体会写出来和大家分享。此文适合于对TCP/IP协议有所了解和具有一定编程基础的朋友。  非技术篇(关心技术的朋友直接跳过) 一、为什么要写这个东西?

        大三下学期时宿舍楼通校园网了,大家是无比的兴奋,但是很快问题就来了。我所在的宿舍楼里,有6层,计算机多达400多台(可能还要多一些),而只分配了一个C类IP段,254个IP地址,网关占一个,所以IP争夺是无法避免了。大家的苦恼都来源于此,而故事就此开始了。

笔者看过一些网络方面的书,所以知道一些做法。第一个办法是很早起来占住一个IP(晚上熄灯)。那么之后的人要面对的问题是:你可以改动IP设置,但是你并不知道那些IP没有被其他机器使用。Window2000可以动态该IP地址,无需重启,WinXP更强,修复一下可以恢复过来。当然要手工操作,有时候你突然死机在重启,IP就不再属于你了!哈哈,你就晕吧!

 

当然可以通过别的方式来查看这个情况Ping命令是一个,还有一些类似的工具。Ping命令不太可靠,一个一个的Ping,很浪费时间,没有时效性。而且后来天网防火墙等软件可以设置不响应。所以这个办法行不通了,看着别人上网,自己设置一个IP冲突一个,真是郁闷。要是有个东西可以准确的查看局域网的IP使用情况该多好啊!当时在网上搜索了很久,发现了一个基于UDP协议的查看IP的程序,还有源代码。效果改观了很多,它使用一个独立的线程发送,利用socket接受,缺憾是天网可以屏蔽它。当时开始思考这个问题,每台机器的唯一不变的是网卡的物理地址即Mac地址,局域网到底是用什么机制来实现IP地址到Mac的映射了,这可是通信的基本的问题!因为对网络协议感兴趣的原因,后来查阅很多种资料,包括RFC的英文文档,用代理在国外的找的,该文档介绍各种于网络相关的标准,有各种协议的规范。我知道了一些ARP(Address Resolution Protocol,地址解析协议)的知识,后面介绍这个协议。

 

不多久,真的出现了这么一个小软件。据说是这栋楼的一个VC高手写的,看到这个东西的只需要输入一个查询范围如202.4.151.1-202.4.151.254它就会快速的查询IP地址的使用情况。当时看不到源代码,佩服了半天。有一点可以肯定,它使用的是ARP协议,用到了多线程。当时仅仅是知道一些网络协议,没有编过Winsock方面的程序,多线程也很弱。所以写不出来,但当时就想,以后有机会要写一个类似的小工具。

 

二、作手准备

        时光飞逝,之后考程序员,做毕业设计,工作,再换工作…从机械设计回到软件开发。加班,学习,学习,加班…日子过得真快。后来终于又休息了。《深入浅出MFC》《Windows核心编程》《Windows网络编程技术》看了很长时间了,渐渐的领悟了一些东西,多线程也熟悉了不少。特别是有个项目涉及到了UDP多点传输,当时把Socket深入的看了一些,调试了几个这个示例程序,对这个Socket模型熟悉起来。感觉有足够的知识来写这个东西了。

但我还没有想到具体的思路,于是到网上搜索(在前人的基础上有所超越,而不是作重复的事情),找到了几篇关于ARP的文章,下面的引用到的两篇是其中的。同时也开始接触row socket(原始套接字),研究sniffer(嗅探器)。当时考虑到,Ping的时候,如果不知道相应的IP地址的MAC地址该如何处理,只能回到ARP协议,对了上层协议必须建立在下层协议的基础上工作! Row socket虽然原始,却只能到网络层,而ARP协议在链路层工作,因为在网线或设备识别的只能是MAC地址,同时它不是物理层。此时正好在看Winpcap包帮助文档,它里面已经封装了对设备的操作,它可以直接发送链路层的包。用它可以发送所有的上层的包,而网络协议本身最后传送的包,最后都会包装层底层包。说白了,只要你了解了各种包格式,你就可以实现ISO/OSI的各个协议层的功能!OK,这个东西能够满足要求,Winpcap也了解不少了,可以动手了。

 

三、编码

        Winpcap的使用请参考帮助文档,Web格式的,没有索引(MSDN有)。内容不多,知识却不少。笔者也没有彻底研究,涉及到的代码,有较为详细的注释。首先参考了《手把手教你玩转ARP》,作者提供了详细的代码,讲的也很详细,于是没有花多少时间就看明白了。但是作者的工程是用VS2003写的,但没有说在哪个Window版本上通过,估计上Win2000,转换到VC6的工程后,在WinXP上却没有出现提到的arp缓冲条目增加的情况。这个问题困扰了两天,最后发现之前下载的文章《详谈调用winpcap驱动写arp多功能工具》有收发arp包的功能。离我的需要很近了。该代码是console工程,必须改造成MFC App。这倒不是很难。简单的设计了界面,具体实现的时候有些问题费了些时间。前后用了一个星期,没有自己的电脑进度慢了很多。

以上算是心得,具体程序的实现在技术篇细细道来。好吧,技术篇!!

言归正传,书回正题!

  技术篇 ARP协议介绍 原理方面的内容整理出自《手把手教你玩转ARP 工作原理

以太网设备比如网卡都有自己全球优异的MAC地址,它们是以MAC地址来传输以太网数据包的,它们不可能识别IP包中的IP地址,实际上网卡把受到的包提交到协议栈的缓冲,成为链路层包,再分离出IP层的包,再分离出TCP或UDP…。就像剥开竹笋,发送包则是相反的过程。

我们在以太网中进行IP通信的时候需要一个协议来建立IP地址与MAC地址的对应关系,以使IP数据包能发到一个确定的地方去。这就是ARP(Address Resolution Protocol,地址解析协议)

讲到此处,我们可以在命令行窗口中,输入      arp –a

来看一下效果,类似于这样的条目

210.118.45.100    00-0b-5f-e6-c5-d7    dynamic

就是我们电脑里存储的关于IP地址与MAC地址的对应关系,dynamic表示是临时存储在ARP缓存中的条目,过一段时间就会超时被删除(具体时间不同操作系统不同)

这样一来,比如我们的电脑要和一台机器比如210.118.45.1通信的时候,它会首先去检查arp缓存,查找是否有对应的arp条目,如果没有,它就会给这个以太网络发ARP请求包广播询问210.118.45.1的对应MAC地址,当然,网络中每台电脑都会收到这个请求包,但是它们发现210.118.45.1并非自己,就不会做出相应,而210.118.45.1就会给我们的电脑回复一个ARP应答包,告诉我们它的MAC地址是xx-xx-xx-xx-xx-xx,于是我们电脑的ARP缓存就会相应刷新,多了这么一条:

210.118.45.1   xx-xx-xx-xx-xx-xx   dynamic

为什么要有这么一个ARP缓存呢,试想一下如果没有缓存,我们每发一个IP包都要发个广播查询地址,岂不是又浪费带宽又浪费资源?

      我们的网络设备无法识别ARP包的真伪,而且也不能识别,基本的约定都是假的,会带来灾难。如果我们按照ARP的格式来发送数据包,只要信息有效计算机就会根据包中的内容做相应的反应。        这也是以太网可靠通信的基础,但是如果我能操纵网卡设备发送数据和掌握包的格式,我可以做一些欺骗和捣乱。当然,笔者只是理论分析,并不提倡读者这么做。   ARP包的格式

一个ARP包是分为两个部分的,前面一个是物理帧头或EtherHeader,后面一个才是ARP帧或Arp-Frame

       首先,物理帧头,它将存在于任何一个协议数据包的前面,我们称之为DLC Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的物理地址,以便硬件设备识别。

DLC Header

字段

长度(Byte)

默认值

备注

接收方MAC

6

 

广播时,为 ff-ff-ff-ff-ff-ff

发送方MAC

6

 

 

Ethertype

2

0x0806

0x0806是ARP帧的类型值

  图1 物理帧头格式        图1是需要我们填充的物理帧头的格式,我们可以看到需要我们填充的仅仅是发送端和接收端的物理地址罢了,是不是很简单呢?        接下来我们看一下ARP帧的格式.

ARP Frame

字段

长度(Byte)

默认值

备注

硬件类型

 

http://netadmin.77169.com/HTML/20060610151416.html

0
相关文章