Logo
x logo

箱庭飛行場Ex

3-1.NICとNICドライバーの定義

お久しぶりです。箱庭です。 昨年末にアップした「Arc、Mutex、dyn、Send、Sync、vtable、全部まとめて調査しました」が好評で、年が明けてから、編集部に様々なプロジェクトの依頼がきまして。。箱庭の連載の方をまとめられずにいましたが、3月になり暖かい日々が続くようになってきて、だいぶ春の暖かさが、私の心にも届くようになってきましたので、連載を進めたいと思います。

今回は、NICとNICドライバーです。どういうはたらきをするものか?覚えていらっしゃいますか? 本誌の方を見ながら思い出してみてください。

ソフトコンポーネント はたらき
NIC          NICは物理層でイーサーネットケーブルを接続するカード。
ケーブルから電気信号を受信したら、デコード処理して、
イーサーネットフレームにして上位層であるデータリンク層(L2)に渡す
NICドライバーー プロトコルスタックからデータを受け取り、それを、NICに送る。
NICから上がってきたデータを受け取り、プロトコルスタックに送る。

3-1-1. NIC

NICって?と普段あまり聞きなれないものですが、あなたのPCにもついてると思うのですが、 こういう形のものですね。(最近はWiFi主流でないものもありますね)

正式名称は、Network Interface Card:ネットワークインターフェースカード。略して「NIC」です。 さてこれを抽象化すると? まずは、どういうカタチか?をみてみましょう。

id: 1つのPCに複数のNICを取り付けてるのもありますよね。どれかわからなくならないようにidをつけておきましょう。

そして、覚えていますか? MACアドレス: そうなんです!データリンク層(L2)のアドレスなので、OSあたりが持ってるようなイメージがありますが、実は、MACアドレスはここにつけられたラベルなんですよね。ですので、パソコンでNICを取り替えるとMACアドレスも変わるんです。 OS(カーネル)がNICからMACアドレスを取得して、L2のイーサネットフレームを作っているのです。 MACアドレスについては、こちらで「データリンク層(L2)のアドレス」としてご紹介しているので見直しておいてください。大事です。 ネットワークを流れるパケットは全て最終的にはこのMACアドレスでやりとりされているのですよ。 どうやって動いているのかは、ぜひ本誌で復習してください。

接続されているイーサーネットケーブルのid: そしてNICの口に刺さっているイーサーネットケーブルのidですね。 これを覚えていないとどこに電気信号を流したらいいのかわからなくなってしまいます。

自分のやりとりするNICドライバーのid: NICが受け取ったPacketは、NICから直接L2層に渡すという形ではなく、一旦NICドライバーに渡します。そこから先の処理はNICドライバーに任せるのです。 Packetを送信するときも、OSから直接Packetを受け取るのではなく、NICドライバーから受け取ります。NICドライバーが制御してNICに最適なタイミングで送ってくれるのです。

次章で作る予定の、「Protocol Stack」も含めて関係性を描きますとこんな感じです。

ここまでは大丈夫ですか? 次は、NICのはたらきについて考えてみましょう。

・L2からきたイーサネットフレームに、プリアンサンブルとSFDをつけて、0,1のビット列にして、  イーサーネットケーブルに電気信号を流す。 ・送られてきたPacketが自分が受信すべきものかどうか判断するのもここ。 でしたね。 ・MACアドレスなあに?と、OS(カーネル)問い合わせがきたら、MACアドレスを返す。 になりますね。 これらがNICのはたらきになります。

イーサネットコントローラ、さらにPHYチップ、MACコントローラーと分けて細やかに定義されている方もいるかもしれませんね。それはそのままやっていく方がいいと思います。

実際、送りだす信号の制御、ちゃんと送り届けられるか?などによって色々な方式があります。 エラーチェック(CRCなど)もこの辺りで行っています。そういうことも、PHYチップとして別で定義しておけば、この部分のモジュールを切り替えたりすることで簡単に処理内容の変更が実現できるようになりますしね。 ちなみに、光ファイバーでは電気信号ではなく光信号になりますので、光ケーブルをあらわすときは、別のチップが必要になるでしょうし。。

ここではこのように定義したNICでまず実装していきます。

3-1-1. NICドライバー

さて次に、「NICドライバー」をみていきましょう。 NICドライバーは、NICを制御する役割を持っています。 まずはカタチから。

自分が制御するNICは?を知っておかないといけませんね。 そして、NICから受け取ったPacketを送る先、「プロトコルスタック」の情報も必要です。

シンプルです。

そして、ハタラキは、

NICドライバーは、「プロトコルスタック」からPacketを受け取り、それを、NICに送る。 NICから上がってきたPacketを受け取り、「プロトコルスタック」に送る。 この橋渡し的なのが主な仕事です。


いかがでしたでしょうか? 次回はこのNICとNICドライバーをRustで実装していきましょう。

この章で、NICとNICドライバーまで出来上がると、実は物理層(Layer1)に関わるネットワークコンポーネントの部分である、イーサーネットケーブル、NIC、NICドライバーといった通信に必要なネットワークコンポーネントが出来上がるのです。

そう!物理層だけで、通信がいよいよできるようになるのです!

物理層(Layer1)のPacketといえば?EthernetFrameでしたね。 この章の最後、WASM化が終わったら、JSから、イーサーネットケーブルとNIC2つを繋げて、 2点間をEthernetFrameのPacketを流してみようと思っています。

いよいよ自分が作ったPacketがネットワークに流れる快感を味わっていただけます。

それまで、いろいろネットワークのこと、Packet、アドレスのことについて勉強しておきたい人は、本誌Vol.1で復習しておいてくだださい。

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