据我从 ISO-OSI 模型中了解,MAC 地址与 IP 地址在不同的层上运行。这对我来说很清楚。
我可以接受以太网 (LAN) 不使用 IP 地址进行通信,而是使用 MAC 地址。我知道这些 MAC 地址不能用于 LAN 之外的路由,因为它们不是分层定义的。我也知道 IP 是在大型互联网上进行路由的最佳方式。但我并不完全相信 MAC 地址是 LAN 中通信的最佳方式
我的问题如下:
- 以太网不能使用 IP 地址发送消息吗?我不是说它应该使用,我只是问它是否可以选择这样做。
- 由于以太网使用 MAC 地址进行通信,我可以创建一个设备没有 IP 地址而只有 MAC 地址的以太网网络吗?
答案1
以太网可以使用 IP 地址而不是它自己的数据链路层地址吗?如果它不想了解它使用的是什么第 3 层协议,那当然不行。
我们分层设计网络协议,以便可以混合搭配各层。
以太网最初由施乐 PARC 的 Bob Metcalfe 等人开发,与网络层无关,因为他们的目标不仅仅是 TCP/IP 访问,也包括施乐自己的专有 XNS 网络协议栈/套件。
DEC(数字设备公司)成为另一个早期采用者,主要用于其 DECnet 协议栈/套件。
在 80 年代末和 90 年代初,有许多竞争性的 LAN 协议套件(均完全独立于 TCP/IP)在企业以太网 LAN 上运行。除了 XNS 和 DECnet,还有 Apple 的 AppleTalk (EtherTalk)、Novell 的 IPX、Banyan VINES、NetBEUI、DLC/LLC、IBM SNA、OSI/ISO 以及其他我忘记的协议。
所以,是的,你可以使用没有 IP 的以太网。许多企业网络在 80 年代和 90 年代都这样做过。
因为以太网在设计时并不关心其上运行的是什么第 3 层(网络层)协议,所以那些企业 LAN 相对容易地支持各种供应商设备的混合,并且当互联网在 20 世纪 90 年代中后期起飞时,那些 LAN 相对容易地添加 IPv4 支持,而现在我们可以相对容易地添加 IPv6 支持。
答案2
由于以太网使用 MAC 地址进行通信,我可以创建一个设备没有 IP 地址而只有 MAC 地址的以太网网络吗?
如果您从头开始编写自己的软件,那么您当然可以做到这一点。只需让软件在程序的正常对应程序接受 IP 地址的任何地方接受 MAC 地址即可。使用所有系统调用发送原始以太网数据包而不是 IP 地址,这样就可以了 - 但这将是一个巨大的麻烦。
通常,网络上的 MAC 地址没有任何模式。它们由制造商刻录到硬件中。它们又长又笨重。我现在的 MAC 地址是 C8-60-00-CA-4B-9A。我旁边的计算机是 00-40-F4-48-1B-88。
为了让机器能够相互通信,您可以为每台机器提供一份网络上所有其他机器的 MAC 地址的硬编码列表,以便它知道将数据包发送到哪里。这需要大量容易出错的输入,并且每当您更改任何网络硬件时,您都必须四处走动并更改所有列表以反映新的 MAC 地址。
这非常麻烦,所以你最终可能会想出一种方法,让网络上的机器使用广播数据包自动发现彼此的 MAC 地址。然后,你会给它们一种方法来用一些有意义的地址来识别自己,所以你必须输入像“telnet C8-60-00-CA-4B-9A”这样的命令。
事实证明这正是 IP 的作用 - 它是一种使用有意义的数字来寻址网络上的主机的方式,而不是硬编码 MAC 地址。在 IP 之上添加 DNS,然后您就可以输入“telnet webserver”之类的命令。
以太网不能使用 IP 地址发送消息吗?我不是说它应该使用,我只是问它是否可以选择这样做。
MAC 地址包含 6 个字节的信息,而 IP 地址只有 4 个字节,因此您无法进行任何类型的 1 对 1 映射。您需要某种方式从 IP 地址(由想要与网络上的另一台主机通信的软件提供)找到 MAC 地址(放入数据包中)。
实现此目的的一种(硬核)方法是进入网络上的每台计算机,将其硬件 MAC 地址更改为看起来像 IP 地址,方法是将前两个字节设为零(或网络上每台计算机相同的其他固定数字),并将后四个字节设置为您希望它们在网络上拥有的“IP 地址”。 (大多数网卡都会让您进入并修改供应商分配的 MAC 地址)
为了使它真正发挥作用,接下来您还必须破解网络堆栈中的代码才能真正使用该系统。您基本上会删除与 ARP(IP 用于将 IP 地址转换为 MAC 地址的方法)有关的所有内容。您会删除构建/读取 IP 标头的部分。相反,您会用非常简单的代码替换它,给定要发送到地址 wxyz 的主机的 IP 数据包,构建一个以太网帧,并将目标地址设置为 00-00-wxyz。
您还需要一种方法来向数据包的接收方指示该数据包适用于哪种协议(UDP、TCP)。您可以通过覆盖现有字段将其粘贴在以太网报头的某个位置。也许可以使用源地址的前两个字节之一?这不会影响目标机器的接收能力,但可能会弄乱一些交换机。您还可以将协议添加到以太网帧的开头或结尾,并将有效负载大小增加一 - 但这开始像 IP 报头一样。
那么所有这些工作能给你带来什么呢?
首先,它可以节省您每次发送数据包时查找 ARP 表的开销。这可能只需要几微秒的时间。
您省去了计算 IP 报头校验和的工作,以及保存校验和所需的内存。这在现代硬件上可能并不重要。
由于没有 IP 报头,网络上的每个数据包都可以节省 16 个字节。这可能会根据应用程序而增加。
最大的好处是您不必执行任何 ARP 请求。向新主机发送标准 IP 数据包会触发 ARP 交换,该交换可能需要几毫秒的时间,并且不可预测。对于某些对延迟和抖动非常敏感的应用程序来说,这可能是一个巨大的好处。
对于一些非常专业的应用程序来说,这样做实际上是有意义的。我曾经开发过一个实时系统,该系统仅使用广播 UDP 数据包进行所有主机间通信,唯一的原因是它可以避免那些 ARP 序列启动并不可预测地增加延迟和抖动。我还曾经开发过一个资源有限的嵌入式系统,该系统通过直接在 IP 数据包内发送 UDP 有效负载(无 IP 标头)来工作,因为它节省了实现所有 ARP 和网络掩码以及额外校验和所需的所有复杂性和内存。
答案3
以太网不能使用 IP 地址发送消息吗?我不是说它应该这样做,我只是问它是否可以选择这样做
我猜以太网本可以使用四字节地址(如 IPv4),而不是六字节地址。他们没有这样做可能是件好事,因为我敢打赌,现在他们的数字已经用完了。
由于以太网使用 MAC 地址进行通信,我可以创建一个设备没有 IP 地址而只有 MAC 地址的以太网网络吗?
可以,只要您有可以使用 MAC 地址而不是 IP 地址的程序即可。当然,您将被困在该网络上,如果不使用黑客手段,您将无法联系到其他人。
如果您计划进行路由,您实际上只需要 IP 层,尤其是当另一个网络可能使用不同于以太网的第 2 层技术(如令牌环)时,这在大多数开发过程中都是真正有可能的。谁知道将来另一种第 2 层技术是否会变得无处不在,如果是这样,IP 就独立于它。
答案4
本地网络上的机器无需路由层即可进行通信,这当然是可能的。您只需将消息嵌入以太网帧并希望获得最佳效果。这有点像在明信片上写一张便条并希望邮局能完成其工作。
你必须希望接收者正在听,并且听小心回复消息(可能在很多来自其他节点的其他消息)。您将负责自己整理所有这些消息。
如果您想要 1:1 消息传递之类的东西,则需要在以太网帧之上使用另一种协议来为您处理所有这些监听。点对点协议 (PPP) 通常用于此目的,在以太网上,这称为 PPPoE。PPPoE 为您提供身份验证和加密,这两者都是广播网络上非常好的想法。
但是,如果没有某种形式的路由信息,您只能与本地网络上的节点进行通信。一旦您开始使用路由信息来传递消息(例如传递到互联网),您就需要某种形式的路由协议,例如 IP 或 IPX。而且您可能还需要传输控制 (TCP)...