网络协议学习(1):图解ARP协议概述

MAC地址Media Access Control Address),直译为媒体访问控制地址,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网上设备位置的地址。

在OSI模型中,第三层网络层负责IP地址,第二层数据链接层则负责MAC地址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。

MAC(Media Access Control,介质访问控制)地址,也叫硬件地址,长度是48比特(6字节),由16进制的数字组成,分为前24位和后24位:

  • 前24位叫做组织唯一标志符(Organizationally Unique Identifier,即OUI),是由IEEE的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
  • 后24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的。

MAC地址与IP地址关系

IP地址就如同一个职位,而MAC地址则好像是去应聘这个职位的人才,职位既可以让甲坐,也可以让乙坐,同样的道理一个结点的IP地址对于网卡是不做要求,基本上什么样的厂家都可以用,也就是说IP地址与MAC地址并不存在着绑定关系。

本身有的计算机流动性就比较强,正如同人才可以给不同的单位干活的道理一样的,人才的流动性是比较强的。职位和人才的对应关系就有点像是IP地址与MAC地址的对应关系。比如,如果一个网卡坏了,可以被更换,而无须取得一个新的IP地址。如果一个IP主机从一个网络移到另一个网络,可以给它一个新的IP地址,而无须换一个新的网卡。

当然MAC地址除了仅仅只有这个功能还是不够的,就拿人类社会与网络进行类比,通过类比,我们就可以发现其中的类似之处,更好地理解MAC地址的作用。无论是局域网,还是广域网中的计算机之间的通信,最终都表现为将数据包从某种形式的链路上的初始结点出发,从一个结点传递到另一个结点,最终传送到目的结点。数据包在这些节点之间的移动都是由ARP负责将IP地址映射到MAC地址上来完成的。

其实人类社会和网络也是类似的,试想在人际关系网络中,甲要捎个口信给丁,就会通过乙和丙中转一下,最后由丙 转告给丁。在网络中,这个口信就好比是一个网络中的一个数据包。数据包在传送过程中会不断询问相邻节点的MAC地址,这个过程就好比是人类社会的口信传送过程。相信通过这两个例子,我们就可以进一步理解MAC地址的作用。

MAC地址与IP地址区别

IP地址和MAC地址相同点是它们都唯一,不同的特点主要有:

  1. 对于网络上的某一设备,如一台计算机或一台路由器,其IP地址是基于网络拓扑设计出的,同一台设备或计算机上,改动IP地址是很容易的(但必须唯一),而MAC则是生产厂商烧录好的,一般不能改动。我们可以根据需要给一台主机指定任意的IP地址,如我们可以给局域网上的某台计算机分配IP地址为192.168.0.112 ,也可以将它改成192.168.0.200。而任一网络设备(如网卡,路由器)一旦生产出来以后,其MAC地址不可由本地连接内的配置进行修改。如果一个计算机的网卡坏了,在更换网卡之后,该计算机的MAC地址就变了。
  2. 长度不同。IP地址为32位,MAC地址为48位。
  3. 分配依据不同。IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商。
  4. 寻址协议层不同。IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上(ARP根据目的IP地址,找到中间节点的MAC地址,通过中间节点传送,从而最终到达目的网络)。

一、ARP概述

如果要在TCP/IP协议栈中选择一个"最不安全的协议",那么我会毫不犹豫把票投给ARP协议。我们经常听到的这些术语,包括"网络扫描"、"内网渗透"、"中间人拦截"、"局域网流控"、"流量欺骗",基本都跟ARP脱不了干系。大量的安全工具,例如大名鼎鼎的Cain、功能完备的Ettercap、操作傻瓜式的P2P终结者,底层都要基于ARP实现。

听上去这么"逆天"的协议,其实技术原理又简单的难以置信,例如ARP整个完整交互过程仅需要两个包,一问一答即可搞定!但是ARP协议也有它令初学者迷惑的地方,例如由它本身延伸出来的"代理ARP"、"免费ARP"、"翻转ARP"、"逆向ARP",而这些不同种类的ARP,又应用于不同的场景。好吧,在深入到技术原理之前,作为初学者,我们先记住下面三句话:

ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址

②在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。

③一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。

