您所描述的实际上非常接近 IP路由在幕后的工作方式——当不涉及 NAT 或“端口转发”时,路由器通过仅更改其目标 MAC 来转发数据包,并且在技术上不需要知道 IP 地址的设备。
例如,在路由表中(我指的不是“端口转发”规则)你有一个“网关”或“下一跳”字段,传统上是一个 IP 地址,但它的唯一目的是被解析到一些一种低层地址,因此路由表可以很好地直接接受 MAC 地址。
但尽管如此,出于各种原因,路由表条目仍需要 IP 地址。首先,使用 IP 地址是一种有用的抽象,这要归功于使用 ARP(或 NDP)来动态解析 MAC 地址:实际网关可以更改其以太网接口,但只要它采用相同的 IP 地址,相同的旧路由配置仍然有效。
另一个原因是只接受一种地址类型比接受多种更简单。即使是典型的家庭网关也不是纯粹为以太网构建的:ADSL 调制解调器已经必须处理两个完全不同的 MAC 层,因此其路由表需要接受两种不同的下一跳地址类型。
因此,接受 IP 地址并依靠现有机制来转换它们实际上更简单——ARP 等机制无论如何都需要存在。此外,尽管有额外的转换,但它简化了事情,因为这意味着所有数据包都以相同的方式处理,无论它们是被传送到最终主机还是另一个网关,而不是有两种不同的情况。
(但有些网络实际上使用 IPv6 nexthop 地址作为 IPv4 网络路由。源网关的 OS 只是使用 NDP 而不是 ARP 来解析 nexthop 网关的 MAC 地址,而不会对转发的实际 IPv4 数据包进行任何更改。)
对于“端口转发”,一些相同的原因也适用,例如将 IP 地址与物理主机分开的能力。但更重要的原因是因为“端口转发”是后来才添加到 IP 网络中的,所以它的实现方式使得最终主机不需要意识到它的发生:与普通路由不同,“端口转发” -forwarded”数据包的实际目标 IP 地址(IP 标头中的地址)从路由器的 WAN 地址转换为您指定的内部地址。
换句话说,需要提供 IP 地址,因为与普通路由相比,“端口转发”的整个要点是将目标设备的 IP 地址放入数据包中。结果是目标设备认为它确实是“转发”连接的目的地,并且不会因接收到带有路由器 IP 的数据包而感到困惑(它通常会丢弃 - 或者更糟,转发回路由器)。
可能还有其他方法可以在多个设备之间实现类似的“共享”IP 地址,但它们需要对设备本身进行更改。例如,如果您只是直接将相同的公共 IP 地址分配给所有 LAN 主机和路由器——让它们接受未修改的数据包,具有公共 IP 地址——设备无法再相互通信,因为所有他们有相同的地址。(请记住,许多 IPv4 堆栈不允许每个接口有多个 IP 地址,因此不能同时分配公共地址和本地地址。)相比之下,完成的转换
(另一种可行的方法是为每个设备分配一个公共 IP 地址,从而使“端口转发”规则变得不必要并完全依赖于标准路由。)
另一个相关的想法是,端口不是一个普遍的概念,而是专门属于 TCP——它本身依赖于 IP——所以尽管在技术上可能有一个规则“如果端口 80,转发到 MAC x:y:z”,与硬件地址相比,将 TCP 端口与特定 IP 地址(即紧接的下一层)相关联在逻辑上更有意义。
已经有很多方法可以在以太网之上构建网络但无需 IP(其中一些方法过去比 IP 更流行),例如 NetBIOS、DECnet、IPX、VINES、X.25、AppleTalk 只是其中几种过去在 LAN 和 WAN 上使用的协议。但最终,几乎所有此类网络要么迁移到IP,要么消失。(基于 X.25 的 WAN 或“公共数据网络”曾经很大,直到它们被基于 IP 的网络取代。)
尽管您仍然可以在不依赖 IP 的情况下构建一个 LAN,但如今任何 LAN 都不可避免地需要与一个主要的基于 IP 的网络(Internet)进行通信,因此如果您有一个仅使用 MAC 地址的非基于 IP 的本地网络,除了本地 MAC 地址之外,程序仍然需要了解 Internet IP地址。
这将意味着程序和操作系统将需要处理两种不同的网络类型——如果另一台主机位于 LAN 内,则使用 MAC 地址访问它;如果该主机位于 LAN 外,则使用 IP 地址。这与当前在“端口转发”时为本地主机使用私有 IP 地址和公共地址的问题非常相似,但严格来说更糟。
(公平地说,这有点像目前 IPv4 和 IPv6 在现代网络上的共存,程序需要同时支持两者——但 IPv6 有实际存在的需要,它的存在旨在统一网络,而假设的 MAC -address-only 网络只会将它们分开更多而没有任何实际优势。)
即使同一网络内的主机可以只使用它们的 MAC 地址进行通信,一旦内部主机需要向 Internet 发送一些数据包,您仍然需要一个额外的标头,它至少可以包含目标 IP 地址,并且路由器需要在两种数据包类型之间进行转换——一方面是常规 IP,另一方面是假设的“非 IP,但请传送到 IP 地址”LAN 协议。这是可行的,但比仅在双方使用相同类型的 IP 复杂得多。
重要的一点是,“私有”IP 地址是 IP 网络中很久以后才添加的——当前私有 IP 地址和公共 IP 地址之间的转换并不是 IP 工作方式的自然组成部分,而主要是由“通用家庭路由器”带来的“ 多年后。在此之前,LAN 中的主机(如果 LAN 使用 IP)曾经像 Internet 上的任何其他地方一样只有公共 IP 地址——数据中心中的服务器仍然如此——并且不需要“端口转发”,因为你可以访问任何主机通过它自己的地址。
总的来说,这首先与 IP 的存在有些矛盾——网络层协议的整个目标是统一不同类型的网络。目前,您家庭 LAN 中的 IP 与您办公室或大学或各种公共网络或 Internet 其余部分的 IP 的工作方式完全相同。
(以类似的方式,IP over Ethernet 的工作方式类似于 IP over cable 的工作方式类似于 IP over ADSL 的工作方式类似于 IP over 3G/4G,即使这些网络类型中的每一种都有完全不同的 MAC 层,有时甚至没有“MAC”的概念地址”。)
考虑一个有笔记本电脑的学生。当他把它带到大学时,那台笔记本电脑必须处理公共 IP 地址并运行通过 IP 地址和端口识别连接的软件(没有“家庭路由器”可以翻译)。当他将膝上型电脑带回家时,希望所有相同的软件都能正常工作。如果家庭网络通过 MAC 地址和端口而不是 IP 地址和端口来识别连接,则您需要一套完全不同的网络软件才能在家中使用。想象一下在学校网络万维网浏览器程序和家庭网络万维网浏览器程序之间保持书签和 cookie 同步的痛苦。
通过让家庭路由器在非 Internet 端使用相同的“Internet 协议”,计算机就不需要两种不同类型的网络。
首先,互联网并不是真正设计为具有“私人地址”。连接到互联网的设备应该有一个互联网地址(即公共 IP 地址)。互联网上的其他设备使用它的互联网地址与它对话。MAC 地址是本地网络/逐跳详细信息,对连接另一端的设备不可用。
所以现在假设,出于各种原因,您需要打破该惯例并在多个设备之间共享一个公共 IP 地址,同时让它们的功能基本相同。每个设备仍然需要/期望有一个 IP 地址,所以你给它们私有地址,然后你在网络边界逐个连接地在公共地址和私有地址之间进行转换——这就是 NAT(网络地址转换) ).
那么为什么我们不能接受你的建议,只接受传入的数据包,查找它的流属于哪个设备,在它上面打上正确的目标 MAC 地址,同时保持 IP 地址相同,然后让交换机将它发送到正确的端口?我们有点可以,但这意味着所有内部设备的接口都必须配置相同的外部 IP 地址。严格来说,这并非不可能,但这已经够让人头疼的了,它不会给你带来任何好处。
拥有在 IP 上运行的设备并以这种方式控制路由是互联网的构建方式。现在的计算机都内置了软件,但情况并非总是如此。要以不同的方式做到这一点,您将不得不提出自己的协议和软件,这只会增加复杂性并削弱安全性。访问网页涉及建立 TCP 连接,该连接本身涉及发送的与 HTTP 无关的 IP 数据包。实际上您在技术上不需要 TCP 甚至 HTTP 的 IP,您可以有一个串行连接并直接在其上执行 HTTP 请求,但那有什么乐趣呢?IP 使全球互联网成为可能。
假设您的路由器只是使用您的 MAC 地址通过以太网将数据发送到您的计算机。您的计算机应该如何处理它刚刚获得的这块数据?你的操作系统必须有一些东西来监听这些不针对你的 IP 地址的数据。然后它将必须以某种方式解释它以确定如何处理它。这必须符合您最初在路由器中指定此数据的目的。您将需要某种类型的数据头,路由器可以发送这些数据来告诉您的计算机数据的用途。 恭喜,您刚刚开始开发一个没人想要或不需要的新协议!
您的计算机和路由器已经在数据链路层上使用它们的 MAC 地址通过以太网相互发送数据。这些数据中的大部分都是封装的 IP 数据报,可以让您连接到互联网,因为它们会告诉您的路由器数据应该去哪里。
如果您问为什么不只允许您输入 MAC 地址以仅路由传入请求,那么我会问您为什么要这样做?路由器已经为路由 IP 而构建,它会自动将 IP 地址与 MAC 地址相关联,以将 IP 流量路由到正确的位置。通常网络是围绕 IP 设计的,除非您想限制对特定硬件的访问,否则您只需忘记 MAC 地址即可。使用 IP 地址,您可以重新分配地址,而无需更改硬件或重新配置路由器。您可以获得一块新网卡并使用旧 IP 对其进行设置,这样您就不必重新配置路由器。您不必担心两种方法都有两种方法,因为 IP 的用处大约是其 10000 倍。而且您必须分配一个 IP 地址,以便将其放入数据包中,以便您的计算机将其识别为自己的。您的 PC 上可以有多个 IP。您可以拥有另一个具有自己的专用网络的路由器,如果它正在转发,则只需路由到该路由器的 IP,或者使用其单独的 IP 地址路由到第二个路由器另一侧的特定计算机。
在小型网络中,是的。例如在您的示例中的 Host-1、Host-2 和 Host-3 之间,所有主机都可能知道他们想要的主机的 MAC 并向其发送数据。在其他使用集线器而不是交换机的网络中,您还可以将以太网帧发送到网络上的所有客户端,并将它们设置为仅忽略到达但未寻址到它们的数据。许多 Hub and Start 拓扑结构都使用这样的系统。
请注意,我说的是数据和以太网帧,这导致了第二部分,并解释了您为什么要使用 Internet 协议地址。
为什么需要将私有 IP 地址关联到每个连接的地址?
您不想在客户端之间发送以太网级数据。如果你想在两个客户端(本地或远程)之间发送 IP 协议数据,那么你需要提供一个 IP 级网络堆栈,其中包括 IP 地址。由于 Internet 是建立在 Internet 协议标准之上的,因此我们的大量协议和工具都是围绕这一层网络构建的。如果要发送 TCP 或 UDP 数据,则必须通过 IP(通常)进行。
IP 网络和软件的无处不在使得有必要在小型网络中使用 IP 地址。它需要有人开发和支持重复的协议和产品才能在较低的网络级别上完成相同的工作。
NAT 和以太网网络的旁注。在 IPv6 被定义和采用之前,NAT 是为了解决缺少 IP 地址而添加的 hack。它现在是一种常见的黑客攻击,非常常见,以至于推迟了向 IPv6 的转换。在最初的概念中,Internet 上的所有客户端和服务器都应该具有真正的公开唯一 IP 地址。
我在其他答案中没有提到的另一个原因是 IP 路由聚合。路由表是根据 IP 地址块而不是单个 IP 地址来保存的。否则,表格会变得太大,难以维护和实际使用。因此,同一网络内的接口使用同一子网内的IP地址,并对外公布子网地址块。因此,当您更改网络时,通常您也会更改 IP 地址,以便可以聚合您的地址。(这适用于多个级别,从您的 LAN 开始,到您的本地 ISP,再到顶级 ISP。)另一方面,MAC 地址是静态的。如果我们基于 MAC 地址进行路由,路由表的大小将会爆炸,此外还需要为单个地址发送路由协议消息的开销非常大。
您所描述的实际上非常接近 IP路由在幕后的工作方式——当不涉及 NAT 或“端口转发”时,路由器通过仅更改其目标 MAC 来转发数据包,并且在技术上不需要知道 IP 地址的设备。
例如,在路由表中(我指的不是“端口转发”规则)你有一个“网关”或“下一跳”字段,传统上是一个 IP 地址,但它的唯一目的是被解析到一些一种低层地址,因此路由表可以很好地直接接受 MAC 地址。
但尽管如此,出于各种原因,路由表条目仍需要 IP 地址。首先,使用 IP 地址是一种有用的抽象,这要归功于使用 ARP(或 NDP)来动态解析 MAC 地址:实际网关可以更改其以太网接口,但只要它采用相同的 IP 地址,相同的旧路由配置仍然有效。
另一个原因是只接受一种地址类型比接受多种更简单。即使是典型的家庭网关也不是纯粹为以太网构建的:ADSL 调制解调器已经必须处理两个完全不同的 MAC 层,因此其路由表需要接受两种不同的下一跳地址类型。
因此,接受 IP 地址并依靠现有机制来转换它们实际上更简单——ARP 等机制无论如何都需要存在。此外,尽管有额外的转换,但它简化了事情,因为这意味着所有数据包都以相同的方式处理,无论它们是被传送到最终主机还是另一个网关,而不是有两种不同的情况。
(但有些网络实际上使用 IPv6 nexthop 地址作为 IPv4 网络路由。源网关的 OS 只是使用 NDP 而不是 ARP 来解析 nexthop 网关的 MAC 地址,而不会对转发的实际 IPv4 数据包进行任何更改。)
对于“端口转发”,一些相同的原因也适用,例如将 IP 地址与物理主机分开的能力。但更重要的原因是因为“端口转发”是后来才添加到 IP 网络中的,所以它的实现方式使得最终主机不需要意识到它的发生:与普通路由不同,“端口转发” -forwarded”数据包的实际目标 IP 地址(IP 标头中的地址)从路由器的 WAN 地址转换为您指定的内部地址。
换句话说,需要提供 IP 地址,因为与普通路由相比,“端口转发”的整个要点是将目标设备的 IP 地址放入数据包中。结果是目标设备认为它确实是“转发”连接的目的地,并且不会因接收到带有路由器 IP 的数据包而感到困惑(它通常会丢弃 - 或者更糟,转发回路由器)。
可能还有其他方法可以在多个设备之间实现类似的“共享”IP 地址,但它们需要对设备本身进行更改。例如,如果您只是直接将相同的公共 IP 地址分配给所有 LAN 主机和路由器——让它们接受未修改的数据包,具有公共 IP 地址——设备无法再相互通信,因为所有他们有相同的地址。(请记住,许多 IPv4 堆栈不允许每个接口有多个 IP 地址,因此不能同时分配公共地址和本地地址。)相比之下,完成的转换
(另一种可行的方法是为每个设备分配一个公共 IP 地址,从而使“端口转发”规则变得不必要并完全依赖于标准路由。)
另一个相关的想法是,端口不是一个普遍的概念,而是专门属于 TCP——它本身依赖于 IP——所以尽管在技术上可能有一个规则“如果端口 80,转发到 MAC x:y:z”,与硬件地址相比,将 TCP 端口与特定 IP 地址(即紧接的下一层)相关联在逻辑上更有意义。
上一个答案:
这是否“足够”不是正确的问题。是的,从根本上说这是可能的,但它并不是真正可取的——这样做会带来比您预期的要消除的更多的新复杂性。已经有很多方法可以在以太网之上构建网络但无需 IP(其中一些方法过去比 IP 更流行),例如 NetBIOS、DECnet、IPX、VINES、X.25、AppleTalk 只是其中几种过去在 LAN 和 WAN 上使用的协议。但最终,几乎所有此类网络要么迁移到IP,要么消失。(基于 X.25 的 WAN 或“公共数据网络”曾经很大,直到它们被基于 IP 的网络取代。)尽管您仍然可以在不依赖 IP 的情况下构建一个 LAN,但如今任何 LAN 都不可避免地需要与一个主要的基于 IP 的网络(Internet)进行通信,因此如果您有一个仅使用 MAC 地址的非基于 IP 的本地网络,除了本地 MAC 地址之外,程序仍然需要了解 Internet IP地址。这将意味着程序和操作系统将需要处理两种不同的网络类型——如果另一台主机位于 LAN 内,则使用 MAC 地址访问它;如果该主机位于 LAN 外,则使用 IP 地址。这与当前在“端口转发”时为本地主机使用私有 IP 地址和公共地址的问题非常相似,但严格来说更糟。(公平地说,这有点像目前 IPv4 和 IPv6 在现代网络上的共存,程序需要同时支持两者——但 IPv6 有实际存在的需要,它的存在旨在统一网络,而假设的 MAC -address-only 网络只会将它们分开更多而没有任何实际优势。)即使同一网络内的主机可以只使用它们的 MAC 地址进行通信,一旦内部主机需要向 Internet 发送一些数据包,您仍然需要一个额外的标头,它至少可以包含目标 IP 地址,并且路由器需要在两种数据包类型之间进行转换——一方面是常规 IP,另一方面是假设的“非 IP,但请传送到 IP 地址”LAN 协议。这是可行的,但比仅在双方使用相同类型的 IP 复杂得多。重要的一点是,“私有”IP 地址是 IP 网络中很久以后才添加的——当前私有 IP 地址和公共 IP 地址之间的转换并不是 IP 工作方式的自然组成部分,而主要是由“通用家庭路由器”带来的“ 多年后。在此之前,LAN 中的主机(如果 LAN 使用 IP)曾经像 Internet 上的任何其他地方一样只有公共 IP 地址——数据中心中的服务器仍然如此——并且不需要“端口转发”,因为你可以访问任何主机通过它自己的地址。总的来说,这首先与 IP 的存在有些矛盾——网络层协议的整个目标是统一不同类型的网络。目前,您家庭 LAN 中的 IP 与您办公室或大学或各种公共网络或 Internet 其余部分的 IP 的工作方式完全相同。(以类似的方式,IP over Ethernet 的工作方式类似于 IP over cable 的工作方式类似于 IP over ADSL 的工作方式类似于 IP over 3G/4G,即使这些网络类型中的每一种都有完全不同的 MAC 层,有时甚至没有“MAC”的概念地址”。)事实上,“即将到来的”IPv6 的目标与您的想法完全相反——特别是为每个设备分配公共地址的能力导致通过删除“私有地址从这里开始”NAT 进一步统一网络IPv4 局域网目前必须处理的边界。(同样,一直在努力将 IP 的使用扩展到尚未使用它的网络,例如物联网中的 Thread。)关于 MAC 地址不可路由的评论的旁注:已经有多种方法可以构建仅使用 MAC 地址的路由网络;它们只是不用于典型的基于 IP 的 LAN,因为 IP 层路由就足够了。
例如,HWMP 和 BATMAN 是 Wi-Fi 网状网络的标准,而企业网络中的 SPB 和 TRILL 将与 IP 路由广泛使用的相同的 IS-IS 路由协议应用于 L2 地址。
(IPX 和 XNS 网络协议也直接使用以太网 MAC 地址来识别主机,但是通过在基于 MAC 的主机地址前加上一个额外的“网络地址”来实现路由,避免了单独路由每个 MAC 的需要。如果你眯着眼睛, IPv6 最初以相同的方式工作。)
原因其实很简单:这样主机就不必知道或关心它们是否位于 NAT 层之后。
考虑一个有笔记本电脑的学生。当他把它带到大学时,那台笔记本电脑必须处理公共 IP 地址并运行通过 IP 地址和端口识别连接的软件(没有“家庭路由器”可以翻译)。当他将膝上型电脑带回家时,希望所有相同的软件都能正常工作。如果家庭网络通过 MAC 地址和端口而不是 IP 地址和端口来识别连接,则您需要一套完全不同的网络软件才能在家中使用。想象一下在学校网络万维网浏览器程序和家庭网络万维网浏览器程序之间保持书签和 cookie 同步的痛苦。
通过让家庭路由器在非 Internet 端使用相同的“Internet 协议”,计算机就不需要两种不同类型的网络。
TCP/IP 使用 IP 来路由流量。它在名字里。
如果您要使用 MAC 地址,那么您就不会使用 TCP/IP,此时路由器将需要做更多的工作来接收使用的任何基于 MAC 的协议,然后转发请求。
与通过网络地址转换 (NAT) 完成的更简单的标头修改/添加相比,它的工作要多得多。
将 TCP/IP 用于内部和外部网络通常意味着一个简单得多的网络,因为在与 Internet 相同的网络上的机器之间使用相同的协议,并且不需要与服务器和其他协议转换器之间的更智能的桥接。
首先,互联网并不是真正设计为具有“私人地址”。连接到互联网的设备应该有一个互联网地址(即公共 IP 地址)。互联网上的其他设备使用它的互联网地址与它对话。MAC 地址是本地网络/逐跳详细信息,对连接另一端的设备不可用。
所以现在假设,出于各种原因,您需要打破该惯例并在多个设备之间共享一个公共 IP 地址,同时让它们的功能基本相同。每个设备仍然需要/期望有一个 IP 地址,所以你给它们私有地址,然后你在网络边界逐个连接地在公共地址和私有地址之间进行转换——这就是 NAT(网络地址转换) ).
那么为什么我们不能接受你的建议,只接受传入的数据包,查找它的流属于哪个设备,在它上面打上正确的目标 MAC 地址,同时保持 IP 地址相同,然后让交换机将它发送到正确的端口?我们有点可以,但这意味着所有内部设备的接口都必须配置相同的外部 IP 地址。严格来说,这并非不可能,但这已经够让人头疼的了,它不会给你带来任何好处。
本地网络上的设备将无法使用公共地址相互通信,因为它们都认为自己拥有相同的地址。如果您希望他们能够相互交谈,您还必须为他们提供唯一的私有地址(如果您这样做,为什么不直接使用私有地址并进行 NAT?)
在您的方案中,有时路由器必须重写传入/传出数据包上的端口号(例如,如果两个设备选择相同的临时源端口用于传出连接,则避免 4 元组冲突
www.google.com:443
,或者因为两个设备在同一个端口上有服务侦听,但你想让它们都可以在不同的端口上被外界访问)。即使在普通情况下,它也需要能够识别连接流以将数据包发送回正确的本地设备。因此,它需要能够解析、跟踪和修改下一级协议 (IP) 的标头。这些与我们对“常规”NAT 路由器的要求完全相同,所以再次重申,如果您遇到所有这些麻烦,为什么不也重写地址呢?假设您的公共 IP 地址是动态分配的,就像在大多数住宅 ISP 上一样。假设您的路由器的链路断开并恢复,并且您获得了一个新地址。您现在必须重新配置路由器后面的所有设备。因此,您需要能够使用 DHCP 之类的方式向他们传播该信息。除了 DHCP,因为我们知道它是客户端启动的;服务器没有任何办法告诉客户端设备“嘿,你持有租约的地址实际上不再有效,你必须得到一个新的”。所以我们需要一些新的和不同的东西。
基本上,尽管看起来很恶心,但我们做事的方式已经演变为以最少的管理麻烦提供良好的结果,而且它在这方面大多是成功的。
网络在包装上层内容的层上工作,并沿着路径路由数据以到达目的地。互联网建立在通过 IP 地址路由的基础上,TPC 是包含端口 80 的协议之上的协议。HTTP 是通常使用 TCP 端口 80 的协议之上的另一层。
拥有在 IP 上运行的设备并以这种方式控制路由是互联网的构建方式。现在的计算机都内置了软件,但情况并非总是如此。要以不同的方式做到这一点,您将不得不提出自己的协议和软件,这只会增加复杂性并削弱安全性。访问网页涉及建立 TCP 连接,该连接本身涉及发送的与 HTTP 无关的 IP 数据包。实际上您在技术上不需要 TCP 甚至 HTTP 的 IP,您可以有一个串行连接并直接在其上执行 HTTP 请求,但那有什么乐趣呢?IP 使全球互联网成为可能。
假设您的路由器只是使用您的 MAC 地址通过以太网将数据发送到您的计算机。您的计算机应该如何处理它刚刚获得的这块数据?你的操作系统必须有一些东西来监听这些不针对你的 IP 地址的数据。然后它将必须以某种方式解释它以确定如何处理它。这必须符合您最初在路由器中指定此数据的目的。您将需要某种类型的数据头,路由器可以发送这些数据来告诉您的计算机数据的用途。 恭喜,您刚刚开始开发一个没人想要或不需要的新协议!
您的计算机和路由器已经在数据链路层上使用它们的 MAC 地址通过以太网相互发送数据。这些数据中的大部分都是封装的 IP 数据报,可以让您连接到互联网,因为它们会告诉您的路由器数据应该去哪里。
如果您问为什么不只允许您输入 MAC 地址以仅路由传入请求,那么我会问您为什么要这样做?路由器已经为路由 IP 而构建,它会自动将 IP 地址与 MAC 地址相关联,以将 IP 流量路由到正确的位置。通常网络是围绕 IP 设计的,除非您想限制对特定硬件的访问,否则您只需忘记 MAC 地址即可。使用 IP 地址,您可以重新分配地址,而无需更改硬件或重新配置路由器。您可以获得一块新网卡并使用旧 IP 对其进行设置,这样您就不必重新配置路由器。您不必担心两种方法都有两种方法,因为 IP 的用处大约是其 10000 倍。而且您必须分配一个 IP 地址,以便将其放入数据包中,以便您的计算机将其识别为自己的。您的 PC 上可以有多个 IP。您可以拥有另一个具有自己的专用网络的路由器,如果它正在转发,则只需路由到该路由器的 IP,或者使用其单独的 IP 地址路由到第二个路由器另一侧的特定计算机。
MAC 的意思是“媒体访问控制”——意思是它控制通过媒体(称为 PHY)物理生成信号的东西。
PHY 示例:有线以太网、特定信道上的 Wi-Fi 无线电、电缆调制解调器/DOCSIS、DSL、光纤
介质示例:铜、空中无线电波、光学
当您告诉一个 PHY 与另一个 MAC 对话时,PHY 只能查看和查看具有 PHY 连接或侦听同一介质的其他设备。这是网络概念的基础。
因此,您的 Wi-Fi 无线电只能看到在同一频段和频道上收听的其他节点。您的有线以太网卡只能看到在同一“线路”上侦听的节点 - 可以使用交换机进行扩展。(最初,有线网络上的节点都是物理连接到单根电线上的)。
IP——代表网际网络协议——一种不关心介质的全局方案,因此设置在 MAC 地址之上。
因此......需要存在可以转发一个网络想要发送给其他网络的流量的设备 - 并且它需要连接到至少 2 个网络。这些设备称为路由器- 想要与不在同一网络上的设备通信的节点需要将流量发送到路由器。子网掩码允许节点知道它们“在”哪个网络(因此不必发送到路由器)。
ISP 的工作方式相同 - 您的路由器连接到 ISP 网络,而 ISP 拥有运营商级路由器,这些路由器接收不是发往其网络的流量并将其路由到其他 ISP(在称为 IXP 的地方)。
我会直接回答两个子问题:
在小型网络中,是的。例如在您的示例中的 Host-1、Host-2 和 Host-3 之间,所有主机都可能知道他们想要的主机的 MAC 并向其发送数据。在其他使用集线器而不是交换机的网络中,您还可以将以太网帧发送到网络上的所有客户端,并将它们设置为仅忽略到达但未寻址到它们的数据。许多 Hub and Start 拓扑结构都使用这样的系统。
请注意,我说的是数据和以太网帧,这导致了第二部分,并解释了您为什么要使用 Internet 协议地址。
您不想在客户端之间发送以太网级数据。如果你想在两个客户端(本地或远程)之间发送 IP 协议数据,那么你需要提供一个 IP 级网络堆栈,其中包括 IP 地址。由于 Internet 是建立在 Internet 协议标准之上的,因此我们的大量协议和工具都是围绕这一层网络构建的。如果要发送 TCP 或 UDP 数据,则必须通过 IP(通常)进行。
IP 网络和软件的无处不在使得有必要在小型网络中使用 IP 地址。它需要有人开发和支持重复的协议和产品才能在较低的网络级别上完成相同的工作。
NAT 和以太网网络的旁注。在 IPv6 被定义和采用之前,NAT 是为了解决缺少 IP 地址而添加的 hack。它现在是一种常见的黑客攻击,非常常见,以至于推迟了向 IPv6 的转换。在最初的概念中,Internet 上的所有客户端和服务器都应该具有真正的公开唯一 IP 地址。
我使用一些只使用以太网流量的系统。这些通常只直接连接到其他系统或非常小的网络中。它允许您从网络协议栈的较低级别开始,这对于计算能力有限或速度是绝对要求的系统来说更简单。代价是 IP、UDP 或 TCP 网络为您提供的所有优势并不是很多人都习惯于使用它们。
我在其他答案中没有提到的另一个原因是 IP 路由聚合。路由表是根据 IP 地址块而不是单个 IP 地址来保存的。否则,表格会变得太大,难以维护和实际使用。因此,同一网络内的接口使用同一子网内的IP地址,并对外公布子网地址块。因此,当您更改网络时,通常您也会更改 IP 地址,以便可以聚合您的地址。(这适用于多个级别,从您的 LAN 开始,到您的本地 ISP,再到顶级 ISP。)另一方面,MAC 地址是静态的。如果我们基于 MAC 地址进行路由,路由表的大小将会爆炸,此外还需要为单个地址发送路由协议消息的开销非常大。
MAC 地址是 OSI 模型第 2 层的一部分,在本例中为以太网。
以太网不是可路由协议,因此在第 2 层没有“默认路由/网关”的概念
第 3 层的 IP 确实区分了本地流量和“通过特定 IP 的所有其他流量”
所有其他答案都足够长,这里是 TLDR:
回到过去,互联网不应该有一个“私人 IP 地址”,这是在他们意识到如果互联网继续像这样流行起来就没有足够的 IPv4 来传输之后出现的。这就是为什么现在的家庭互联网访问将使用私有 IPv4,但主路由器(仍在客户的场所)将有一个公开分配的 IPv4(是的,我知道 CGNAT 存在),它将对来自私有 IP 端并转换的每个数据包进行 NAT到公共 IP 端(反之亦然)。最初的 IPv4 设计是让每个互联网访问设备都有其唯一且可公开访问的 IP,目前 IPv6 可以实现这一点,因为它的地址数量非常大。
关于 IP 地址的另一个重要的事情是它隔离了每个网段,并且需要路由器将数据包转发到主机未知的网络(在指定网络掩码的范围之外)。
如果你试图摆脱所有 IP 路由的东西,直接使用 MAC 地址进行路由,一切都会崩溃,因为现在每个人都会收到每个人的帧,因为 L2 转发的性质会把每个未知帧淹没到任何可能的地方。