ip层的arp协议
Arp(adress resolution protocol—地址解析协议)是在传输IP包时,因不知道IP地址对应的MAC地址,无法传送数据引起的,通过arp,建立目的IP跟MAC地址的映射关系,从而获得目的IP的MAC地址。
Arp头部的数据结构如下:
typedefstruct arphdr {
unsignedshort arp_hrd;/*硬件类型,*/
unsignedshort arp_pro;/*协议类型*/
unsignedchar arp_hln;/*硬件地址长度*/
unsignedchar arp_pln;/*协议地址长度*/
unsignedshort arp_op;/*ARP操作类型*/
unsignedchar arp_sha[6];/*发送者的硬件地址*/
unsignedlong arp_spa;/*发送者的协议地址*/
unsignedchar arp_tha[6];/*目标的硬件地址*/
unsignedlong arp_tpa;/*目标的协议地址*/
}ARPHDR,*PARPHDR;
我们封装arp数据包格式如下:
目的地址,我们现在还不知道,需要向本子网广播,以获得目的地址(目的MAC),因此这里全填1,源基地即本地的MAC地址,我们从本地网卡的MAC地址即可取得,类型表示的是上层协议的类型,这里是arp,用0x0806表示,到这里就完整的帧封装。
arp头部数据填充,硬件类型有很多种,即有各种各样的硬件类型,比如以太网卡,令牌环网卡等,0x0001表示以太网卡,协议类型表示的是上层协议的类型,即需要通过arp获得对方MAC地址的协议,而不是arp本身协议,0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,操作类型表示本arp所要操作的动作,1为ARP请求,2为ARP应答,3为RARP请求,4为RARP应答,源主机MAC地址为本地MAC,从网卡驱动从即可获得,源主机IP地址为本地IP,这个也是从网卡驱动中获得,当然也是我们人为设置的(或者DHCP),目的主机MAC地址就是我们发送arp需要获得的数据,此时还不知道,全0待填写,目的主机IP地址为远端的IP地址。
由于路由器有拦截广播的功能,arp广播只能在本子网中广播,如果所要获取的MAC地址不是本子网的,则必须经过路由器网关获得。由于路由器的默认网关也是本子网的一个设备,因此也会收到本子网的arp广播,经过子网匹配,发现目的IP的子网,跟路由器的另一个端口的子网一致,于是,把arp请求转发给路由器的另一个端口,此时,路由器的另一个端口跟目的IP在同一个子网,因此,又可以进行arp广播,当目的IP获得了arp广播信息后,会把本机的MAC地址填充到arp包的目的地址MAC这栏中,同时修改arp的数据包的操作类型为arp应答,接着把数据包发回源IP地址,此时的发送就不是以广播的形式发送了,因为目的地址MAC,本地地址MAC都知道,是需要单播即可,此时,还需要修改以太网帧的目的MAC,本地MAC,从而得以发送数据包