接下来,我们通过图解的方式来深入了解ARP协议是如何工作的。

 

二、ARP原理之请求应答

同一个局域网里面,当PC1需要跟PC2进行通信时,此时PC1是如何处理的?

网络协议学习(1):图解ARP协议概述_第1张图片

根据OSI数据封装顺序,发送方会自顶向下(从应用层到物理层)封装数据,然后发送出去,这里以PC1 ping PC2的过程举例==>

网络协议学习(1):图解ARP协议概述_第2张图片

PC1封装数据并且对外发送数据时,上图中出现了"failed",即数据封装失败了,为什么?

我们给PC1指令-"ping ip2",这就告知了目的IP,此时PC1便有了通信需要的源目IP地址,但是PC1仍然没有通信需要的目的MAC地址。这就好比我们要寄一个快递,如果在快递单上仅仅写了收件人的姓名(IP),却没有写收件人的地址(MAC),那么这个快递就没法寄出,因为信息不完整。

那么,现在PC1已经有了PC2的IP地址信息,如何获取到PC2的MAC地址呢?此时,ARP协议就派上用场了。我们接着上面这张图,继续==>

网络协议学习(1):图解ARP协议概述_第3张图片

通过第三和第四步骤,我们看到PC1和PC2进行了一次ARP请求和回复过程,通过这个交互工程,PC1便具备了PC2的MAC地址信息。

接下来PC1会怎么做呢?在真正进行通信之前,PC1还会将PC2的MAC信息放入本地的【ARP缓存表】,表里面放置了IP和MAC地址的映射信息,例如 IP2<->MAC2。接下来,PC1再次进行数据封装,正式进入PING通信,如下==>

网络协议学习(1):图解ARP协议概述_第4张图片

小结:经过上面6个步骤的处理,PC1终于把数据包发送出去了,之后便可以进行正常的通信了。看到了吧,ARP的功能和实现过程是如此的简单:它在发送方需要目标MAC地址的时及时出手,通过"一问一答"的方式获取到特定IP对应的MAC地址,然后存储到本地【ARP缓存表】,后续需要的话,就到这里查找。

既然是"缓存"表,意味着它有时效性,并且如果电脑或者通信设备重启的话,这张表就会清空;也就是说,如果下次需要通信,又需要进行ARP请求。在我们的windows/macos系统下,可以通过命令行"arp -a"查看具体信息=>

三、ARP原理之广播请求单播回应

上面的图解过程看上去简单又纯粹,好像我们就已经把这个协议的精髓全部get到,但其实,我们只是刚揭开了它的面纱,接下来我们才真正进入正题。例如,上面的图解过程中,整个局域网(LAN)只有PC1和PC2两个主机,所以这个一问一答过程非常的顺畅。

而实际网络中,这个LAN可能有几十上百的主机,那么请问,PC1如何将这个【ARP请求包】顺利的交给PC2,而PC2又如何顺利的把【ARP回应包】返回给PC1? 我们看下面的图:

网络协议学习(1):图解ARP协议概述_第5张图片

网络协议学习(1):图解ARP协议概述_第6张图片

为了营造出"几十上百"的效果,这里多添加了2个主机进来 ( ω ),并且增加了有线和无线的环境。那么,在多主机环境下,PC1现在发出的ARP请求包,怎么交到PC2手里?

这时,ARP协议就需要采用以太网的"广播"功能:将请求包以广播的形式发送,交换机或WiFi设备(无线路由器)收到广播包时,会将此数据发给同一局域网的其他所有主机。

那么,什么是广播?对于初学者而言,我们只需要知道,大部分的广播包,它们有一个共同特征:二层封装时目的MAC是全f(ffff.ffff.ffff)或三层封装时目的IP是全1(255.255.255.255)。可以这样更方便的记住:目的地址最大的,就是广播。

注明:广播根据所在层次可分为二层广播和三层广播,根据发生范围可分为本地广播和定向广播,小伙伴们有兴趣可以自己再去拓展下。

接下来我们来看下这个ARP广播请求包接下来是如何工作的?

网络协议学习(1):图解ARP协议概述_第7张图片

