当以太网使用MAC地址进行通信时,我是否可以创建一个以太网网络,在该网络中设备将没有IP地址,只有MAC地址?
如果您是从头开始编写所有自己的软件,那么您当然可以这样做。只需让该软件接受该程序的正常副本将接受IP地址的任何地方的MAC地址即可。使用所有系统调用来发送原始以太网数据包而不是IP地址,它可以工作-但这将是一个巨大的麻烦。
通常,网络上的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标头的部分。取而代之的是,用非常简单的代码替换所有代码,给定一个IP数据包要发送到地址为wxyz的主机,然后构建一个DEST地址设置为00-00-wxyz的以太网帧。
您还需要一种方法来向数据包的接收方指示其意图使用的协议(UDP,TCP)。您可以通过覆盖现有字段将其粘贴在以太网头中的某个位置。也许使用源地址的前两个字节之一?这不会影响目标计算机的接收能力,但可能会使某些开关混乱。您还可以将协议添加到以太网帧的开头或结尾,并将有效负载大小增加一个-但这就像IP标头一样。
那么,所有这些工作能为您带来什么呢?
首先,它将节省您在每个传出数据包的ARP表中查找的开销。这大概只有几微秒。
您可以节省计算IP标头校验和的工作以及保存它们所需的内存。这在现代硬件上可能并不重要。
您将在网络上的每个数据包中节省16个字节,因为没有IP标头。这可能会加起来,具体取决于应用程序。
最大的好处是您不必执行任何ARP请求。将标准IP数据包发送到新主机会触发ARP交换,该交换可能需要数毫秒,并且是不可预测的。对于某些对延迟和抖动非常敏感的应用程序,这可以是巨大的收益。
对于某些非常专业的应用程序,这样做确实有意义。我曾经工作过一个实时系统,该系统仅使用广播UDP数据包进行所有主机间的通信,其唯一原因是,它避免了那些ARP序列的启动,并且意外地增加了延迟和抖动。我还曾经在一个资源受限的嵌入式系统上工作,该系统通过直接在IP数据包内发送UDP净荷(没有IP头)来工作,因为它节省了实现所有ARP和网络掩码以及额外的校验和所需的所有复杂性和内存。