问题

有了 IP 地址,为什么还要用 MAC 地址?

回答
这绝对是一个很好的问题,很多人都会疑惑:既然有了 IP 地址,可以唯一地识别网络上的设备,为什么还需要 MAC 地址呢?实际上,IP 地址和 MAC 地址在网络通信中扮演着不同的角色,并且是相辅相成的,缺一不可。

要详细解答这个问题,我们需要从计算机网络的分层模型(OSI 模型或 TCP/IP 模型)来理解。在这里,我们主要关注数据链路层(Data Link Layer)和网络层(Network Layer)。

1. 网络通信的分层模型与各自的职责

为了让网络通信变得有序和高效,计算机网络的设计者们引入了分层模型。每一层都负责特定的功能,并向上层提供服务。

数据链路层(第二层):
主要职责: 在同一物理网络(例如一个局域网 LAN)内的相邻节点之间传输数据帧。它负责将来自网络层的 IP 数据报封装成数据帧,并在物理介质(如网线、无线电波)上传输。
寻址方式: 使用MAC 地址进行寻址。
工作范围: 局限于一个广播域,通常是同一个子网或交换机连接的设备。

网络层(第三层):
主要职责: 在不同网络之间(跨越多个路由器)传输数据包,实现端到端的通信。它负责为数据包选择最佳路径(路由)。
寻址方式: 使用IP 地址进行寻址。
工作范围: 覆盖整个互联网,实现逻辑上的连接。

2. IP 地址的作用:全球范围内的标识和路由

全球唯一性(理论上)和可变性: IP 地址(无论是 IPv4 还是 IPv6)用于在全球范围内的互联网上逻辑地标识一个设备。就像一个人的家庭住址一样,它指明了你的“家”在哪里。
可路由性: IP 地址是可路由的,这意味着路由器可以通过 IP 地址来决定如何将数据包从源设备转发到目标设备,即使它们不在同一个局域网内。路由器根据 IP 地址的逻辑网络结构来做出决策。
灵活性和动态性: IP 地址是逻辑地址,可以被分配、更改,甚至被动态分配(如通过 DHCP)。当你的设备连接到不同的网络时,你的 IP 地址很可能会改变,但这并不影响你与其他设备进行通信,因为新的 IP 地址依然能让你在新的网络中被识别。
逻辑寻址: IP 地址更多的是一种逻辑上的标识符,它与设备的物理位置或硬件本身没有直接的、固定的绑定关系。

3. MAC 地址的作用:局域网内的物理寻址和硬件标识

现在,我们来重点看看 MAC 地址为什么是必需的,即使有了 IP 地址:

硬件唯一性: MAC 地址(Media Access Control Address)是烧录在网络接口卡(NIC)上的固化地址,由硬件制造商在生产时就分配好了,理论上是全球唯一的。它就像设备的“身份证号码”,永远不会改变。
物理寻址: MAC 地址用于在同一个局域网内,将数据帧从一个节点直接发送到另一个节点。交换机就是根据 MAC 地址来转发数据帧的。
设备标识: MAC 地址代表了设备物理接口的身份。

为什么 MAC 地址在局域网通信中至关重要?

想象一下你要寄一封信。

IP 地址就像信封上的“收信人家庭住址”。 你需要知道你家(你的 IP)和收信人家(目标 IP)在哪里,这样邮递员(路由器)才能知道把信送到哪个城市、哪个街道。
MAC 地址就像收信人“家门口的门牌号”或者“房间号”。

当你有一个 IP 地址(例如 192.168.1.100)要发送数据给另一个 IP 地址(例如 192.168.1.200)时,它们可能都在同一个局域网内(例如你的家庭 WiFi)。

交换机的工作原理:
交换机连接着局域网内的所有设备。它有一个MAC 地址表(也叫 CAM 表或转发数据库),记录着连接到它每个端口的设备的 MAC 地址。
当交换机收到一个数据帧时,它会查看这个数据帧的目标 MAC 地址。
然后,它在自己的 MAC 地址表中查找这个目标 MAC 地址,并将其转发到与该 MAC 地址相对应的端口。
如果没有找到目标 MAC 地址,交换机可能会将数据帧广播到所有端口,希望目标设备能响应(这就是 ARP 的作用之一)。

没有 MAC 地址会怎样?
如果只有 IP 地址,交换机就无法知道数据帧应该发到哪个端口。它只知道数据包的目标是“192.168.1.200”,但不知道“192.168.1.200”的网卡具体是哪个端口连接的。它无法进行这种点对点的物理链路层转发。

4. MAC 地址和 IP 地址的协作:ARP 协议

