首先来解释一下我个人对网上各种观点的评价。
首先像这个博客所说的,因为切换WIFI导致IP地址变更,如果没有MAC地址的话就会导致收不到数据。 实际上如果IP地址变更了,游戏里掉线重连后,服务端会接收到最新的IP地址并且与最新的IP地址进行连接,之前的数据就直接是丢包处理了,最终数据还是由重连后继续传输,所以这里并不是IP地址存在的必要条件。
接下来就说一下我个人搜索与认识后觉得比较可靠的答案:
原因一
当我们只有MAC地址,没有IP地址的时候。
如果我们想对一个范围内(一个子网内)的设备进行群发数据包,是很难做到的。
有几台机器的MAC地址分别为
设备A:aa-aa-aa-aa-aa-aa
设备B:bb-bb-bb-bb-bb-bb
设备C:cc-cc-cc-cc-cc-cc
设备D:dd-dd-dd-dd-dd-dd
假如设备A跟设备B同一个子网,设备C跟设备D同一个子网,那么我们只有MAC地址是很难实现这个子网识别跟针对子网群发数据包的。
问题在于我们如何才可以将aa-aa-aa-aa-aa-aa,bb-bb-bb-bb-bb-bb用东西标识为它们是一个子网范围内才行。
写死MAC地址前缀
有一个方法,就是设备出厂的时候写死MAC地址前缀,到时候根据地址前缀来识别子网进行群发就可以了。(这个方法是非常不现实的,实际上不会这样做)
用这种方法后的设备MAC地址可能会变成这样,拥有共同的公共字符串前缀。
设备A:xx-aa-aa-aa-aa-aa
设备B:xx-bb-bb-bb-bb-bb
到时候群发的时候写一个规则,针对xx开头的mac地址进行发送数据包即可。
交换机、路由表中新增记录
另一个方法是,交换表或者路由表中记录子网里面有哪些设备的mac地址。
子网A:aa-aa-aa-aa-aa-aa,bb-bb-bb-bb-bb-bb。
然而这个工作由交换机或者路由器进行记录,这无疑增大了交换机跟路由器的交换表以及路由表的存储容量,所以我们有没有更好的方法呢?
此时IP地址的作用性就来了。
IP地址
现在我们几台机器的不仅有了MAC地址,并且有了IP地址。
设备A:aa-aa-aa-aa-aa-aa,192.168.0.2
设备B:bb-bb-bb-bb-bb-bb,192.168.0.3
设备C:cc-cc-cc-cc-cc-cc,192.168.1.2
设备D:dd-dd-dd-dd-dd-dd,192.168.1.3
子网掩码
此时不仅有了IP地址,还产生了一个新概念,也就是子网掩码。
- 设备A:192.168.0.2 & 255.255.255.0 = 192.168.0.0
- 设备B:192.168.0.3 & 255.255.255.0 = 192.168.0.0
- 设备C:192.168.1.2 & 255.255.255.0 = 192.168.1.0
- 设备D:192.168.1.3 & 255.255.255.0 = 192.168.1.0
因此我们可以判断出设备A与B共属一个子网,设备C与D也共属一个子网。
这样就可以方便快捷的群发数据包到指定子网中了。
所以有MAC地址为什么还需要IP地址,其中之一的原因就是方便子网划分,IP地址具有地域性特征。单靠MAC地址进行子网划分是不现实、很麻烦的事情,因为MAC地址基本是写死的,不能随意改变,而IP地址是进一步的抽象,允许灵活变更,取决于用户的配置。
原因二
原因二实际上也是跟子网划分有关,不过这个角度更多是从路由转发减少数据量的角度出发。随着网络中的设备逐渐憎多,路由转发数据包的路径会变得很庞大,子网划分就像城市划分一样,如果不存在城市划分,我们的快递就要一层一层的从城市,到市区,再到具体街道,再到具体房间去找到收件人。而如果城市进行了划分,我们直接将快递寄到当地城市的收件站,让当地城市收件站去负责接下来的分层配送就可以了。也就是说,我们寄件本来要流转很多环节,现在直接就能寄送到最顶层,从而减少了流转环节的负责。 路由转发数据包也是这样,有了子网后,数据包直接传到指定子网,剩下的工作交给子网去处理就可以了。这样一来,数据包转发的速度变快了,因为更容易找到目的地,让寻找到的路径接近最优,大大减少了路由器的计算量。
原因三
当初以太网发明的时候,仍然存在很多网络层协议,比如IPX/SPX协议、CLNP网络协议、Apple Talk协议,以太网需要对这些协议进行支持,如果没有MAC地址,那么识别一个网络设备就需要去读网络层协议头的地址,这就需要网卡对多种协议进行识别,增加了网卡的实现难度,而MAC地址是不管上面网络层是什么协议,网卡只需要根据MAC地址这唯一的规则去做解析,就能得到具体的MAC地址对应的设备是什么。
网卡当有了MAC地址后,就可以不依赖于任何网络层协议,来独立判断一个以太帧是否接收,简化了网卡的实现。
原因四
计算机网络自顶向下的说法:
原因五
MAC地址设计的时候本来只打算使用在局域网之中,而IP地址设计的时候是打算用来广域网中使用。如果没有IP地址的话,我们拥有MAC地址的设备A比如从路由A切换到了路由B,此时MAC地址不变,那么路由C如果想找到设备A就很麻烦了,因为它根本不知道设备A已经路由变更了,此时路由C实际上是找不到在路由B中的设备A。除非我们修改网络转发协议,制定相关不存在的补充转发规则。 如果有了IP地址的地域性,我们每次发包之前都可以直接将包塞到IP地址指定的路由中,这样就不会盲无目的的去路由搜索了。
所以IP地址可以说是保证了设备在不同局域网之中的通信,也保证了在广域网的通信。
其他问题
既然IP地址不能去掉,那么能不能去掉MAC地址呢?
也不能。因为IP地址是要设备上线以后才能根据他进入了哪个子网来分配的,在设备还没有IP地址的时候(或者分配IP地址的过程中),我们还需要用MAC地址来区分不同的设备。