Logo
x logo

箱庭飛行場Ex

2-1.イーサーネットケーブルの定義

さて、いよいよネットワークシミュレーターで利用するネットワークコンポーネントのWASM化に入っていきましょう。(今回からWebAssemblyをWASMと略して書くようになりました。)

ここで全体像を整理しておきます。これから作っていくネットワークシミュレーターで使うネットワークコンポーネントとして本誌で出てきたものをリストにすると

コンポーネント はたらき
イーサネットケーブル  物理層でデバイスとデバイスを繋げ、電気信号としてデータを送受信する
NIC          NICは物理層でイーサーネットケーブルを接続するカード。
ケーブルから電気信号を受信したら、デコード処理して、
イーサーネットフレームにして上位層であるデータリンク層(L2)に渡す
NICドライバー プロトコルスタックからデータを受け取り、それを、NICに送る。
NICから上がってきたデータを受け取り、プロトコルスタックに送る。
L2Switch データリンク層でMACアドレスを元に動作するネットワークデバイス
Transceiver L2 Switchの各ポートの中で、物理層の小さなNICのような役割
Transceiverが信号を受信したら、それをL2 Switch本体に送りトランスファーしてもらう

そして、コンポーネントをつなぐ役割のソフトもありましたね。

ソフトコンポーネント はたらき
NICドライバー プロトコルスタックからデータを受け取り、それを、NICに送る。
NICから上がってきたデータを受け取り、プロトコルスタックに送る。
プロトコルスタック デバイス上で通信を実現するための基盤。
プロトコル群を階層的に実装したもので、ネットワーク通信を行うための基盤を提供し、
データの送受信を管理する

これらを順番に、WASM化して、ブラウザ上で動くネットワークシミュレーターにしていくのが本連載の大きな目的です。順番にこれらをRustで実装して、WASM化していきます。

今回は、物理層の「イーサーネットケーブル」をWASM化したいと思います。 って、その前にそもそもイーサーネットケーブルって何なのか?ということをはっきりさせておきましょう。

本誌ではこれを詳細に、抽象化していました。

はたらきは?

でしたね。

厳密にもっと追加するとしたら、 ・ケーブルの物理的な長さや特性に基づく伝送遅延 ・信号強度やノイズの影響を加味する場合、信号品質 ・ケーブルのタイプ(Cat5、Cat6、光ファイバーなど) ・ケーブルのタイプに応じて速度(100Mbps,1Gbps,10Gbps,40Gbpsなど) これらはもっと進んできた時に実装していこうと思います。特にケーブルタイプは10G対応の機器もだいぶ出てきていますしね。 L2 Switchのあたりをやりながら、ここら辺は忘れずに追加していきます。

本誌でも触れましたが、はたらきのところの「送り先のデバイスの、電気信号を受ける処理を呼び出す」 という部分。これは、今後各ネットワークコンポーネントを作っていく上での基本ルールとして「データの流れ」のルールを定めました。 ・電気信号を流すのに、まずどちらの端から流れてきたのか?を確認して、逆の端につながっているIDのデバイスに、データを送る。 ・送る時は、送り先のデバイス側に用意されている、電気信号を受ける処理を呼び出す。 ことで、実現しようと考えてみました。

それぞれ接続されるネットワークコンポーネントでは、例えば、「receive_frameという信号を受け取る口を用意しておく。」というルールです。

PCやSwitchにケーブルを刺す口がありますよね。あれをぼーっと見ていて、データを受け取る口は、それぞれケーブルが接続される側に用意されているところに、送るんだ。という発想でこのようになりました。

データを定義して、そのデータがどういう風に流れるのか?というルールを決めておくと そのシステムを作る前段階でロジックフローの確認ができるようになり、それぞれのコンポーネントの はたらきを明確化できるので良いと思います。

どういうI/Fにするか?

次にいきなりRustで実装するのではなく、その前にどういう風に表現するか?を考えた方が後戻りが少なくてすみます。 今回も今まで作ってきた「Packet Pilot Terminal」で確認できるようにしようと思います。

cable()でイーサーネットケーブルを追加する
cable(1)で Idを指定してケーブルを追加する
show()コマンドの時に、今用意したケーブル全部の情報を追加する

今回は、この3点にしたいと思います。 次にNICを作っていく時には、
connect(component id)で、そのコンポーネントに接続する みたいなのを作っていこうかと思います。

まずは、この3つをJS側からWasmEthernetCableを呼んで実行できるようにしましょう。

まとめ

ということで、今回は、実装に入る前に、イーサーネットケーブルとはそもそも、どういうカタチのもので、どういうはたらきを持ったものか?それを何に使う?、データを流すって具体的にデータをどう流すのか?といったあたりを整理してみました。

こういうフローを毎回していくことで創造する力がついてくると思いますので、ぜひ練習していってください。

では、これで、イーサーネットの定義が終わりました。 次は、Rustで実装を行います。このRustで実装する際、結構複雑なことを行うのでじっくり時間をかけて丁寧に説明したいと思っています。調査班の手を借りるかもしれません。 でも、この内容をしっかりベースに持てるようになったら、そうとう力がついて、いろいろなものを作っていけるようになると思います。

かなり編集に時間がかかりそうですので、その前に、抽象化について復習したり、 ネットワークのこと、Packet、アドレスのことについて頭に入れておきたい場合は、本誌Vol.1で復習しておいてくだださい。

ネットワークを流れるPacketをプログラムから操作できるようになりたいという人には必見のマガジンです。