ARP协议学习小结——协议简介和图形化工具SendARP

sparrow1
发表于:2003-12-21 21:40 回复
发帖: 52
积分: 0
注册: 2003-10-26
  在进入正文之前,首先要感谢一些前辈,他们的文章和话语,都给了我很大的帮助,所以我将感谢放在了文章最前面。

1、Douglas E. Comer ——《用TCP/IP进行网际互连》
  这是我的唯一一本参考书,一本通俗易懂的好书。

2、SendARP.c
  这是一个linux下发送ARP包的程序源码,在网上广为流传,很抱歉,无法查到其作者。

3、HiHint —— IPMan
  一位老前辈在98年写的运行于Win95环境下对以太网卡直接进行读写的DOS命令行程序,虽然实现方法已经不太一样,但是我在开发过程中依然从他那里获得了许多指点。

4、Refdom —— 交换网络中的嗅探和ARP欺骗 (http://www.xfocus.net/articles/200204/377.html)
  安全焦点的一位前辈,他的这篇文章指引我实现具体的ARP包发送。








  最近倍感堕落,于是找了点时间学习ARP协议,并写了一个相关的工具——SendARP,还写了这样一篇文档,文档分为两部分,前一部分是ARP协议的简介,后一部分是工具SendARP的使用文档。

  如果你已经了解ARP协议,可以跳过这篇文档的前半部分,直接去看后面的程序文档,不过如果你有空的话,还是帮我看看,看看我是否描述清楚了,有没有什么错误,以便我尽快修正,在此提前表示感谢。

  先来介绍一下ARP协议吧,不过……由于个人水平问题,下面的文章可能枯燥乏味、难以理解,而且你可能看着看着就会骂我,为什么不举一个例子呢?放心,坚持看下去,例子在后面。实在挺不住的时候一定告诉我,让我们一起来让这篇文档变得通俗易懂。

  首先引出两位主角,它们是计算机A和计算机B,它们连接到同一个Hub或者switch,属于同一个局域网,他们各自的网络硬件设备(一般为网卡)的物理地址(也称为硬件地址、MAC地址)分别为Pa和Pb,并且给他们各自的网络连接分配了IP地址(也可以称为网络地址、协议地址),分别为Ia和Ib。或者我给几个具体值吧,这样方便理解。

机器名 物理地址(硬件地址、MAC地址) IP地址(网络地址、协议地址)
A 11-22-33-44-55-66 192.168.0.10
B aa-bb-cc-dd-ee-ff 192.168.0.20


  当一台计算机要和另外一台计算机进行网络通讯时,我们一般认为,仅仅只需要知道对方计算机的IP地址和相对应的端口号就可以了。但是,这些都是在网络层才提供的概念,再往下走呢?最终,在底层通信时还是要知道对方计算机的物理地址,因为网络硬件设备只能识别物理地址。你或许要问那为什么不都用物理地址呢,那是因为物理地址很复杂,而且对于每个硬件设备来说是固定的,不像IP地址那样简洁、易组织。

  假设此时机器A要向机器B发送数据包,但是机器A只知道机器B的IP地址Ib,不知道机器B的物理地址,那么如何由这个IP地址,得到机器B的物理地址Pb呢?

  于是就有了ARP协议……

  ARP,全名为 An Ethernet Address Resolution Protocol,以太网上的地址转换协议,通过遵循该协议,只要我们知道了某台机器的IP地址,即可以知道其物理地址。

  下面我将根据ARP协议描述一下机器A和机器B的交流过程:
1、机器A说:“有程序叫我给机器B发送数据,但是他们只告诉了我机器B的IP地址,可以我和机器B联系是通过物理地址的呀。嗯……如果广播数据包的话,那么机器B就可以收到了,不过如果我每个数据包都广播的话,那不是很猪头!还是得想办法知道机器B的物理地址,这样我直接联系她。对了!据说有一个ARP协议可以帮助我,嗯,让我来试一下。”

2、按照ARP协议规定的格式,机器A构造一个数据包,其中包含机器B的IP地址Ib,我们称之为请求包,然后将其广播出去。附带说一下,这里面还包含着机器A自己的IP地址和物理地址,先埋下一个伏笔。

3、机器A说:“这个包已经广播出去了,现在就等着机器B回应我了……”

4、这个局域网内所有机器都收到了这个广播的请求包,并且都对这个包进行了检查,不过绝大部分机器发现包中所提到的IP地址Ib和自己的IP地址不一样,于是就将这个包丢弃了。

5、只有一台机器发现包中的IP地址和自己的IP地址一样,这台机器就是传说中的机器B……

6、机器B说:“有个猪头广播了一个ARP请求包,里面提到了我的IP地址,他大概是想和我单独联系,但是不知道我的物理地址吧,所以才广播的……那好!我就给他一次和我说话的机会吧,我先把物理地址告诉他吧”

7、于是机器B也根据ARP协议构造了另外一个数据包,其中包含自己的物理地址Pb,我们称之为应答包,并打算将该应答包发送给机器A。

8、机器B说:“怎么把这个应答包发送给A呢?学它的,继续广播?不行,我怎么能够和他一样猪头呢!再检查一下他给我的请求包,也许可以找出什么信息来……Search……Search……Search……找到了,这里放着他的IP地址和物理地址呢!好,就用这个物理地址和他联系吧。”

9、于是机器B将刚刚构造的应答包发送出去了……过一下就到了机器A那里。

10、机器A说:“谢天谢地!经过漫长的等待,终于接到了回应了,嗯,这个包果然是机器B发给我的,对,也从里面读到了机器B的物理地址,好,以后我就用这个物理地址和机器B单独联系了……”

  插几句话,机器A和机器B虽然很想单独联系,但是不是他们想就可以办到的,还要看底层的物理设备,如果他们都连接到同一个Hub上,那么他们注定是没有秘密可言的了,因为Hub对于所有的数据包都会往所有端口发送。有没有一种设备不这么猪头呢?有,那就是传说中的switch,switch会在每台机器的物理地址和他们连接到自己的端口号之间建立一个对应关系,给任何一台机器的数据包仅仅只会往相应的端口发送,这样就可以满足机器A和机器B单独联系的愿望了。

  不过,这一切对于上层应用软件都是透明的,他们都不必在意底层的转换过程和结果,通讯时仅仅只需要知道对方IP地址和对应端口即可。

  那么ARP数据包的具体格式是怎么样的呢?从网络底层看来,这样一个数据包主要分为两个部分,前面一个是物理帧头,后面一个才是ARP帧。

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

DLC Header
字段名 长度
(字节) 含义 默认值 备注
Destination 6 接收方的物理地址   以太网硬件地址长度为6个字节
当广播时,物理地址为 0xFFFFFFFFFFFF(FF-FF-FF-FF-FF-FF)
Source 6 发送方的物理地址   以太网硬件地址长度为6个字节
Ethertype 2 帧类型 0x0806 ARP帧的类型值为 0x0806

  然后才是ARP帧,这里称为 ARP Frame

ARP Frame
字段名 长度
(字节) 含义 默认值 备注
Hardware type 2 硬件类型 0x1 局域网的类型为 0x1
Protocol type 2 上层协议类型 0x0800 由于这里是为基于IP协议的数据通讯做准备,所以上层协议为IP协议,其类型值为 0x0800
Length of hardware address 1 硬件地址长度 0x6 以太网的硬件地址长度为 0x6
Length of protocol address 1 协议地址长度 0x4 IP协议的地址长度为 0x4
Opcode 2 操作码   0x1 表示ARP请求包
0x2 表示ARP应答包
Sender's hardware address 6 发送方的硬件地址   以太网的硬件地址长度为 0x6
Sender's protocol address 4 发送方的协议地址   IP协议的地址长度为 0x4
由于上层协议为IP协议,因此这里为IP地址
Target hardware address 6 接收方的硬件地址   以太网的硬件地址长度为 0x6
Target protocol address 4 接收方的协议地址   IP协议的地址长度为 0x4
由于上层协议为IP协议,因此这里为IP地址
frame padding 18 物理帧填充数据   以上所有字段加起来总长度为42个字节,另外物理帧最后还有4个字节的CRC,为了达到物理帧的最小长度64个字节,所以要填充的字节数为64-42-4=18


  下面,我们再参照协议规定的数据包格式来诠释一下上述步骤。
  我们再把两台机器的物理地址和IP地址罗嗦一遍:

机器名 硬件地址 IP地址
A 11-22-33-44-55-66 192.168.0.10
B aa-bb-cc-dd-ee-ff 192.168.0.20

  现在机器A仅仅知道机器B的IP地址为 192.168.0.20,它将广播这样一个ARP请求包,然后等待机器B的ARP应答包。

  当机器A广播ARP请求包时,其中 Destination 为 0xFFFFFFFFFFFF(FF-FF-FF-FF-FF-FF),Source为自己的硬件地址,Opcode为1,在 Target protocol address 填入机器B的IP地址,在 Sender's hardware address 和 Sender's protocol address 分别填入自己的硬件地址和IP地址。
  该ARP请求包的内容如下:

字段名 长度
(字节) 值 备注 结构描述
Destination 6 ff ff ff ff ff ff 广播地址为 FF-FF-FF-FF-FF-FF DLC Header
Source 6 11 22 33 44 55 66 机器A的硬件地址 11-22-33-44-55-66
Ethertype 2 08 06 ARP帧的类型值为 0x0806

Hardware type 2 00 01 局域网的类型为 0x1 ARP Frame
Protocol type 2 08 00 上层协议为IP协议,类型值为 0x0800
Length of hardware address 1 06 以太网的硬件地址长度为 0x6
Length of protocol address 1 04 IP协议的地址长度为 0x4
Opcode 2 00 01 0x1 表示ARP请求包
Sender's hardware address 6 11 22 33 44 55 66 机器A的硬件地址 11-22-33-44-55-66
Sender's protocol address 4 c0 a8 00 0a 机器A的IP地址 192.168.0.10
Target hardware address 6 00 00 00 00 00 00 这里的6个字节可以是随机的
Target protocol address 4 c0 a8 00 14 机器B的IP地址 192.168.0.20
frame padding 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18个字节用于填充

  机器B接到该ARP请求包以后,从中提取机器A的硬件地址和IP地址,然后向机器A发送ARP应答包,其中 Destination 为机器A的硬件地址,Source为自己的硬件地址,Opcode为2,在 Sender's hardware address 和 Sender's protocol address 分别填入自己的硬件地址和IP地址,在 Target hardware address 和 Target protocol address 分别填入机器A的硬件地址和IP地址。
  该ARP应答包的内容如下:

字段名 长度
(字节) 值 备注 结构描述
Destination 6 11 22 33 44 55 66 机器A的硬件地址 11-22-33-44-55-66 DLC Header
Source 6 aa bb cc dd ee ff 机器B的硬件地址 aa-bb-cc-dd-ee-ff
Ethertype 2 08 06 ARP帧的类型值为 0x0806

Hardware type 2 00 01 局域网的类型为 0x1 ARP Frame
Protocol type 2 08 00 上层协议为IP协议,类型值为 0x0800
Length of hardware address 1 06 以太网的硬件地址长度为 0x6
Length of protocol address 1 04 IP协议的地址长度为 0x4
Opcode 2 00 02 0x2 表示ARP应答包
Sender's hardware address 6 aa bb cc dd ee ff 机器B的硬件地址 aa-bb-cc-dd-ee-ff
Sender's protocol address 4 c0 a8 00 14 机器B的IP地址 192.168.0.20
Target hardware address 6 11 22 33 44 55 66 机器A的硬件地址 11-22-33-44-55-66
Target protocol address 4 c0 a8 00 0a 机器A的IP地址 192.168.0.10
frame padding 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18个字节用于填充

  机器A收到该ARP应答包后,即可得到机器B的物理地址,至此,机器A已经完成机器B的IP地址到物理地址的转换过程,同时机器B也已经顺带完成机器A的IP地址到物理地址的转换过程。


  至此,相信你已经了解了ARP协议,如果依然有些糊涂,来找我吧,我会给你讲清楚,并修改文档,使之更加易于理解。

  另外,我们再描述一些和ARP协议相关的知识。
1、为了描述方便,我们称一个IP地址和一个物理地址的对应关系为一个对应条目,对于一台机器而言,这种条目可能会很多,所以有必要用一张表来管理,这里我们称作ARP条目表。在系统中可以通过命令“arp -a”来显示系统当前的ARP条目表。

2、由于各种可能的原因,一台机器的IP地址和物理地址的对应关系不会永远固定,比如机器B突然下线了,或者换了网卡,变了一个物理地址,她不会通知机器A的,所以在系统中会设置一个超时时间,当某个对应条目的生命期达到超时时间后,即将其删除,这样由机器A主动保持该条目的有效性。

3、对于一台机器而言,如果他收到了一个ARP应答包,他是不会去判断自己是否发送过请求包的,他依然会从中提取相关信息。你也许会问,他为什么不判断呢?拜托!你想累死他呀……不过其实我觉得也不太累,但是他就是没有这么实现。这样,就出现了一个可能的漏洞,也就是我下面即将提到的ARP欺骗。



  下面谈一下利用ARP协议所实现的一些另类功能。如果在狗狗(Google,我的一个同事习惯这么称呼)上搜索一下和ARP相关的东西,可以找到许多“ARP欺骗”(ARP spoof)的字样,这个也就是我们即将讲述的另类功能。
  现在我们构造一个ARP请求包,然后来设想一下会产生什么情况。

字段名 长度
(字节) 值 备注 结构描述
Destination 6 11 22 33 44 55 6
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值