关闭

WRNGT的博客

60
原创
0
转载
0
译文
6
评论
9481
访问

2017七月
13

浅析地址解析协议ARP

地址解析协议(ARP):

    在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地
址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不
符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机
发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少,并将这个请求广播到本地网
段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP
求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写
在应答包中。

arp的分组字段格式:


以太网头部部分分别为以太网硬件的地址的发送方和接收方的硬件地址,比如MAC地址。当前的的硬件地址全为1(即为0xFF FF FF FF FF FF)的地址时,为广播帧,在以太网的所有接口都要接受此帧数据;
帧类型即就是表示后面数据的类型,对于ARP请求应答,该字段为0x0806;

下面列出了帧类型字段中常用值及其对应的协议: 
帧类型                    协议 

0x0000 - 0x05DC   IEEE 802.3 长度 
0x0101 – 0x01FF   实验 
0x0600   XEROX NS IDP 
0x0660 
0x0661   DLOG 
0x0800   网际协议(IP) 
0x0801   X.75 Internet 
0x0802   NBS Internet 
0x0803   ECMA Internet 
0x0804   Chaosnet 
0x0805   X.25 Level 3 
0x0806   地址解析协议(ARP : Address Resolution Protocol) 
0x0808   帧中继 ARP (Frame Relay ARP) [RFC1701] 
0x6559   原始帧中继(Raw Frame Relay) [RFC1701] 
0x8035   动态 DARP (DRARP:Dynamic RARP)反向地址解析协议(RARP:Reverse Address Resolution Protocol) 
0x8037   Novell Netware IPX 
0x809B   EtherTalk 
0x80D5 IBM SNA Services over Ethernet 
0x 80F 3   AppleTalk 地址解析协议(AARP:AppleTalk Address Resolution Protocol) 
0x8100   以太网自动保护开关(EAPS:Ethernet Automatic Protection Switching) 
0x8137 因特网包交换(IPX:Internet Packet Exchange) 
0x 814C   简单网络管理协议(SNMP:Simple Network Management Protocol) 
0x86DD   网际协议v6 (IPv6,Internet Protocol version 6) 
0x880B   点对点协议(PPP:Point-to-Point Protocol) 
0x 880C   通用交换管理协议(GSMP:General Switch Management Protocol) 
0x8847 
多协议标签交换(单播) MPLS:Multi-Protocol Label Switching <unicast>) 
0x8848   多协议标签交换(组播)(MPLS, Multi-Protocol Label Switching <multicast>) 
0x8863   以太网上的 PPP(发现阶段)(PPPoE:PPP Over Ethernet <Discovery Stage>) 
0x8864   以太网上的 PPP(PPP 会话阶段) (PPPoE,PPP Over Ethernet<PPP Session Stage>) 
0x88BB 轻量级访问点协议(LWAPP:Light Weight Access Point Protocol) 
0x88CC   链接层发现协议(LLDP:Link Layer Discovery Protocol) 
0x8E88   局域网上的 EAP(EAPOL:EAP over LAN) 
0x9000 配置测试协议(Loopback) 
0x9100   VLAN 标签协议标识符(VLAN Tag Protocol Identifier) 
0x9200   VLAN 标签协议标识符(VLAN Tag Protocol Identifier) 
0xFFFF   保留 
硬件类型字段定义物理地址的类型,它的值为1表示MAC地址。
协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址。
硬件地址长度字段和协议地址长度字段,顾名思义,其单位是字节。对MAC地址来说,其长度为6;对IP(v4)地址来说,其长度为4。
操作字段指出4种操作类型:ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)。
最后4个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址外的其他3个字段,以构建ARP请求并发送之。接收端发现该请求的目的端IP地址是自己,就把自己的以太网地址填进去,然后交换两个目的端地址和两个发送端地址,以构建ARP应答并返回之(当然,如前所述,操作字段需要设置为2)。
ARP请求/应答报文的长度为28字节。如果再加上以太网帧头部和尾部的18字节,则一个携带ARP请求/应答报文的以太网帧长度为46字节。不过有的实现要求以太网帧数据部分长度至少为46字节(见图1-4),此时ARP请求/应答报文将增加一些填充字节,以满足这个要求。在这种情况下,一个携带ARP请求/应答报文的以太网帧长度为64字节。
在每台主机中都有一张ARP表,它记录着主机的IP地址和MAC地址的对应关系。
ARP协议:ARP协议是工作在网络层的协议,它负责将IP地址解析为MAC地址。
1)如果主机A想发送数据给主机B,主机A首先会检查自己的ARP缓存表,查看是否有主机B的IP地址和MAC地址的对应关系,如果有,则会将主机B的MAC地址作为源MAC地址封装到数据帧中。如果没有,主机A则会发送一个ARP请求信息,请求的目标IP地址是主机B的IP地址,目标MAC地址是MAC地址的广播帧(即FF-FF-FF-FF-FF-FF),源IP地址和MAC地址是主机A的IP地址和MAC地址。
2)当交换机接受到此数据帧之后,发现此数据帧是广播帧,因此,会将此数据帧从非接收的所有接口发送出去。
3)当主机B接受到此数据帧后,会校对IP地址是否是自己的,并将主机A的IP地址和MAC地址的对应关系记录到自己的ARP缓存表中,同时会发送一个ARP应答,其中包括自己的MAC地址。
4)主机A在收到这个回应的数据帧之后,在自己的ARP缓存表中记录主机B的IP地址和MAC地址的对应关系
使用ifconfig查看当前网络号:

编写一个脚本获取当前局域网主机的MAC地址:
在脚本中我们可以先使用ping命令:
    网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的相关信息。
再然后我们使用arp命令:
    ARP -A,查询系统中缓存的ARP表。ARP表用来维护IP地址与MAC地址的一一对应。
    当然如果我们直接查看arp缓存表,将查看所有逻辑地址的ip,但是在一个网段中,并非所有的逻辑地址都对应有设备,只有我们ping的地址存在,才可返回给我们源主机数据包,进而才有arp协议解析出mac地址与ip地址的对应

    但是在查看中并非所有的逻辑地址均有设备,因此 我们过滤掉arp缓存表中含有incomplete字符的行
由此,我们编写脚本如下:


#!/bin/bash
i=1
count=0
while [ $i -le 254 ]
do
    if [ $count -gt 10 ];then
        count=0
        sleep 1
    fi
    ping -c1 192.168.1.$i &
    let i++
    let count++
done
wait
echo "##################################"
arp -a | grep -v incomplete
echo "##################################"




img

WRNGT

等级:

排名:千里之外

博客专栏
文章分类
文章存档
阅读排行
评论排行
推荐文章
最新评论
img