答案1
- 在路由器上,我将端口 80(外部)转发到 PC 的 MAC 地址(而不是本地 IP)的端口 80(内部)。
我知道这不是它的工作原理,问题是为什么一开始不这样实现?是的,帧无论如何都不是数据包。我只是想出于识别目的。
你所描述的实际上非常接近 IP路由在后台工作——当 NAT 或“端口转发”不是所涉及的是,路由器仅通过更改目标 MAC 来转发数据包,并且从技术上讲不需要知道设备的 IP 地址。
例如,在路由表中(我通过它不是指的是“端口转发”规则)你有一个“网关”或“下一跳”字段,它传统上是一个 IP 地址,但其唯一目的是解析为某种低层地址,因此路由表可以完全可以直接接受 MAC 地址。
但尽管如此,路由表条目仍需要 IP 地址,原因有很多。首先,使用 IP 地址是一种有用抽象,这要归功于使用 ARP(或 NDP)来动态解析 MAC 地址:实际网关可以更改其以太网接口,但只要它采用相同的 IP 地址,相同的旧路由配置就保持有效。
另一个原因是,只接受一种地址类型比接受多种地址类型更简单。即使是典型的家庭网关也不是完全以以太网为基础构建的:ADSL 调制解调器已经必须处理两个完全不同的 MAC 层,因此其路由表需要接受两种不同的下一跳地址类型。
因此,接受 IP 地址并依靠现有机制进行转换实际上更简单,例如需要存在的 ARP 等机制反正。此外,尽管需要额外的转换,但它简化了事情,因为这意味着所有数据包都以相同的方式处理,无论它们是被传送到最终主机还是另一个网关,而不是有两种不同的情况。
(但有些网络实际上使用 IPv6 下一跳地址进行 IPv4 网络路由。原始网关的操作系统只是使用 NDP 而不是 ARP 来解析下一跳网关的 MAC 地址,而不会对正在转发的实际 IPv4 数据包进行任何更改。)
对于“端口转发”,也有一些相同的原因,例如能够将 IP 地址与物理主机分开。但更重要的原因是“端口转发”是 IP 网络后来才添加的功能,因此它的实现方式使得最终主机不需要知道它的发生:与普通路由不同,“端口转发”数据包的实际的目标 IP 地址(IP 头中的 IP 地址)从路由器的 WAN 地址转换为您指定的内部地址。
换句话说,需要提供 IP 地址,因为整个点“端口转发”与普通路由不同的是将目标设备的 IP 地址放入数据包中。结果是目标设备认为它确实是“转发”连接的目的地,并且不会因收到带有路由器 IP 的数据包而感到困惑(它通常会丢弃该数据包 - 或者更糟的是,将其转发回路由器)。
可能还有其他方法可以在多个设备之间实现类似的“共享”IP 地址,但它们需要对设备本身进行更改。例如,如果你直接将相同的公共 IP 地址分配给所有 LAN 主机以及路由器 - 使它们使用公共 IP 地址接受未修改的数据包 - 设备将无法通信对彼此因为它们都具有相同的地址,所以不再需要重新分配 IP 地址。(请记住,许多 IPv4 堆栈不允许每个接口分配多个 IP 地址,因此分配两个都公共和本地地址将不是一种选择。)相比之下,已经完成的翻译
(一种替代方法是做工作是给每台设备分配一个公共 IP 地址,这样就不需要“端口转发”规则,只需纯粹依靠标准路由即可。
另一个相关的想法是,港口不是一个通用概念,但具体属于 TCP——它本身依赖于 IP——因此,尽管它技术上可以有一条规则“如果端口为 80,则转发到 MAC x:y:z”,从逻辑上讲,将 TCP 端口与特定 IP 地址(即紧接的下一个较低层)相关联比与硬件地址相关联更有意义。
上一个答案:
为什么需要将私有 IP 地址与每个连接的地址关联?MAC 地址是否足以将信息转发到正确的目的地?
是否“足够”并不是一个正确的问题。是的,从根本上说这是可能的,但实际上并非如此可取之处– 这样做会带来比你预期更多的复杂性。
目前已经有很多方法可以在以太网上构建网络,而无需 IP(其中一些曾经比 IP 流行得多),例如 NetBIOS、DECnet、IPX、VINES、X.25、AppleTalk 只是过去在 LAN 和 WAN 上使用的几种协议。但最终,几乎所有此类网络都迁移到了到IP 或消失。(基于 X.25 的 WAN 或“公共数据网络”曾经规模庞大,直到被基于 IP 的网络取代。)尽管你仍然可以在不依赖 IP 的情况下构建 LAN,但如今任何 LAN 都不可避免地需要与一个主要的基于 IP 的网络(Internet)进行通信,因此如果你有一个仅使用 MAC 地址的非基于 IP 的本地网络,程序仍然需要理解 Internet IP 地址此外到本地 MAC 地址。这意味着程序和操作系统需要处理两种不同的网络类型——如果另一台主机位于 LAN 内部,则需要 MAC 地址;如果该主机位于外部,则需要 IP 地址。这与当前在本地使用主机的私有 IP 地址,而在通过“端口转发”时使用公共地址的问题非常相似,但严格来说更糟糕。(公平地说,这有点像现代网络上 IPv4 和 IPv6 的共存,程序需要同时支持两者——但 IPv6 有实际的存在需要,它的存在旨在统一网络,而假设的仅限 MAC 地址的网络只会将它们进一步分离,而没有任何实际优势。)尽管同一网络内的主机可以仅使用其 MAC 地址进行通信,但一旦内部主机需要向 Internet 发送一些数据包,您就仍然需要一个额外的报头,至少可以包含目标 IP 地址,路由器需要在两种数据包类型之间进行转换——一边是常规 IP,另一边是假设的“非 IP,但请传送到 IP 地址”LAN 协议。这是可行的,但比在两边使用同一种 IP 复杂得多。重要的一点是,“私有”IP 地址很多后来添加到 IP 网络 – 当前私有 IP 地址和公共 IP 地址之间的转换不是 IP 工作方式的自然组成部分,而主要是由多年后的“通用家庭路由器”带来的。在此之前,LAN 中的主机(如果 LAN 使用 IP)过去只拥有公共 IP 地址,就像 Internet 上的任何其他地方一样 – 数据中心中的服务器仍然拥有公共 IP 地址 – 并且不需要“端口转发”,因为您可以通过其自己的地址访问任何主机。
总的来说,这在某种程度上违背了 IP 的存在——网络层协议的整个目标是统一不同类型的网络。目前,家庭 LAN 中的 IP 的工作方式与办公室或大学或各种公共网络或 Internet 其余部分的 IP 的工作方式完全相同。
(类似地,以太网上的 IP 的工作方式与电缆上的 IP 的工作方式、ADSL 上的 IP 的工作方式和 3G/4G 上的 IP 的工作方式相同,尽管每种网络类型都有完全不同的 MAC 层,有时甚至没有“MAC 地址”的概念。)
事实上,“即将推出”的 IPv6 的目标与您所想的完全相反 - 特别是为每个设备分配公共地址的能力可以通过消除 IPv4 LAN 当前必须处理的“私有地址从这里开始” NAT 边界来进一步统一网络。
(同样,人们不断努力将 IP 使用扩展到尚未使用它的网络,例如物联网中的线程。)
关于 MAC 地址不可路由的评论的补充说明:已经存在各种各样的构建仅使用 MAC 地址的路由网络的方法;它们只是没有在典型的基于 IP 的 LAN 上使用,因为 IP 层路由已经足够了。
例如,HWMP 和 BATMAN 是 Wi-Fi 网状网络的标准,而企业网络中的 SPB 和 TRILL 对 L2 地址应用与 IP 路由广泛使用的相同的 IS-IS 路由协议。
(IPX 和 XNS 网络协议也直接使用以太网 MAC 地址来识别主机,但通过额外的“网络地址”作为基于 MAC 的主机地址的前缀,从而避免了单独路由每个 MAC 的需要。如果你仔细想想,IPv6 一开始的工作方式也是一样的。)
答案2
原因其实很简单:这样主机就不必知道或关心它们是否位于 NAT 层后面。
假设有一名学生有一台笔记本电脑。当他把笔记本电脑带到大学时,这台笔记本电脑必须处理公共 IP 地址并运行通过 IP 地址和端口识别连接的软件(没有“家用路由器”可以转换)。当他把笔记本电脑带回家时,最好所有相同的软件都能正常工作。如果家庭网络通过 MAC 地址和端口而不是 IP 地址和端口来识别连接,那么你需要一套完全不同的网络软件才能在家中使用。想象一下,在学校网络上的万维网浏览器程序和家庭网络上的万维网浏览器程序之间保持书签和 cookie 同步是多么痛苦。
通过让家用路由器在非互联网端使用相同的“互联网协议”,计算机就不需要两种单独的网络类型了。
答案3
TCP/IP 使用 IP 来路由流量。它的名称就说明了一切。
如果您要使用 MAC 地址,那么您就不会使用 TCP/IP,此时路由器将需要做更多的工作来接收所使用的基于 MAC 的协议,然后转发请求。
这比通过网络地址转换(NAT)进行的简单的标头修改/添加要花费更多的工作量。
在内部和外部网络中使用 TCP/IP 意味着网络总体上要简单得多,因为同一网络上的机器之间使用与互联网相同的协议,并且不需要与服务器和其他协议转换器建立更智能的桥梁。
答案4
- 在路由器上,我将端口 80(外部)转发到 PC 的 MAC 地址(而不是本地 IP)的端口 80(内部)。
我知道这不是它的工作原理,问题是为什么一开始不这样实现?是的,帧无论如何都不是数据包。我只是想出于识别目的。
网络工作于图层它包装上层的内容并沿着路径路由数据,以到达目的地。互联网是建立在通过 IP 地址路由的基础上的,而 TPC 是其上的协议,包含端口 80。HTTP 是其上的另一层,通常使用 TCP 端口 80。
互联网的建立方式是拥有基于 IP 的设备并以此方式控制路由。如今的计算机内置了软件,而以前并非如此。如果要以不同的方式做到这一点,您必须想出自己的协议和软件,这只会增加复杂性并削弱安全性。访问网页需要建立 TCP 连接,而 TCP 连接本身需要发送与 HTTP 无关的 IP 数据包。实际上,从技术上讲,HTTP 不需要 TCP 甚至 IP,您可以建立串行连接并直接通过它执行 HTTP 请求,但那有什么乐趣呢?IP 是全球互联网的基础。
假设您的路由器只是使用您的 MAC 地址通过以太网将数据发送到您的计算机。您的计算机应该如何处理刚刚收到的这块数据?您的操作系统必须有一些东西来监听这些数据,这些数据不是针对您的 IP 地址的。然后它必须以某种方式解释它以确定如何处理它。这必须与您在路由器中首先为这些数据指定的用途相匹配。您将需要某种类型的数据报头,路由器可以发送这些数据来告诉您的计算机这些数据的用途。 恭喜,您刚刚开始开发一个没人想要或需要的新协议!
您的计算机和路由器已在数据链路层上使用其 MAC 地址通过以太网相互发送数据。大部分数据都是封装的 IP 数据报,它们可让您连接到互联网,因为它们会告诉您的路由器数据应发往何处。
如果您问为什么不允许您输入 MAC 地址来仅路由传入请求,那么我会问您为什么要这样做?路由器已经为路由 IP 而构建,它会自动将 IP 地址与 MAC 地址关联起来,以将 IP 流量路由到正确的位置。通常,网络是围绕 IP 设计的,除非您想限制对特定硬件的访问,否则您会忘记 MAC 地址。使用 IP 地址,您可以重新分配地址,而无需更改硬件或重新配置路由器。您可以获得一张新网卡并使用旧 IP 进行设置,这样您就不必重新配置路由器。您不必担心同时使用两种方法,因为 IP 的用处大约是 10000 倍。无论如何,您都必须分配一个 IP 地址,将其放入数据包中,以便您的计算机识别为它自己的 IP。您的 PC 上可以有多个 IP。您可以拥有另一个具有自己的专用网络的路由器,并且只需路由到该路由器的 IP(如果它正在转发)或路由到第二个路由器另一侧的特定计算机(使用其各自的 IP 地址)。