イーサネットは通信に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アドレスを見つける何らかの方法が必要です。
これを行う1つの(ハードコア)方法は、ネットワーク上のすべてのマシンにアクセスし、ハードウェアMACアドレスを変更して、上位2バイトをゼロ(または同じ他の固定数)にすることでIPアドレスのように見えるようにすることですネットワーク上のすべてのマシンに対して)、ネットワーク上で必要な「IPアドレス」に下部の4バイトを設定します。(ほとんどのネットワークカードでは、ベンダーに割り当てられたMACアドレスを変更できます)
これを実際に機能させるには、次に、ネットワークスタック内のコードをハッキングして、このシステムを実際に使用する必要があります。基本的に、ARP(IPアドレスをIPアドレスからMACアドレスに変換するために使用する方法)に関連するすべてを取り除いてください。IPヘッダーを構築/読み取る部分をリッピングします。代わりに、アドレスwxyzのホストに送信されるIPパケットを指定して、DESTアドレスを00-00-wxyzに設定してイーサネットフレームを構築する非常に単純なコードですべてを置き換えます。
また、パケットの受信者に、どのプロトコル(UDP、TCP)を対象としているかを示す方法も必要です。既存のフィールドをオーバーライドすることにより、おそらくこれをイーサネットヘッダーのどこかに貼り付けることができます。送信元アドレスの上位2バイトのいずれかを使用している可能性がありますか?これは宛先マシンの受信能力には影響しませんが、一部のスイッチを台無しにする可能性があります。また、プロトコルをイーサネットフレームの先頭または末尾に追加して、ペイロードサイズを1つ増やすこともできますが、IPヘッダーのような臭いがし始めています。
それで、このすべての仕事はあなたに何を買うでしょうか?
まず、すべての発信パケットでARPテーブルを検索するオーバーヘッドを節約します。これはおそらくわずか数マイクロ秒のオーダーです。
IPヘッダーチェックサムの計算作業と、それらを保持するために必要なメモリを節約します。これはおそらく現代のハードウェアでは重要ではありません。
IPヘッダーがないため、ネットワーク上のすべてのパケットで16バイトを節約できます。これは、アプリケーションによっては合計される可能性があります。
最大の利点は、ARP要求を行う必要がないことです。新しいホストに標準IPパケットを送信すると、ARP交換がトリガーされますが、これには数ミリ秒かかり、予測できません。これは、レイテンシーとジッターに非常に敏感な一部のアプリケーションにとっては大きな利益になります。
いくつかの非常に特殊なアプリケーションでは、これは実際に実行する意味があります。以前は、すべてのホスト間通信にブロードキャストUDPパケットのみを使用するリアルタイムシステムを使用していました。これは、ARPシーケンスが作動し、予測できない遅延とジッターを追加することを避けた唯一の理由です。また、私はかつて、IPパケット内で直接UDPペイロードを送信する(IPヘッダーなし)ことで動作するリソース制限のある組み込みシステムで働いていました。