最能体现两者协同工作的例子就是 ARP (Address Resolution Protocol) 协议。

场景: 当你的电脑(IP 地址 A)要向同一局域网内的另一台电脑(IP 地址 B)发送数据时。
过程:
1. 你的电脑知道 IP 地址 B,但不知道 IP 地址 B 对应的 MAC 地址。
2. 你的电脑会发送一个 ARP 请求广播包到局域网,询问:“谁的 IP 地址是 IP 地址 B?请告诉我你的 MAC 地址。”
3. 只有拥有 IP 地址 B 的电脑(或者路由器缓存了相关信息)会响应这个 ARP 请求,并发送一个 ARP 回复包,告知它的 MAC 地址。
4. 你的电脑收到 ARP 回复后,就将“IP 地址 B > MAC 地址 X”的映射关系保存在自己的 ARP 缓存中。
5. 然后,你的电脑将数据包封装到数据帧中,将目标 MAC 地址设置为 MAC 地址 X,然后发送给交换机。交换机根据 MAC 地址 X 将数据帧转发到正确的端口。

如果没有 MAC 地址: 电脑就无法知道应该向哪个“物理接口”发送数据。ARP 请求也无法被正确处理和响应。

5. 更深层次的解释:网络层和数据链路层的边界

IP 地址在网络层运作: IP 地址负责端到端的路由,是逻辑上的“目的地”。它不关心数据在物理链路上的具体传输方式。路由器之间的通信,就是在 IP 数据包的基础上进行的,路由器之间有自己的数据链路层连接(可能通过点对点的租用线路、以太网等)。
MAC 地址在数据链路层运作: MAC 地址负责在一个本地网络(LAN)内进行实际的“邮递”。它负责将数据从一个网络接口卡传递到另一个网络接口卡。当 IP 数据包跨越路由器时,它的 IP 地址不变,但数据帧的源 MAC 地址和目标 MAC 地址会在每一跳(hop)中都发生变化。

举例: 你电脑 (MAC_A, IP_A) > 路由器1 (MAC_R1_WAN, IP_R1_WAN) > 路由器2 (MAC_R2_LAN, IP_R2_LAN) > 目标电脑 (MAC_B, IP_B)

1. 你电脑 > 路由器1: 数据帧是 `MAC_A > MAC_R1_WAN`,IP 包是 `IP_A > IP_B`。
2. 路由器1 > 路由器2: 路由器1 收到数据帧,剥离 `MAC_A` 和 `MAC_R1_WAN`。根据 IP 包的路由信息,找到下一跳是路由器2的某个接口(例如 `IP_R2_LAN`)。路由器1会用自己的另一个接口的 MAC 地址(例如 `MAC_R1_LAN`)封装新的数据帧,目标是路由器2的 MAC 地址(`MAC_R2_WAN`),发送给路由器2。数据帧是 `MAC_R1_LAN > MAC_R2_WAN`,IP 包仍然是 `IP_A > IP_B`。
3. 路由器2 > 目标电脑: 路由器2 收到数据帧,剥离 `MAC_R1_LAN` 和 `MAC_R2_WAN`。根据 IP 包的路由信息,发现目标 IP_B 在它连接的本地网络中,通过 ARP 找到目标电脑的 MAC 地址 MAC_B。路由器2将数据帧封装为 `MAC_R2_LAN > MAC_B`,IP 包仍然是 `IP_A > IP_B` 发送给目标电脑。

可以看到,在路由器之间传输时,MAC 地址一直在变化,而 IP 地址(源和目标)却保持不变。这就是 IP 地址负责“端到端”路由,而 MAC 地址负责“跳到下一跳”的局部交付。

6. 总结:为何两者缺一不可

1. IP 地址: 提供逻辑上的全球寻址能力,用于在不同网络之间实现端到端的通信和路由。它允许网络灵活扩展和重构。
2. MAC 地址: 提供物理上的本地寻址能力,用于在同一个局域网(广播域)内的相邻节点之间进行可靠的链路层数据传输。它是硬件的唯一标识。

简而言之,IP 地址让你知道要去哪里(逻辑目标),而 MAC 地址告诉设备如何实际地把东西送到那里(物理路径上的下一站)。没有 MAC 地址,IP 包无法在同一个局域网内被正确地传递到目标网卡。没有 IP 地址,数据包无法被路由到正确的网络。

就像你想去北京(IP地址),但你还需要知道从你家到火车站(路由器)的具体街道和门牌号(MAC地址),然后火车到了北京火车站(另一个路由器),你还需要知道怎么从火车站到你具体的酒店(目标IP的MAC地址)。这个过程,MAC 地址在每一段的“本地传递”中都发挥着关键作用。

