ARP协议
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。
ARP地址解析协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)[RFC826]。ARP协议是属于数据链路层的协议,在以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据32位的IP地址。内核(如驱动)必须知道目的端的硬件地址才能发送数据
1、应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);
2、内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表[1];
3、如果存在该IP-MAC对应关系,那么跳到步骤7;如果不存在该IP-MAC对应关系,那么接续下面的步骤;
4、内核进行ARP广播,目的地的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;
5、当192.168.1.2主机接收到该ARP请求后,将源主机的IP地址及MAC更新至自己的arp缓冲中,然后发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;
6、本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;
7、内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;
使用arp-a命令就可以查看本地的ARP缓存内容,所以,执行一个本地的PING命令后,ARP缓存就会存在一个目的IP的记录了。当然,如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录
以太网报头中的前两个字段是以太网的源地址和目的地址。
目的地址为全F的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧
两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806
hardware (硬件)和protocol (协议)用来描述ARP分组中的各个字段。
例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)
硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址
硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。 各占用1字节
op操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和R ARP应答(值为4)。
接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。
注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。
对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。
RARP即反向地址转换协议
反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用
tcpdump抓取arp包:
[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.18View Code
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
16:18:59.533494 arp who-has 192.168.0.18 tell 192.168.0.40 //ARP的请求
16:18:59.533874 arp reply 192.168.0.18 is-at 00:0c:29:05:dc:4b (oui Unknown) //ARP的回应
[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.2 -w /var/ftp/arp.tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2 packets captured
215 packets received by filter
112 packets dropped by kernel
[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.2 -c 5 -w /var/ftp/arp.tcpdump
[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.2 -r /var/ftp/arp.tcpdump // 从文件中读取
reading from file /var/ftp/pg/arp.tcpdump, link-type EN10MB (Ethernet)
16:21:48.307307 arp who-has 192.168.0.2 tell 192.168.0.40
16:21:48.307630 arp reply 192.168.0.2 is-at 00:0c:29:9e:99:ef (oui Unknown)
//tcpdump默认只抓取包的前96 bytes,-s 1500可抓到整个包的数据
查看缓存表
[root@station040 ~]# arp
注意:如果出现两个MAC,可能目标主机是双网卡,也可能是IP冲突
如果不能正常通信的话(ping不通),那就是IP冲突,否则双网卡
回答问题
1、IP冲突的本质是什么?
我们知道,如果网络中存在相同IP地址的主机的时候,就会报告出IP地址冲突的警告。这是怎么产生的呢?
比如某主机B规定IP地址为192.168.0.1,如果它处于开机状态,那么其他机器A更
改IP地址为192.168.0.1就会造成IP地址冲突。其原理就是:主机A在连接网络(或更改IP地址)的时候就会向网络发送ARP包广播自己的IP地址,也就是freearp。如果网络中存在相同IP地址的主机B,那么B就会通过ARP来reply该地址,当A接收到这个reply后,A就会跳出IP地址冲突的警告,当然B也会有警告
2.arp欺骗
ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此,在上面的假设网络中,B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存,将本地的IP-MAC对应表更换为接收到的数据格式,由于这一切都是A的系统内核自动完成的,A可不知道被伪造了。
ARP协议的功能
①将IPv4地址解析为MAC地址
②维护映射的缓存
说明:
网络层对应的是IP地址,是跨网段使用的
链路层地址对应的是MAC地址,是物理地址,是在局域网内部使用的
MAC地址就好比自己的小名一样,只有本地局域网有效
ARP协议过程说明
因特网层相关的工具
ping traceroute/tracert
通过实例分析互联网通信工程
①主机A想访问B主机,假设PCA是telnet到PCB进行访问
②主机A由应用层构建一个数据包,发送到传输层
③传输层拥有端口号的概念,就会在上层发过来的数据包加上TCP的头部,
即源端口和目标端口,源端口号是随机的,目的端口是23
因为访问的是目的地址的telnet服务;然后封装好的数据包再传输给下层
④在互联网层上拥有IP的概念,就会在上层发过来的数据包加上IP的头部,
即源IP地址和目标IP地址,源IP地址就是IPA地址,目标IP地址就是IPB
然后再将封装好的数据包发给网络接入层
⑤网络接入层拥有MAC地址的概念,就会在上层发过来的数据包加上MAC地址
即源MAC地址和目标MAC地址,源MAC地址就是IPA的mac,目标的mac
地址是网关接口的MAC地址,默认要是没有网关接口的MAC地址,就会发送
arp广播,获得到网关接口的mac地址
⑥主机A会将封装好的数据包以bit的方式传输给路由器
⑦路由器收到数据包后,会进行数据包的解封装,获得目标ip网段地址,查询路
由表进行路由的转发。
⑧到达目标网络的路由器后,路由器会广播arp,找到对应目标IP地址的mac地
址,根据获取到的目标mac地址,将数据转发的主机B
声明出处:由于本文是根据书本写的博客,如遇已有类似文章博客,请联系我,我会在声明出处。