点击上方 “程序猿杂货铺” ,选择“置顶公众号”
每天 0 点准时推文,我们不见不散!
阅读本文大概需要 6 分钟
原文 | http://sina.lt/gpqN
在教计算机网络课程中,经常会碰到这样的问题,为什么需要两个地址:一个是MAC(物理地址),另一个是IP地址。各种解释都有,基本上一个观点就是一个是物理地址,一个是逻辑地址。然而,这样的解释太抽象,什么是物理,什么是逻辑。这些抽象的表述会让人无法理解到其本质。下面我就谈谈这个问题。
要想说明这个问题,首先得说说计算机网络的目标是什么。计算机网络的根本目标就是将数据从一点传送到另外一点。听起来很简单,但是里面包含的意思很多。例如,两个点之间是在同一个网络还是跨网络连接的,如何才能将数据正确的传送到对方,如果出现错误怎么办等等。
为了说明问题的本质,我们首先将问题简化:假设两点在一个网络内。在这种情况下,只需要MAC地址就可以了。例如通过交换机将多台电脑组成一个网络,为了找到对方,必须通过一个地址来标识。就像寄快递一样,如果没有地址,快递员是无法将快递送到对方的所在地的。这就是我们所说的MAC地址。当A点要将数据传递给B点时,会在数据的首部添加B的MAC地址,即目标地址。当然在首部中也有源地址,即发送方的MAC地址,还有其它一些信息,例如用于校验的等等。组装好的这个数据称为帧。然后A点就将帧通过网卡发送出去。
此时交换机收到这个帧后,查找自己的转发表。转发表主要有两列,一列是MAC地址,另外一列是该MAC地址对应的端口。查找的结果只有两种情况:找到或没找到。如果找到就将数据从该MAC对应的端口转发出去。如果没找到,很简单,交换机会把帧向所有端口广播(除了该帧进入的端口),因此肯定会有一个合适的端口收到的。这个广播的方法很粗暴,也很奏效。
这就是MAC地址的作用。MAC地址是刻录在网卡这个物理设备上的,一般是无法改变的。
然而,如果两点不在一个网络内。这时就需要IP地址了。因为IP地址含有两个部分,一个是网络地址,一个是主机地址。因此,通过对方的IP地址,是可以判断出对方是否和本机在一个网络内。如果在一个网络内,如上所述,只需要知道对方的MAC地址即可通信。
如果不在一个网络内,本机的网络层就认为数据应该发送给网关。道理是显然的,如果不在一个网络内,首先得把数据发送出网络才可以。如何发出网络,当然是发给网关,因为网关就相当于网络的门卫。要想把数据发给网关,同样需要知道网关的MAC地址,如何知道网关的MAC地址呢?这就涉及到ARP协议。
电脑缓存里有一张ARP表,该表主要有两列:一列是IP地址,另外一列是MAC地址。这张表不是天生就有的,是随着网卡收到网络中的各种通信数据,不断学习增加的。
话说回来,如果ARP表中有网关IP地址对应的MAC地址,则问题就转化为网内数据发送,上面已经讲的很清楚了。如果ARP表中没有网关IP地址对应的MAC地址,则启动ARP协议,即向网内广播,询问该IP地址的MAC地址。广播询问的结果是网关收到广播后,发现是问自己的MAC地址,所以就回复询问方自己的MAC地址。然后数据发给网关的问题,也转化为网内数据发送,上面已经讲的很清楚了。
大家发现没有,在跨网通信时是需要IP地址的。因为需要通过IP地址来判断是网内通信还是网外通信。有人可能会说,让MAC地址也具有能够区分网络的特征不就可以不需要IP了么。事实上这样做是不实际的。每个网卡出厂时就有一个独一无二的MAC地址,出场时是不可能知道你用它时是在哪一个网络里,也就是天生它就不具有能够区分网络的特性。而且也不需要它具有这种特性。因为MAC只负责设备到设备的通信就够了。这层通信是真正的通信,所以称为物理通信。
而跨网络传输数据时,需要考虑传输的路径,即为了到达目的地,下一跳应该去哪儿,从而一跳一跳的传输到目的地。而网内传输,不需要考虑传输路径,只要发出去一定可以到达。最坏情况下就是通过广播传输也能到达。而跨网络传输时,这一招不灵了。因此,跨网传输时需要考虑网络之间的传输,需要使用能够表示网络特征的地址,即IP地址。所以IP地址是负责网络到网络传输的。
至于发给网关后,下一步发给谁,本机就管不着了。本机只能保证在网络内传输,即下一跳的概念。下下一跳,只能由网关来负责了。其实网关就是路由器的一个接口。网关通过IP地址来确定路由,通过查找路由表来确定下一跳应该去往哪个网络,然后就将数据从连接那个网络的路由器的接口发送出去。发送出去同样要判断目标IP是和当前路由接口的网络是否同一网络。问题又回到上面讲的过程了,所以周而复始。
可见IP地址和MAC地址的概念并不矛盾。他们之间是不同层次的,就像有了领导还必须有群众才可以,谁也离不开谁。数据从一点传到另外一点,要经过几个网络,网络路线是怎样的,需要使用IP地址来解决。而网内传输需要使用MAC地址来传输。可见没有网内真正的通信传输,何以实现网络之间的通信。而如果没有网络路由的路径的话,数据是不可能到达目的地的,因为方向都没有。
如果再往深里挖掘,地址的概念还可以包括网址。就像百度的网址,我们为什么有了IP还需要网址呢?这超过了我们的题目范围,下次再说。
http://blog.sciencenet.cn/blog-411071-1037673.html
陈智罡科学网博客
推荐阅读
P.S:【福利】公众号菜单栏加我微信,可以私信获取一份精心整理的 Java 知识体系梳理及面试总结文档!
如果这篇文章对你有帮助
请帮忙转发,点个在看