有了 IP 地址,为什么还要用 MAC 地址?
估计很多人都有这个疑问,但没见哪本书上解释清楚,都只是描述IP是什么,MAC是什么。当数据包到达局域网后,完全可以直接送到对应的IP地址主机,为什么还要询问一下对应IP主机的MAC地址?
一个邮递员拿着地址详细到教室的一封信,收件人是小明,教室里没有重名的,邮递员问“小明的学号是多少?”,小明站起来回答“150807”,然后小明坐下,然后邮递员说“学号150807的过来拿信”,小明站起拿信。哎,好像重复了点什么。
1楼(未知网友)
MAC地址存在的一个意义在于网络过滤,就是允许哪些计算机或设备可以连入该局域网,增加网络的安全性,一般公司都需要这要做的。至于什么标识机器唯一性,人家换个网卡不就变了吗?没有多大意义。还有上面说到NAT,其实就是解决ip地址不够用,和MAC地址真没有关联。
2楼(未知网友)
可以类比快递:
北京张三要发快递给上海李四。
1. 找到北京顺丰(default gateway)。
2. 找到北京顺丰的公司地址(arp)。
3. 发给北京顺丰(line)。
4. 北京顺丰发现目的地是上海,需要转发给上海顺丰(route)。
5. 找到上海顺丰的公司地址(arp)。
6. 发给上海顺丰(line)。
7. 上海顺丰发现目的地是李四。
8. 找到李四的地址,利用大喇叭广播,李四住哪里?(arp)。
9. 发给李四(line)。
北京=网络地址
张三=主机地址
门牌号=mac地址
全球唯一,如果北京张三和上海李四用同一个门牌号,然后张三有一天搬家到上海,那么别人发给李四的包裹就会同时发给张三了(以太网的广播机制)。
3楼(未知网友)
我说说我的理解吧。 举例说明: 我们知道,出于历史的原因,这个世界上出现了很多的国家和民族,他们都使用不同的语言。
4楼(站大爷用户)
在同一个交换机上面,是通过mac地址来联系的,ip不起作用,三层交换机和路由器才能处理ip地址,这是因为协议分层不同
5楼(站大爷用户)
我认为从技术角度来讲MAC地址的存在不是必须的,MAC的存在算是历史遗留问题。
IP和MAC说白了都是用来标识主机的地址而已,只要能保证唯一性,用一套就行了,何必ARP/RARP什么的。当然由于IPV4急剧短缺,严重保证不了唯一性,才搞了NAT和IPV6,不过这就是另外一个问题了。
6楼(站大爷用户)
再补充一个,MAC起到网络设备的唯一识别代码的职能
7楼(未知网友)
首先纠正一下几位答题者的错误,即 MAC 地址并不是烧进 Interface(使用 Interface 而不是设备的原因是一个设备可能有多个 Interface)上的,也不一定就能保证唯一地标识一个 Interface,反而是在启动的时候填入的,换句话说用户完全可以根据自己的需求来修改 MAC 地址。
@yskin 同学的答案基本覆盖了计算机网络的基础架构,不过话说我觉得题主的疑惑是:能否在局域网内也只使用 IP 地址来标识设备?换句话说如果重新设计新的协议框架,那么能否去掉 MAC 地址这个概念?
我暂时没想出为什么不可以——我指的是将二层砍掉。只要每一个设备都维护恰当的路由表,IP 地址分配不管是静态还是动态,局域网内的包完全可以根据路由表来找到下一跳的位置。
但是,前边讨论的只是可以或不可以,我们来看一个实际的问题。三层交换机 & 路由器在收到一个包的时候,需要拆下 IP 头进行解析,根据路由表找到目标地址所对应的出端口(如果入端口上配置了 NAT,还需要进行地址转换)。这一步完成后,数据包会被包上新的 IP 头(更新地址及 TTL 等信息)然后才能发出去。
而二层交换机完全不拆 IP 头,基本是收一个包就转发一个包,快的要死。
更一般地说,三层交换机和路由器可以看做是子网与子网之间的枢纽,相当于邮局;而二层交换机只能作为单个子网内的中转站(因为它完全不知道 IP 是什么东西)。当子网很大的时候(很大指设备多,此时端口不够用;或者距离长,衰弱太严重),不可避免的需要使用中转站,此时如果用三层的未免小题大做,而且效率不佳。
8楼(未知网友)
问题的核心在于网络上的分层概念。IP地址是不区分传播介质的,他的作用是在internet网中能够投递到边界。在网络边界的局域网,有可能使用不同的层二网络,以太、wifi、ppp、3g、wimax等等。
在这个局域网中,才出现了与介质相关的终端标识。mac地址用于以太网,imsi用于3g网,线路号用于拨号上网。internet边界路由器可以在这个特定的介质网中找到特定终端。
如果没有IP地址,那么3g网络用户无法和以太网用户通信,因为没办法去做这么复杂的协议让几十种协议两两对通。即使做了,发起方也需要方法去知道对端用的是什么层二网。因此,所有网络协议都用IP,只在两头网关上做转换,就是一种设计很先进的奇妙方法。
反过来,为什么全球只要mac地址不能用于全球通信?问题在于mac地址和IP地址的汇聚性。mac地址是出厂就决定的,不是上网的时候决定的。也就是说intel设备或使用intel芯片的mac地址前面多少位是相同的,然后intel在给芯片分地址的时候保证所有的芯片没有重号的,这样才能保证随便哪个终端接入到同一个局域网中没有重复的。
这样问题就来了:网络上希望路由器的转发规则尽量简单,所以一般要用ip地址前多少位而不是整个IP地址去做转发。mac地址显然没法汇聚,前面已经讲过,工厂决定的。
给每个用户分配一个只由路由器网关决定的地址,每个网关上附着一个段,例如100.200.x.x,也就是所有以100.200开头的ip都送到这个网关上来,就可以保证internet转发规则的简单化。而且,一个用户从一个局域网离开,换到另一个局域网中,mac地址不需要变,只需要换个ip地址就行。
9楼(站大爷用户)
原题:「当数据包到达局域网后,完全可以直接送到对应的IP地址主机,为什么还要询问一下对应IP主机的MAC地址?」
真的这样了还需要费心尽力地搞IPv6干嘛。
题主:「你的前提是认为交换机是这样处理的,理所当然认为这样处理是正确的。交换机处理mac,路由器处理ip,为什么要这样设计?交换机为什么不可以处理ip?为什么要分层?」
交换机工作在二层,只认识MAC地址。如果交换机要处理IP,把二层砍掉只剩三层?呃,不觉得处理速度会很慢吗?
网络是过去几十年一步一步搭建的,兼容性什么的都要考虑。你不能说现在都有微信了,还要固定电话号码干嘛~
---------------------------------------------------------------------------------------------------------------------------
简单地说两句:
二层是这样工作的:每个接入设备口分配一个地址,一般的星形结构的网络,每台设备发出的数据所有其他设备都能收到,然后根据目标地址看是否是发给自己的。这个地址是谓MAC地址,因为身在最底层,没有设置分配机制或者自动获取机制,每台设备制作的时候固定写在里面,并且确保全球不重复,这样就不会有冲突。
当然后来也就有了交换机,也就是带有存储转发功能的集线器,可以把包存一下,看一看目标地址,然后选择某一条线路发出去。怎么知道哪条线路是哪个MAC?学咯,每条线路发来的包看一下来源地址,然后记到表里面。
二层还要解决多个设备同时发送冲突的问题,要检测,要处理,要重发等等。
三层是这样工作的:每个设备有一个IP地址,也要保证唯一。这个IP地址可以手工分配,也可以通过DHCP获取。手工分配的时候需要注意保证唯一。局域网内想联系一个IP地址,先要知道对应的MAC地址,这时候走二层的ARP全网问一下就可以了。反过来,自己作为新设备想要一个IP地址,要么RARP要一个,要么走基于UDP的DHCP要一个,当然都只限于局域网内。
有了这些底层的东东,每台设备都有了自己的IP地址,这样就可以互相通信。三层的关键在于,有了路由器,路由器用于将不同的网段连接在一起,并对两个网段间的通信进行存储转发。比如A网络10.0.0.0/24,B网络10.0.1.0/24,中间有一路由器隔着,两边的网关都是.1。10.0.0.2要发信给10.0.1.2,那么先看子网掩码,发现不在自己网络内,然后交给10.0.0.1,路由器看到在网络B内,从10.0.1.1发出,然后到达10.0.1.2。
假如这俩网络没有路由器,直接走二层,那么多电脑连在一起,广播包就会占掉大量的网络带宽。
路由器,顾名思义就是要找路用的。比如B网络还用一个路由器连接着C网络10.0.2.0/24,那么A网络一台机器要发包给C网络的一台机器,路由器怎么知道怎么走法呢,于是需要路由协议,路由器之间要说说话,了解一下对方的状态。
再往大了去,就是互联网了。中国的一台电脑要连接美国微软,那么发出的包先到宽带运营商,然后到北京出口,然后觉得现在走欧洲到美国慢,于是转到上海,走海底光缆到了美国,再走旧金山,到西雅图,再到雷德蒙。如果只有MAC地址,是无法支撑起这么大的网络的,你觉得直接访问到MAC地址就行了,问题是你让路由器怎么给你找到路线呢?
所以,对于原题「都只是描述IP是什么,MAC是什么。当数据包到达局域网后,完全可以直接送到对应的IP地址主机,为什么还要询问一下对应IP主机的MAC地址?」
你缺乏网络知识,搞不清NAT的含义,只以为公网就是用IP的,局域网就是用MAC地址的。
如果你本身用的公网IP,那么全部走IP访问即可。如果是局域网多台电脑共用公网出口,那么首先要做的是NAT转换,这个是要在4层TCP和UDP上做的。只在二层无法完成。
你说的东西更像IPv6,这样不需要再做NAT,所有内网设备都可以分配一个IPv6地址。
不知道题主想的明白不,我猜肯定想不明白,哼哼~
10楼(站大爷用户)
长话短说,理由有三点。
一. 整体与局部
信息传递时候,需要知道的其实是两个地址:
终点地址(Final destination address)
下一跳的地址(Next hop address)
IP地址本质上是终点地址,它在跳过路由器(hop)的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。
这就是为什么还要用MAC地址的原因之一,它起到了记录下一跳的信息的作用。
注:一般来说IP地址经过路由器是不变的,不过NAT(Network address translation)例外,这也是有些人反对NAT而支持IPV6的原因之一。
二. 分层实现
如果在IP包头(header)中增加了”下一跳IP地址“这个字段,在逻辑上来说,如果IP地址够用,交换机也支持根据IP地址转发(现在的二层交换机不支持这样做),其实MAC地址并不是必要的。
但用MAC地址和IP地址两个地址,用于分别表示物理地址和逻辑地址是有好处的。这样分层可以使网络层与链路层的协议更灵活地替换,网络层不一定非要用『IP』协议,链路层也不一定非用『以太网』协议。
这就像OSI七层模型,TCP/IP五层模型其实也不是必要的,用双层模型甚至单层模型实现网络也不是不可以的,只是那样做很蛋疼罢了。
三. 早期的『以太网』实现
早期的以太网只有集线器(hub),没有交换机(switch),所以发出去的包能被以太网内的所有机器监听到,因此要附带上MAC地址,每个机器只需要接受与自己MAC地址相匹配的包。