文末本文转载自微信公众号「飞天小牛肉」,作者飞天小牛肉 。转载本文请联系飞天小牛肉公众号。
一个邮递员拿着地址详细到教室的一封信,收件人是小明,教室里没有重名的,邮递员问 “小明的学号是多少?”,小明站起来回答 “12345”,然后小明坐下,然后邮递员说 “学号 12345 的过来拿信”,小明站起来去拿信。好像有点多此一举?
问题:
当数据包到达局域网后,完全可以直接送到对应的 IP 地址主机,为什么还要询问一下对应 IP 主机的 MAC 地址?
或者换种问法:
既然有了 IP 地址用来唯一标识这台计算机了,那还需要 MAC 地址干啥?
首先,我来简单的解释下 MAC 地址所属的数据链路层和 IP 地址所属的网络层的用途:
两个计算机在计算机网络之间进行通信,不可能就一条数据链路,对吧,它会经过很多条数据链路,也可能还要经过很多的通信子网,那么网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。
然后,需要明白的是,一台计算机向网络中的另一台计算器进行通信的时候,需要知道的其实就是三个地址:
- 起点地址
- 下一跳的地址
- 终点地址
IP 地址负责起点地址和终点地址,下一跳的地址由 MAC 地址负责。
结合这两点,我们来归纳下数据链路层和网络层的关系:
通俗来说,数据链路层的作用很简单,它是无脑的,只负责在两个相邻节点之间传送数据,它并不知道它所传送的数据最终目的地是哪。而网络层便是它的大脑,网络层负责指定起点地址和目的地址,并告诉数据链路层该走哪条路线。
看下图,网络层告知了 1-2-3 路线,那么数据链路层就会根据 MAC 地址依次找到 1、2、3,并在他们之间传输数据:
1)网络层指定了从哪个主机(「源 IP 地址」)发送到哪个主机(「目的 IP 地址」)。源 IP 地址和目标 IP 地址在传输过程中是不会变化的
2)而数据链路层则是根据 MAC 地址在一个接一个的区间中进行传输的,每个区间内的出发地址即「源 MAC 地址」,每个区间内的目的地址即「目的 MAC 地址」。显然,随着数据的传输,源 MAC 地址和目的 MAC 地址会不断的发生变化
再举个形象点的例子:
我们把数据链路层看作一个乘坐高铁从苏州到南京,再在南京转乘到北京,再在北京转乘到西藏的旅客(一个没脑子的机器人),那么网络层就相当于每个车站的工作人员,在数据链路层这个没脑子的机器人每次转乘时,网络层就会为其购买一张标有下一个 MAC 地址的车票。因此,即使数据链路层(旅客)不知道往哪走也没有关系,工作人员(网络层)会给你做出指引:
如果没有 MAC 地址,仅仅只有 IP 地址,能不能完成这些事情?
从理论上来说,如果 IP 地址够用,交换机也支持根据 IP 地址进行转发,我们只需要在 IP 数据报中加一个 “下一跳 IP 地址” 的字段就行了,MAC 地址确实并不是必要的。
But,从宏观来说,IP 地址只管上层建筑即路线规划,底层具体走的逻辑交给 MAC 地址来做,这样其实才符合 TCP/IP 协议体系这种分层的理念!
所以,这种设计并非多次一举,而是为了符合最根本的设计理念。