网友意见

user avatar

有个路由器固件叫Rosuter OS,这个路由不需要电脑设置相同网段的IP地址,其工具winbox直接能搜索出路由的mac地址,然后连Mac地址进入路由配置。

user avatar

看了一下,大家说的基本都是教科书上的内容(或者演绎)。今天给大家说点教材上没有说的内容。

点对点链路

最早的网络是「猫」+电话线。一台电脑接一个猫,连一条电话线。理论上只要完成拨号,双方就能进行通信。这个过程跟两个人电话没什么两样。

因为是一条电话线的两头,这边电脑发出的所有信号自然会被另一端的电脑收到。所以不需要给双方指定 MAC 地址或者 IP 地址之类东西。这种链路叫点对点链路

Mesh 拓朴

点对点链路的优点是简单清晰,但缺点也很明显——不支持连接多台电脑。如果你想连多台电脑,就需要给电脑配置多个猫。如果有多台电脑需要相互连接,就需要每台的电脑的每个猫都连到一起。这样做不但成本很高,管理负担也非常重。这种连接方式叫全网状(Full Mesh)拓朴网络。

Mesh网络也不是一无是处,它最大的优点就是可靠性高。网络中的部分链接出现故障不会影响到整个网络。但成本高,维护困难的缺点真是抗不住。

成本高归高,计算机之间还是以点对点的方式进行通信。所以这类网络本质上跟第一种点对点链路没有区别。设备之间的通信也不需要设置 MAC 或 IP。

总线网络

为了降低成本,人们想了另外一种连接方式,总线网线。

之所以成本低,是因为所有的电脑只需要接一个猫,然后所有猫接到同一条网线上(叫总线,早期使用的是同轴电缆)。

CSMA/CD

组网成本确实降低了,但使用成本却上升了。如果上图中A想给B发数据,可以启动自己的猫开始发送。如果此时C也给D发数据,那就会形成干扰,最终谁的数据也发不出来。为了解决这个问题,人们规定,如果想发数据,必须先使用自己的猫「听」一下网线上有没有其他电脑正在通信。如果有,就自觉等待一段时间,然后再检查。这套机制后来演化了成载波侦听多路访问/碰撞检测(CSMA/CD)机制。教科书上都会讲这个CSMA/CD。

MAC 地址

解决了冲突问题,总线网络就能工作吗?不能!我们在前面讲的点对点链路两边各有一台电脑,收发双方非常明确,不需要指定MAC或者IP。但在总线网络中,所有电脑共享一条电缆,可以同时接收网络上的全部信号。那大家怎么确定数据是发给自己的呢?

为了解决这个问题,人们发明了数据帧的概念。帧是发送数据的最小单位。当时是用很多链接层协议,以太网只是后面设计的一种。但不同的帧结构大同小异,核心都包含目标地址、源地址和数据三部分。

这里首次出现了地址这个概念。正是因为总线网线中所有设备共享总线,所以需要通过引入地址的概念来区分不同的设备。对于以太网,这个地址就是我们常说的MAC地址。这个时候的「猫」就已经变成了我们现在常说的网卡了。以太网规定MAC地址占6个字节,也就前面说的48位。

所有发出的包都带着目标电脑的MAC地址。网络中所有设备收到数据后会自觉比较目标地址是不是自己,如果不是就丢弃。你没看错,全凭大家自觉。这样就解决了不同电脑之前相互通信的问题。

引入地址的概念,也就产生了新的问题——如何给计算机设置MAC地址呢?不同的网络有不同的处理方式。

ARCNET 网络

曾经有一种叫 ARCNET 的网络协议,它的MAC地址只有1个字节(8位),需要网络管理员通过网卡上的拨动开关手工设置。好在当年能连网的设备很少,8位地址可以支持最多256台设备连网,也够用了。

以太网则规定在网卡出厂的时候就得分配 48 位 MAC 地址,全球唯一。

网桥

随着总线网络的普及,越来越多的大公司或组织(主要是大学)开始使用网络连接它们的设备。为了方便传输数据,人们还发明了网桥。可以把网桥想象成装有多个网卡的设备,每个网卡连接一个总线网络。网桥唯一的作用就是把从一个网卡收到的内容原样转发到另一张网卡所在的网络

这样网络的规模越来越大,连网的设备越来越多,通信冲突的频率也越来越高。最终的结果就是数据传输的速度越来越低(因为只要有一人在发数据,其他所有人都得等待)。但就这样,人们对互联互通的要求还没有被满足。除了公司或者组织内部的网络,人们还想把不同城市的设备和网络都连起来,这就需要用到长途电话线。

