简单地来说,ARP协议就是地址解析协议。对于以太网,数据链路层上是根据48bit的以太网地址来确定目的接口,设备驱动程序从不检查IP数据报中的目的IP地址。ARP协议为IP地址到对应的硬件地址之间提供动态映射。
以太网环境下,同一个网段的主机之间需要互相知道对方的MAC地址,才能访问。TCP/IP协议栈从上层到下层的封装过程中,第三层封装需要知道目的IP,第二层封装需要知道目的MAC。目的IP一般由用户手工输入,或者由应用程序填充,也可以通过名称解析系统解析得到,而目的MAC就需要使用ARP来解析。这也就是ARP协议的作用(点对点链路不使用ARP协议)。
上层应用产生数据,这里用FTP协议为例,在FTP协议中定位了目的IP。
那么,封装的过程如下:
应用层:需要FTP的控制信息,包括用户名、密码等;
传输层:目的端口号为21,源为随机端口号;
网络层:目的IP为172.16.1.200,源IP为172.16.1.1;
数据链路层:因为不知道目的IP 172.16.1.200对应的MAC,所以目的IP到目的MAC的封装映射失败;
三层到二层的封装失败,由于二层是以太网,ARP的工作机制便会产生ARP Request(广播帧)去解析目的MAC,此时,源MAC为数据发起者的MAC,目的MAC地址为FFFF:FFFF:FFFF(代表所有MAC地址)。
ARP Request到达本网段中的所有设备上,因为目的为FFFF:FFFF:FFFF(即通过广播的形式),所以所有设备都可以拆掉二层的封装,然后解读ARP数据包中需要解析的目的IP。
目的IP不正确的设备直接忽略这个ARP请求包,目的IP正确的设备,会产生一个ARP Reply去回应这个ARP Request。此时,二层的源MAC为被解析设备的MAC,目的为ARP解析发起者的MAC。
数据的发起者接到ARP Reply后,将目的IP与目的MAC的对应关系添加到自己的ARP表中。
之前未完成二层封装的FTP数据,这时重新开始封装二层头部,此时,正确的目的MAC就被封装到了整个数据帧中。只有完成了整个TCP/IP协议栈封装的数据帧,才能正常的从主机上发出去。
这就是ARP解析MAC地址的整个过程。
ARP一般只在局域网(同网段中)起作用,部分路由器有ARP代理功能,但也不可能所有广域网上所有的地址都代理了。在跨网段访问时,当发现目的地址不是本网段IP时,将会把数据包发送给网关处理(一般网关就是路由器来做的),路由器此时就发挥他的路由功能进行IP路由.
当到达目的网段后,再在目的网段使用ARP解析出目的主机的MAC地址,实现通信。
综上,ARP只用于同一局域网通信(特殊情况下可以跨网段,ARP代理时),当源和目的不在同一网段时,跨网段这部分由中间的具有路由功能的设备来进行处理,如路由器。
如果源主机和目的主机不在同一网段,ARP请求的广播帧无法穿过路由器,源主机如何与目标主机实现通信?
不同网段的主机通信时,主机会封装网关(通常是路由器)的mac地址,然后主机将数据发送给路由器,后续路由进行路由转发,通过arp解析目标地址的mac地址,然后将数据包送达目的地。
具体过程分析如下:
如上图,主机A、B通过路由器连接,属于两个不同的网段子网掩码24(255.255.255.0)
1、主机A有数据发往主机B,数据封装IP之后发现没有主机B的mac地址;然后查询ARP,ARP回应:“我在192.168.3.0/24网段,目标地址在192.168.4.0/24,不属于同一网段,需要使用默认网关”;ARP发现默认网关是192.168.3.2,但是没有网关mac地址,需要先进行查询
2、主机将数据包先放到缓存中,然后发送ARP查询报文:封装自己的mac地址为源mac,目标mac地址写全F的广播地址,请求网关192.168.3.2的mac地址。然后以广播方式发送出去
3、路由器收到广播数据包,首先将原192.168.3.1添加到自己的mac地址表中,对应mac地址为0800.0222.2222。路由发现是请求自己的mac地址,然后路由回复一个ARP应答:封装自己的IP地址为源IP自己的mac地址为源mac,主机A的IP为目的IP主机A的mac为目的mac,发送一个单播应答“我是192.168.3.2.我的mac地址为 0800.0333.2222”
4、主机收到应答后,将网关mac地址对应192.168.4.2(跨网关通信,其他网段IP地址的mac地址均为网关mac),然后将缓存中的数据包,封装网关mac地址进行发送
5、路由收到数据包,检查目的IP地址,发现不是给自己的,决定要进行路由,然后查询路由表,需要发往192.168.4.0网段中的192.168.4.2地址。路由准备从相应接口上发出去,然后查询mac地址表,发现没有主机B的映射。路由器发送arp请求查询主机B的mac地址(原理同2、3步,主机B收到请求后首先会添加网关的mac地址,然后单播回复arp请求)。
6、路由器收到主机B的mac地址后,将其添加到路由mac地址表中,然后将缓存中的数据2层帧头去掉,封装自己的mac地址为源mac,主机B的mac地址为目的mac(源和目的IP地址不变),加上二层帧头及校验,发送给主机B。
7、主机B收到数据之后,进行处理,发送过程结束。
8、如果主机B收到数据后进行回复,主机B会进行地址判断,不在同一网段,然后决定将数据发送给网关,主机B查询mac地址表获得网关mac地址,将数据封装后发送(arp地址解析的过程不再需要了,mac地址表条目有一定的有效时间),网关收到数据后直接查询mac表,将二层帧mac地址更改为A的mac发送出去。如此,主机A收到主机B的回复。
综上在跨网段通信过程中有以下过程:
1、判断地址是否同一网段
2、查询目的IP地址的mac(发送arp请求)
此外需注意点:
1、ARP请求以广播发送、以单播回应
2、路由器隔离广播。每一个网段都是独立的广播域
3、跨越网段通信需要使用网关的mac地址
代理ARP是ARP协议的一个变种。 对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的 ARP 请求会使用自己的 MAC 地址与目标计算机的 IP地址对源计算机进行应答。代理ARP就是将一个主机作为对另一个主机ARP进行应答。它能使得在不影响路由表的情况下添加一个新的Router,使得子网对该主机来说变得更透明化。同时也会带来巨大的风险,除了ARP欺骗,和某个网段内的ARP增加,最重要的就是无法对网络拓扑进行网络概括。代理ARP的使用一般是使用在没有配置默认网关和路由策略的网络上的。
代理ARP:proxy ARP就是通过使用一个主机(通常为router),来作为指定的设备对另一设备的ARP请求作出应答。
这个主机A要发送数据包到主机D。图表显示主机A使用的是16位掩码。(注意这一点!)主机A相信目的网段是直接连接在172.16.0.0上的。于是主机A直接发送一个ARP请求给目的站点。
主机A 需要得到主机D的MAC地址,所以主机A广播ARP请求:
源mac | 源IP | 目标mac | 目标IP |
---|---|---|---|
00-00-0c-94-36-aa | 172.16.10.100 | 00-00-00-00-00-00 | 172.16.20.200 |
ARP请求里主机A将自己的MAC地址作为源地址 FFFF.FFFF.FFFF 做为目的地址进行广播。但是路由器的E0 口默认不支持转发广播。所以主机D不能响应这个ARP请求。
路由器知道主机D在其他子网,于是用自己的MAC地址来应答A
源mac | 源IP | 目标mac | 目标IP |
---|---|---|---|
00-00-0c-94-36-ab | 172.16.20.200 | 00-00-0c-94-36-aa | 172.16.10.100 |
路由器用自己接口的MAC地址作为源地址回复ARP应答给主机A。这个ARP应答总是利用单播来回复。
主机A收到ARP请求后更新自己的MAC地址表
IP | 对应的mac |
---|---|
172.16.20.200 | 00-00-0c-94-36-ab |
现在主机A如果发送数据包给主机D就将数据发送给MAC 00-00-0c-94-36-ab.由路由器转发给主机D。所以目的地址为子网B的数据都发送给路由器。子网A内所有主机ARP地址表显示去往子网B主机的MAC地址全是路由器接口的MAC地址。这个路由器转发其他数据包到子网B。
这个主机A的ARP 地址表
IP | 对应的mac |
---|---|
172.16.20.200 | 00-00-0c-94-36-ab |
172.16.20.100 | 00-00-0c-94-36-ab |
172.16.10.99 | 00-00-0c-94-36-ab |
172.16.10.200 | 00-00-0c-94-36-bb |
多个IP地址被映射到一个MAC地址(多对一)。标志这在路由器上使用了 proxy-arp。(查看主机的arp表就清楚)。
proxy ARP有哪些优点?
最主要的一个优点就是能够在不影响其他router的路由表的情况下在网络上添加一个新的router,这样使得子网的变化对主机是透明的;proxy ARP应该使用在主机没有配置默认网关或没有任何路由策略的网络上
proxy ARP带来的哪些负面影响?
1.增加了某一网段上ARP流量
2.主机需要更大的ARP table来处理IP地址到MAC地址的映射
3.安全问题,比如ARP欺骗(spoofing)
4.不会为不使用ARP来解析地址的网络工作
5.不能够概括和推广网络拓扑
另:
1) 什么是ARP代理?
路由器收到ARP Request时,若发现查询的目的IP地址在不同子网,路由器会扮演代理的ARP的角色,代为回答,告诉查询者它所要做的MAC地址 (用的是之间接口的MAC地址)
2)为什么要有ARP代理? 路由器的一个重要功能是把局域网广播包限制在该网内,不让扩散,否则会造成网络风暴。ARP Request是个广播包,它询问的对象若在同一个局域网内,就会回答。但如果查询对象不在同一个局域网,那怎么办呢?为了解决这个问题,路由器就提供一个服务:代理ARP.
3) 还有什么方法来解决跨局域网的地址查询? 若主机配置了默认网关,在查询MAC地址的对象位于局域网之外的时候,可以把查询任务交给默认网关。
4) 什么情况下用ARP代理? 网络中主机、路由器都有ARP cache. 主机通常配置了默认网关,它们会用默认网关查询局域网外的MAC地址。 路由器在需要查询远程网段里的MAC地址时, 与其相连接的路由器,在收到ARP Request时就会扮演代理ARP的角色。
感觉百度百科写得很好 偷个懒,直接见链接 ARP欺骗
1. 网络异常。具体表现为:掉线、IP冲突等。
2. 数据窃取。具体表现为:个人隐私泄漏(如MSN聊天记录、邮件等)、账号被盗用(如QQ账号、银行账号等)。
3. 数据篡改。具体表现为:访问的网页被添加了恶意内容,俗称“挂马”。
4. 非法控制。具体表现为:网络速度、网络访问行为(例如某些网页打不开、某些网络应用程序用不了)受第三者非法控制。
从目前的情况来看,ARP欺骗(不管是人为的还是ARP病毒)大多数是在网络异常后被发现的。请注意,精心策划的人为ARP欺骗、设计良好的ARP病毒,是不会造成网络异常的,所以网络没有出现异常并不代表不存在ARP欺骗问题!
注意:APR请求包是广播的,但是ARP应答帧是单播的。以太网数据报最小长度是60字节(14字节的以太网头,不包含4字节的FCS),ARP数据包长度为42字节(14字节的以太网头和28字节的ARP数据),需要加入填充字符到以太网最小长度要求:60字节。
将局域网中某个主机的物理地址转换为IP地址,比如局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。RARP协议广泛应用于无盘工作站引导时获取IP地址。
RARP允许局域网的物理机器从网管服务器ARP表或者缓存上请求其IP地址。
帧格式同ARP协议,帧类型字段和操作类型不同,具体见ARP帧格式描述。
主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址。
本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。
如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用。
如果不存在,RARP服务器对此不做任何的响应。
源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。