ARP协议浅析(1):缘起

ARP协议浅析(1):缘起

下一章:ARP协议浅析(2):协议分析

(关心技术的朋友可以跳过)

朝花夕拾

一直想写一个局域网IP查看工具,用来查询一个局域网的以使用的IP地址。毕业一年多了,仍然牵挂着这个网络小工具。当时由于水平有限未能完成,8月底正好有这个时间,于是花了一个星期的时间,终于完成了。其间的一些体会写出来和大家分享。此文适合于对TCP/IP协议有所了解和具有一定编程基础的朋友。

IP地址冲突

2002年笔者所在宿舍楼开通校园网,大家无比兴奋,但是很快烦恼就来了。笔者所在宿舍楼共6层,计算机多达400多台(可能还要多一些),而只分配了一个CIP段,254IP地址,IP地址太少了,IP地址冲突非常激烈。

“瓜分之”

最初大家很早起床打开计算机来占住IP地址,那时候晚上是停电的。所以每天IP地址都要在早上重新被“瓜分”。有个哥们每天早上起来推电闸,搞得大家觉都睡得不好。僧多粥少,实属无奈。

宿舍里有好几台电脑,于是先占住IP的同志有义务为后面的同志提供查询义务,随便设置一个IP,可能别人已经使用了。好在Window2000可以动态该IP地址,无需重启。WinXP更强,修复一下可以恢复过来。Win98就没有这么幸运,经常被冲突死机,于是那个时候Win98就被大家无情的抛弃了。问题是:你可以改动IP设置,但是你并不知道那些IP没有被其他机器使用。

那个时候,经常你下网不到一分钟就会被别人占住IP地址。如果是网络游戏,就惨了,装备

捡不到,还可能被别的玩家砍死。不过笔者不玩网游,所以体会不到他们的痛苦。

寻找空闲IP

Ping命令是一个最常见的工具。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方面的程序,多线程也很弱。但当时就想写一个工具,苦于知识经验缺乏,以后有机会要写一个类似的小工具。

峰回路转

大概3个月后,学校调查后采取了措施,扩大了IP的范围,几乎每台一个IP。问题不复存在了,想编写一个IP-MAC查询的工具的念头从此沉底。

旧“情”复燃

之后又发生了很多情。考程序员,做毕业设计,工作,再换工作从机械设计回到软件开发。加班,学习,学习,加班日子过得真快。

《深入浅出MFC》《Windows核心编程》《Windows网络编程技术》看了很长时间了,渐渐的领悟了一些东西,多线程也没有那么惧怕了。特别是有个项目涉及到了UDP多点传输,当时把socket深入的看了几章,调试了几个这个方面的程序,对这个模型熟悉起来。感觉有足够的知识来写这个东西了。

现在终于有了时间,也感觉自己有这个实力了,但还没有想到具体怎么写?到网上搜所(在前人的基础上有所超越),于是找到了几篇关于ARP的文章,下面的两篇是其一。同时也开始接触Row Socket(原始套接字),研究Sniffer(嗅探器)。当时想,Ping的时候,如果不知道相应的IP地址的MAC地址该如何处理,只能还是回到ARP协议,对了上层协议必须建立在下层协议的基础上工作!Row Socket虽然原始,却只能到网络层,而ARP协议在链路层工作,因为在网线或设备识别的只能是MAC地址,同时它不是物理层。

WinPcap利器

武侠世界盛传:“真气所至,草木皆为利器”。

在查找Row Socket资料时,发现了WinPcap库,得知一些网络工具是基于它开发的,于是着手研究WinPcap库。通过阅读帮助文档和练习里面的例子,逐渐对它有了深入认识。它经封装了对设备的操作,可以直接发送链路层的包。其实,只要你了解了各种包格式,你就可以实现ISO/OSI的各个协议层的功能!OKWinPcap能够实现ARP协议的应用,剩下的就是设计编码。

真气是ARP工作原理和流程,草木就是具体程序的代码。当然没有必要从头做起,利用成熟的库可以事半功倍。

实践

WinPcap的参考帮助文档是Web格式的,没有索引(不如MSDN方便)

笔者也没有彻底研究,涉及到的代码,有较为详细的注释。

首先参考了《手把手教你玩转ARP》,作者提供了详细的代码,讲的也很详细,于是没有花多少时间就看明白了。但是作者的工程是用VS2003写的,但没有说在哪个Window版本上通过,估计上Win2000,转换到VC6的工程后,在WinXP上却没有提到的arp缓冲条目增加的情况。

这个问题困扰了两天,最后发现之前下载的文章《详谈调用WinPcap驱动写arp多功能工具》有收发arp包的功能。这个例子离笔者的需要很近。该代码是console工程,必须改造成MFC App。这倒不是很难。简单的设计了界面,具体实现需要的就是时间。

前后用了一个星期,利用别人的间隙时间使用电脑,着实不方便。中间还有几个细节问题,最后还是完成了,感觉不错。

 

下一章:ARP协议浅析(2):协议分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值