我们前面说过网桥是一种无脑转发设备。它的无脑不仅体现在不关心数据内容方面,还体现在尽自己最大能力转发。如果是相同局域网,两边的网速相近,那不会有什么问题。但如果一边是局域网,一边是长途电话线,那来自局域网的广播数据会把电话线挤爆,大家谁也别想玩。

IP 协议

事情发展到这步田地,就需要人们(另一拨人)坐下来开会讨论了。最终,想了一个办法,就是让网桥变的智能一点。让它可以「学习」不同网络所有设备的MAC地址。当有数据需要转发的时候,它可以根据目标地址判断应该转发到哪个网卡,从而减少广播的数量。

但是,因为以太网的MAC是在出厂的时候指定的,所以没有一个简单的办法确定某个总线网络中的所有MAC地址,只能通过广播来学习,也只能在网桥设备保存全部的MAC地址,而且还要及时更新。除此之外,网桥本身只转发,理论上也不需要MAC地址。所以网络内的计算机不知道数据是经过几个网桥转发的,也不知道是在哪个环节出了问题。

最终,另一拨人(IETF)想出了再加一层的方案,也就是在以太网上引入了网络层(也就是IP层)。注意,网络层是IETF这拨人鼓捣出来的,以太网是IEEE那拨人鼓捣出来的。IETF这拨人决定给每一台网络设备加一个逻辑地址,也就是IP地址,而且觉得32位差不多够用了,甚至都没考虑 MAC 地址是48位。

引了IP协议层,前面说的网络问题基本得到解决。

IP 路由

首先,每一台设备都有一个IP地址。通信双方使用IP地址进行通信。IP地址是管理员按需指定的,可以根据前缀聚合。所以原来的网桥(现在变成了路由器)不需要保存网络中的所有MAC地址,只要保存网络前缀就能进行转发。

但问题来了,网络层工作在链路层之上。要想通信,还得需要MAC地址。怎样才能得到目标的MAC地址呢?这就需要用到ARP协议。

ARP 协议

每当电脑在通信之前会先在网络上发一个广播(这个广播不会被转发到其他网络),问谁的IP地址是某某某。这个时候对应的电脑就会回包说是我,我的MAC地址是某某某。发送方就拿到了接收方的MAC地址,进而完成通信。

如果目标电脑在另一个网络,这个时候发送方就会在自己的网络里广播说谁的IP是192.168.1.1(我们假设它的默认网关IP是192.168.1.1),网关就会回复自己的MAC。然后,发送方就会通过网关的MAC地址给网关发一条IP报文,报文的目标IP就是接收方的IP地址,来源IP自然是发送方的IP地址。

以上图为例,假如H1想给H2发数据。H1知道H2跟自己不在一个网络,所以它通过ARP查到R1的 Gi0/1 网卡的 MAC 地址,给 fa16.ee3f.fd3c 这个 mac 地址发送了一个 IP 报文,这个报文的目标IP是H2的IP地址,也就是 192.168.2.2,原IP地址是H1的IP,也就是192.168.1.1。 R1收到这个报文后发现目标地址是192.168.2.2,需要通过 Gi0/2 网卡转发给路由器 R2(因为R1保存了 H2 所在网络的前缀)。R2 会重复同样的过程,最终IP报文被转发给H2。

整个过程,H1和R1都不需要知道H2的MAC地址,但所有节点必须知道相临节点的MAC地址(也叫下一跳)。所以说,到现在为止,哪怕是引入了IP层,实际通信还是依赖MAC地址。

交换机

在IP网络中,如果目标在同一网络,则通过广播通信;否则,通过网关转发。因为有广播的存在,所以网速还是会受到影响。这时局域网也叫冲突域:

大家不要误会。因为IP网络引入了路由器,所以跟原来的总线网络相比,冲突域变小了,广播减少了,网速提高了。但人民群众的要求也提高了,网速必须更快!

于是,人们又发明了交换机。交换机是一种局域网设备,功能跟前面说的网桥类似。

但是,交换交换机可以进一步减少广播的数量。以上图为例。如果A想给C发送数据,它会先通过ARP广播查询C的MAC地址。这一步是免不了的。但是,这一步也会被交换机监听/学习到,所以交换机会将C连接的网口跟C的MAC地址绑定到一起,等A给C发数据的时候,交换机只会给C发数据。这个时候B和D都收不到数据。不但收不到,B和D还可以在A与C通信期间进行通信,这就进一步提高了网络的利用效率。

MAC 地址的去留

因为有了交换机,所以原来的总线拓朴在一定程度上变成了星形拓朴。又因为交换机可以隔离不同设备间的通信,所以总线网络一定程度上又变成了点对点网络。

