インターネット通信の常識
今や私たちは、ネットワークに接続しない日はありません。しかし、あたりまえのように接続しているネットワークの仕組みについて、あいまいな知識しか持っていない人もいることでしょう。
インターネットはIPで実現されており、そのベースになっているのはイーサネットです。このイーサネットでは、MACアドレスを宛先として通信します。では、IPアドレスは何のために存在しているのでしょうか。MACアドレスだけでは通信を行うことはできないのでしょうか。
MACアドレスはネットワーク機器に、IPアドレスはコンピュータに割り当てられています。MACアドレスだけでの通信も可能ですが、「どういう経路でどうやって直接MACアドレスを探すのか」という問題にぶつかり、現実的とは言えません。MACアドレスでなくIPアドレスで宛先を決めて送受信するのは、単純にわかりやすくするとか、ユーザが指定できるようにするためだけではなく、ルータを介して複数のセグメントを経由して送受信するためという目的も大きいのです。
自分でネットワークに参加してみる
このようなIP通信の基本を理解するためには、ネットワークを自作してみるに尽きます。MACアドレスやIPアドレス、ネットマスクを指定して、ARP要求に応答する仮想IPホストプログラムを作ってみましょう。ARP要求に応答するだけで、かんたんにIPアドレスの存在を確認することができます。また、pingと同等の機能も実装します。サブネットとデフォルトゲートウェイも指定できるようにしておきます。
この仮想IPホストが実現する機能は、次のとおりです。
- 指定した仮想IPアドレス宛のARP要求に対して仮想MACアドレスを応答する
- 自分宛のICMPエコー要求に応答する
- ARP要求を送信し、ARPテーブルを管理する
- ICMPエコー要求を送信し、応答を受信してpingと同等にRTTを表示する
- 他のセグメントとの通信も可能に
スレッド構成は、図1のようにしましょう。
図1 スレッド構成
実行するネットワークは、図2のようなイメージです。
図2 実行するネットワークのイメージ
どのようなソースコードになるのかは、本書『ソースコードで体感するネットワークの仕組み』を参考にしてみてください。設定ファイル(MyEth.ini)でIP-TTLを64に設定し、deviceに指定した他のネットワーク機器を準備して実行すると、ARP要求やICMPエコー応答などが実行されていくのがわかります。
カーネル任せでは身につかない知識をつけよう!
本書では、上記のような拡張機能を使わないシンプルな仮想ホストプログラムを、UDPやTCPなどを追加して拡張させていくことで、ネットワークの仕組みを体験できます。RFCをただ眺めるだけではわからないパケットの流れを実際に追うことができるので、理解も深まります。
カーネルやデバイスドライバに頼ったほうが簡単ではありますが、イーサネットフレームを直接扱う技術はさまざまな場面で必要になりますし、自分でコントロールするほうが良い場面もあります。DHCPのクライアント機能の作成や、ARPを使った不正接続検知の仕組みの作成、さらにはイーサネットフレームを中継しながらのブリッジやルーター作成にもつなげることができます。ネットワークの仕組みを十分に理解することで、問題の切り分けや問題発生の予防に役立つ力も身につくでしょう。
本書は、ソースコードが多く実装も大変ではありますが、ネットワーク関連製品の開発現場では、動かしながら試行錯誤することがほとんどです。悩むより手を動かしながら、ネットワークの仕組みを体験しましょう!