この講義では、インターネットをはじめとする現在のコンピュータネットワークを支えている基盤技術「TCP/IP」のプロトコルスタックをスクラッチで実装し、実際のOSに搭載してネットワーク機能を持たせる演習を行います。
講師が開発している教育用のプロトコルスタック「microps」を教材に、Ethernetフレームを組み立てて送受信するところから ARP、IP、ICMP、UDP、TCP などのプロトコルを処理するプログラムを、全て自分の手で作り上げてもらいます。
- microps: https://github.com/pandax381/microps
なお、講義時間が限られているためプロトコルスタックの基本的な実装は事前学習の期間で済ませてもらいます。 各自で事前学習を進めてもらうにあたり、解説資料を配布するとともに、ミーティングの機会を設けてしっかりフォローアップしますので安心してください。
講義時間では、あらかじめ開発を進めておいてもらったプロトコルスタックを、教育用OSの「xv6」に搭載して実際にTCP/IPでの通信を実現することを目指します。
具体的には、次のような作業を行うことになります。
- デバイスドライバの実装(Intel e1000)
- プロトコルスタックの移植(プラットフォーム依存の処理の実装)
- ソケット関連システムコールとユーザライブラリの実装
この講義を通じてTCP/IPへの理解を深めるとともに、パケットやプロトコル処理の楽しさを知ってもらえたら嬉しいです。
各自で開発用のLinux環境を準備してください。
- Ubuntu 22.04 を推奨
- 実機 or 仮想環境どちらでもOK(WindowsはWSL2で動作確認済)
- Dockerで構築する場合には --privileged または --cap-add=NET_ADMIN が必要
- 必要パッケージ(Ubuntuの場合)
- build-essential
- git
- iproute2
- iputils-ping
- netcat-openbsd
- gcc-multilib
- qemu-system-x86
- 開発環境からインターネットへ接続できること
事前学習のための資料を用意してあります。
講義の時間が限られているため、当日はプロトコルスタック本体についての細かな説明はしません。上記の資料に従ってLinuxのユーザ空間で動作するプロトコルスタックを実装し、全体の構成やパケット処理のフローを把握しておいてください。
- 導入
- xv6について
- コードの取得
- ビルド
- xv6の起動
- QEMUモニタ
- xv6の終了
- 再ビルド
- 下準備
- 型定義の追加
- コンソール出力の改良
- 現在時刻の取得
- 便利ライブラリの移植
- ネットワークデバイス
- PCIデバイスの検出
- Intel e1000ドライバ
- プロトコルスタックの移植
- メインモジュール
- Ethernetモジュール
- IPモジュール
- ARPモジュール
- ICMPモジュール
- UDPモジュール
- TCPモジュール
- ソケット
- システムコールの追加
- ファイルディスクリプタとの互換性
- ソケットの内部実装
- 通信アプリケーション
- 応用課題(選択式)
- A:ソケット(TCP対応)
- B:インタフェース制御
- C:タイマ機能の有効化と時刻精度の向上