那我们能不能最终去掉MAC地址,而只保留IP地址呢?理论上是可行的。交换机既然可以学习MAC地址,那就一定可以学习IP地址。这样,每个网口所连电脑的IP映射关系也就知道了。电脑A如果想给C发数据,可以不查C的MAC地址,而是直接给交换机发一个IP报文(注意,这次没有MAC帧)。交换机收到后直接转发给电脑C。整个过程就仿佛回到了最开始的点对点链接路。是不是有点历史轮回的感觉呢?

现在没有去掉MAC地址,可能是因为以太网设备已经遍布全球,也足够便宜,已经没有必要再优化了。但从原理上看,MAC地址确实可以去掉。

IPv6 网络

虽然没有消灭MAC地址,但IPv6引入了所谓的 link local address,这种地址以 FE80 开头,只在当前链路有效。什么意思,你可以给同一设备的不同网卡设置相同的 link local address。比如你有一个路由器,所有的网卡都设成 FE80::1,那可以把连接这个路由器的所有网络的主机的下一跳地址都设成 FE80::1,而不论主机所在的实际网段是什么。这在管理上比较方便。之前 IPv4 时代只能不同网卡设不同地址,分开配置,比较麻烦。

我们前面说过,现在的网络拓朴有点绕回原来的点对点网络。如果能让设备直接跟路由器相连,那么所谓的 Link 上就只有两个设备,这是典型的点对点链路。这个时候设备相要发IP报文,可以直接发给 FE80::1。从而完全去掉 MAC 地址。

以上就是全部内容,如果还没明白,可以私信或讨论。

如果喜欢请点赞支持,不要光收藏哈

user avatar

题主估计不知道啥叫DHCP协议吧。。

你以为IP是怎么来的??IP地址是靠DHCP协议分配的啊!!!DHCP协议靠啥分配IP地址呢???MAC地址啊。。。

IP地址是你家的地址。MAC地址是你的身份证号码。。的确可以靠你家地址找你。但是,你也可以搬家啊。。

user avatar

CISCO 的培训资料上解释的很清楚。



来来来, 咱复习一下网路知识。





为什么要分层和封装?


使用封装似乎很浪费:如果原始数据很小,那么电线上的数据包可能主要是来自各层的头文件。这就是开销,会降低传输的有效吞吐量。

当然,直接把数据放进链路层会更好?


使用层的想法是为了灵活性。

假设我们的机器里有一块10Mb的网卡,而有人想出了一个改进的100Mb网卡。因为物理层与数据链路层(几乎)是完全分开的,我们可以为100Mb的物理层写一个新的标准,然后把它放在原来的10Mb的地方。上层甚至不需要知道硬件已经改变。

想象一下,每当网络中发生变化时,就必须重写每个电子邮件程序、网络浏览器和其他应用程序。

这就是为什么我们需要仔细地分离功能:

网络层和上面的层当然不应该知道你在使用什么硬件。


事实上,上面的例子已经发生了好几次:

互联网运行在(除此之外),10Mb以太网、100Mb以太网、1Gb以太网、10Gb以太网、电话线(SLIP和PPP)、无线电。

坐在终端的用户根本不知道他们脚下发生了什么。


原则上,你可以使用信鸽作为物理层,而你的浏览器应该不会有任何变化,除了速度变慢之外,也许。


事实上封装甚至可能不会止步于此,即物理层。

例如,以太网的大小是有物理限制的(光速问题),那么我们怎样才能连接起一个跨越大西洋的以太网呢?

我们可以做的一个方法是将以太网的流量在一些其他类型的网络中建立隧道,例如ATM或SMDS。这些协议可以在很远的距离上工作。

我们只需将一个以太网数据包塞进ATM网络,它就会从另一端跳出来,继续在它的以太网世界里工作。ATM协议(本身是一个链路层协议)被作为数据链路层使用。

在实践中,事情当然更复杂,我们倾向于在网络层上进行隧道,因为这更有效率。



分层的一个比喻:

假设你要给国外的朋友送一份礼物,比如法国。

你把礼物安全地包裹起来("用牛皮纸封装礼物"),你给包裹加上正确的地址("添加标题"),然后把它交给邮局。邮局把包裹放在飞往法国的飞机上('把它封装在飞机上')。当飞机到达法国时,包裹被 "解除封装",继续其旅程。

当它到达目的地时,你的朋友解除了包裹的封装,发现了这个礼物。



原则上,你可以使用信鸽作为物理层,而你的浏览器应该不会有任何变化,除了速度变慢之外,

也许。


【未完待续】

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有