自上而下的理解网络(6)——终篇!ARP与Ethernet Ⅱ
本篇是本系列博客的最后一篇,回顾此系列文章的介绍过程,我们介绍了:
1.网上冲浪的第一步:DNS域名解析协议
https://my.oschina.net/u/2340880/blog/5272671
2.离我们最近的应用层协议:HTTP
https://my.oschina.net/u/2340880/blog/5308979
3.高安全性,高可靠性的应用层协议:HTTPS
https://my.oschina.net/u/2340880/blog/5373824
4.可靠的传输层协议:TCP
https://my.oschina.net/u/2340880/blog/5420433
5.涉及路由与寻址的网络层协议:IP
https://my.oschina.net/u/2340880/blog/5465312
我们一步步的接近了网络传输的底层真相,大千世界,天涯咫尺。看似神奇的网络通信其实就是在这中分层的思想下变得纯粹和简单。本篇之所以是此系列文章的终篇,原因之一是到IP协议这一层后,我们基本已经从逻辑上可以清楚的理解了网络传输的过程,物理层的具体数据传输方式并不会影响我们逻辑上的理解。除此之外,更重要的原因是笔者学识薄浅,对链路层及以下的知识确实不甚了解,因此我们就到此为止。
一. 为什么我们需要MAC地址
本篇文章要从MAC地址说起,如果你认为当要传输的数据被完整的封装成IP报文,明确了源IP地址和目的IP地址后就万事大吉了,那只能说你还太年轻了。我们使用Wireshark来抓一个简单的TCP协议报文来看。如下图:
可以看到,在IP协议这一层,是只关注IP地址的,但是再向下,到封装成数据链路层的数据帧时,已经被转换成了源MAC地址和目的MAC地址。你可能会有疑惑,按照我们前面的理解,通过IP地址已经可以唯一的定位到要进行网络通信的两端,为何要多此一举的又使用MAC地址呢?这样做究竟是什么目的又有什么必要性呢?本篇文章就来帮你解惑。
1. 什么是MAC地址
首先我们需要先了解下什么是MAC地址,MAC地址全称为Media Access Control Address,通常也将其叫做以太网地址或物理地址,是一个用来确定设备网络位置的地址。我们平时使用的可连接互联网的设备中,都会有一个网卡元件,每个网卡都会有一个全球唯一的MAC地址,是由网络设备制造商生产时烧录在元件内部的。
MAC地址的长度为48位,即6个字节。一般在表示时,我们会以字节为组表示,中间使用冒号进行分割。你也可以查看下当前设备的MAC地址,如下图:
当数据报在网络中输出时,可能需要经过多个中间节点的转发才能最终到达目标节点,在初始节点,我们需要将目标节点的IP映射到中间节点的MAC地址,之后第二个节点根据IP来映射到下一个节点的MAC地址,依次进行映射,直到最终达到目标。因此,数据传输的关键是IP地址到MAC地址的映射,ARP协议就是来做这件事情的。
2. 有了IP地址,为什么还需要MAC地址?
我想,这个问题是初次了解到MAC地址的同学都会有的一个问题,要解答这个问题,我们首先要清楚IP地址和MAC地址间的异同之处。
IP地址和MAC地址最大的相同点是他们都是唯一的,我们主要看它们的不同之处:
· IP地址是网络层使用的,MAC地址是链路层使用的
这一点很容易理解,IP协议本身就是网络层的协议,虽然IP地址是唯一的,但其实基于网络拓扑而设计的,同一台设备修改IP地址很容易。MAC地址则是链路层的概念,其在硬件生产是就烧录好了,同一台设备一般无法变动。
· 长度不同
IPv4版本的IP地址长度为32位,IPv6版本的IP地址长度为128位,而MAC地址的长度固定为48位。
IP地址是逻辑上的地址,我们可以理解其作用是将数据从一个逻辑上的网络传递到另一个逻辑上的网络,而MAC地址是链路上的地址,其作用是将数据从一个设备节点传递到另一个设备节点。那么是否可以去掉MAC地址,只使用IP地址呢?理论上好像可行,但实际上却不行。核心的原因也在于IP是逻辑上的,当网卡接收到一块数据时,由于链路层属于下层无法获取上层的逻辑数据,网卡无法自主来过滤这块数据是否是发给我的,需要讲给CPU去运算,上层通过IP逻辑比较来确定的数据报的归属,这会大大的影响网络传输效率,当然如果干掉了分层的概念,可能只需要一个唯一地址就可以解决问题,但是至少对于目前的互联网架构这样是不可行的,这就比如有了域名,我们为什么还需要IP地址是一样的,本质是它们工作在不同的网络分层上。
二. 如何获取目标的MAC地址
现在我们知道了MAC地址是通信过程中所必须的,那么是如何获取到MAC地址呢。
1. 缓存表
和IP路由类似,我们的网络设备中还会存储两个与MAC地址相关的表。一个是ARP缓存表,一个是MAC地址表。当网络层的数据将要被封装成数据链路层的数据帧时,会通过ARP缓存表来查询IP地址与MAC地址的映射关系,当然如果没有缓存的话,会通过网络层的ARP协议来解析。MAC地址表则是存储着各端口的主机源MAC地址和端口号的映射,以便交换机将数据发送到指定的端口去。
2. ARP协议
上面所说的ARP缓存表,其中的数据实际上是通过ARP协议解析到的。ARP协议的核心作用是将IP地址解析成对应的MAC地址,回忆一下,这是否很像我们之前所介绍的DNS协议的作用。首先,ARP协议是IP协议簇中的成员之一,核心的工作原理是源主机在需要获取目的IP的MAC地址时,将目的IP组装成ARP数据报广播到局域网上的所有主机,并接收返回的数据,从而确定目标的MAC地址,接收到数据后,会将数据存储ARP缓存表中,下次查询时直接使用缓存,节省网络资源。这个过程就好比:
1.A想要知道B的MAC地址,其首先会向周围所有网络设备广播如下内容:
IP是A的设备要想知道IP是B的设备的MAC地址,你们谁知道,请发给我?
2.M,N,P,Q可能都收到了此询问请求,M发现自己知道B设备的MAC地址,因此会回给A:
IP是A的设备,我要将IP是B的设备的MAC地址发给你,请接收。
3.A设备收到M设备的返回后,拿到自己想要的MAC地址,之后组装链路层数据帧进行发送。
通过上面的过程你也可以发现,其实ARP本身并不是一个安全的协议,任何设备在接收到广播后都可以编造一个MAC地址进行返回,从而产生ARP欺诈风险,但这也并非完全无法防范,比如使用指定的安全的ARP服务器,建立静态的IP-MAC映射表等,我们这里不再讨论。
3. 分析下ARP协议
在访问网页时,你的设备可能随时会发起ARP请求和接收ARP响应,我们可以先抓一个ARP协议的请求和返回数据来简单看下ARP协议的结构,如下图:
如图中所示,抓到了两条ARP协议数据,其中第一条为ARP请求报文,第二条为ARP响应报文。可以看到请求报文的目标地址是广播地址,报文内包含硬件类型,协议类型,ARP类型,源MAC地址,源IP地址和目的IP地址。如果是响应报文,则其中还会包含目的MAC地址。相比较我们前面介绍的应用层的协议,ARP协议非常简单(越底层通常越简单与专注),协议格式如下:
其中,ARP首部占了8个字节:
前2个字节指定了硬件的类型,即链路层的协议,一般为1,表示以太网。
第3和第4个字节指定了所使用的协议类型,其中0x0800表示IPv4协议。
第5个字节表示链路层协议的地址长度,比如MAC地址长度为6个字节,这里的值是6。
第6个字节表示所使用的协议地址长度,比如IPv4的长度为4个字节,,则这里的值是4。
第7和第8个字节是Opcode码,是一个ARP操纵码,1表示ARP请求,2表示ARP响应。
ARP协议的首部是固定的,数据部分是可边长的,依次排布着源链路层地址,源逻辑层地址,目标链路层地址和目标逻辑层地址。
ARP协议本身简单,这里就不再过多阐述,还有一个与之对应的RARP协议,此协议是将MAC地址解析为IP地址,作用与ARP刚好相反,有兴趣的话,你也可以研究下。
三. 以太网链路层Ethernet Ⅱ帧
最后,我们再简单了解下Ethernet Ⅱ帧的相关内容,其实拿到MAC地址后,网络传输整体架构中有关逻辑的部分就完全结束后,后面就是向数据包前拼装上链路层协议的相关数据,组装成Ethernet Ⅱ帧进行发送。从抓包工具可以看到,这一层只是向头部拼接了目标MAC地址,源MAC地址和所使用的网络层协议。有时候,在数据的最后也会加上数据帧校验序列,如下图:
在底层的原理,我们这里就不再深究了。本系列博客也将暂时告一段落,希望能对你有所帮助。
专注技术,热爱生活,交流技术,也做朋友。同时,如果本篇文章让你觉得有用,欢迎分享给更多朋友,请标明出处。