根据上图我们看到,PC1发送的请求广播包同时被其他主机收到,然后PC3和PC4收到之后(发现不是问自己)则丢弃。而PC2收到之后,根据请求包里面的信息(有自己的IP地址),判断是给自己的,所以不会做丢弃动作,而是返回ARP回应包。

ARP请求是通过广播方式来实现的,那么,PC2返回ARP回应包,是否也需要通过广播来实现呢?答案是否定的。大部分网络协议在设计的时候,都需要保持极度克制,不需要的交互就砍掉,能合并的信息就合并,能不用广播就用单播,以此让带宽变得更多让网络变得更快。

那么,ARP回应包是如何处理的?这里需要特别关注ARP请求包的内容,在上面的图解里面,ARP请求包的完整信息是:我的IP地址是IP1,MAC地址是MAC1,请问谁是PC2,你的IP2对应的MAC地址是多少?

简单来说,ARP请求首先有"自我介绍",然后才是询问。这样的话,PC2在收到请求之后,就可以将PC1的IP和MAC映射信息存储在本地的【ARP缓存表】,既然知道PC1在哪里,就可以返回ARP单播回应包。

网络协议学习(1):图解ARP协议概述_第8张图片

这张图我们需要得到两个信息:①被询问者PC2先生成了ARP映射信息,然后才是询问者PC1;②PC3和PC4等其他主机,无法收到这个ARP回应包,因为是单播形式。

小结:ARP协议通过"一问一答"实现交互,但是"问"和"答"都有讲究,

  1. 先向众人自我介绍,然后再一对一回复。
  2. "问"是通过广播形式实现,"答"是通过单播形式。

四、ARP数据包解读

为了让大家更好的理解ARP协议以及广播和单播的概念,我们来看一下用Wireshark抓取到的真实网络中的ARP过程,通过数据包的方式来呈现,地址信息如下,部分MAC信息隐去。(建议初学者用GNS3配合Wireshark来抓取协议包进行分析,相比真实网络更加干净,方便分析)

主机1 <---> 主机2

主机1:  IP1 10.1.20.64    MAC1:00:08:ca:xx:xx:xx

主机2:  IP2 10.1.20.109  MAC2:44:6d:57:xx:xx:xx

【ARP请求包】

网络协议学习(1):图解ARP协议概述_第9张图片

【ARP回应包】

网络协议学习(1):图解ARP协议概述_第10张图片

【ARP协议字段解读】

Hardware type :硬件类型,标识链路层协议

Protocol type: 协议类型,标识网络层协议

Hardware size :硬件地址大小,标识MAC地址长度,这里是6个字节(48bti)

Protocol size: 协议地址大小,标识IP地址长度,这里是4个字节(32bit)

Opcode: 操作代码,标识ARP数据包类型,1表示请求,2表示回应

Sender MAC address :发送者MAC

Sender IP address :发送者IP

Target MAC address :目标MAC,此处全0表示在请求

Target IP address: 目标IP

五、ARP到底是链路层还是网络层?

这个问题的难度堪比另外一个世界级难题:世界上最好的编程语言是什么?

其实早在20世纪时,W.Richard Stevens在《TCP/IP详解卷一》里面就提到了这个难题。这里给出我个人的协议分层思路,给大家作为参考=>

协议到底所属哪一层,可以从应用/功能来考虑,也可以从层次/包封装来考虑。

以ARP协议为例,它的功能最终是获取到MAC信息,服务于链路层,从这点考虑,ARP是链路层协议;但是从层次来看,ARP基于Ethernet协议,IP协议基于Ethernet协议,它们在Ethernet协议里面有独立的Type类型,前者是0x0806,后者是0x0800,既然ARP和IP协议"平起平坐",那么IP是网络层,ARP难道就不是网络层?

网络协议学习(1):图解ARP协议概述_第11张图片

小结:基于功能来考虑,ARP是链路层协议;基于分层/包封装来考虑,ARP是网络层协议。(此方法对于ICMP协议同样管用)

 

 

转载:

  • 图解ARP协议(一)概述
  • 图解ARP协议(二)ARP攻击原理与实践
  • 图解ARP协议(三)ARP防御篇-如何揪出“内鬼”并“优雅的还手”
  • 图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)
  • 图解ARP协议(五)免费ARP:地址冲突了肿么办?

 

你可能感兴趣的:(网络编程)