N4: TCP/IPプロトコルスタック自作入門
1. 概要
この講義では、インターネットをはじめとする現在のコンピュータネットワークを支えている基盤技術「TCP/IP」のプロトコルスタックをフルスクラッチで実装し、実際のOSに搭載してネットワーク機能を持たせる演習を行います。
講師が開発している教育用のプロトコルスタック「microps」を教材に、Ethernetフレームを組み立てて送受信するところから ARP、IP、ICMP、UDP、TCP などのプロトコルを処理するプログラムを、全て自分の手で作り上げてもらいます。
- microps: https://github.com/pandax381/microps
なお、講義時間が限られているためプロトコルスタックの基本的な実装は事前学習の期間(約1ヶ月)で済ませてもらいます。各自で事前学習を進めてもらうにあたり、解説資料を配布するとともに、ミーティングの機会を設けてしっかりフォローアップしますので安心してください。
講義時間では、あらかじめ開発を進めておいてもらったプロトコルスタックを、教育用OSの「xv6」に搭載して実際にTCP/IPでの通信を実現することを目指します。具体的には、次のような作業を行うことになります。
具体的には、次のような作業を行うことになります。
- デバイスドライバの実装
- プロトコルスタックの移植(プラットフォーム依存の処理の実装)
- ソケット関連システムコールとユーザライブラリの実装
この講義を通じてTCP/IPへの理解を深めるとともに、パケットやプロトコル処理の楽しさを知ってもらえたら嬉しいです。
2. 開発環境
各自で開発用のLinux環境を準備してください。
- Ubuntu 24.04 を推奨
- 実機 or 仮想環境どちらでもOK(WindowsはWSL2で動作確認済)
- Dockerで構築する場合には –privileged または –cap-add=NET_ADMIN が必要
- 必要パッケージ(Ubuntuの場合)
- build-essential
- git
- iproute2
- iputils-ping
- netcat-openbsd
- gdb-multiarch
- qemu-system-misc
- gcc-riscv64-linux-gnu
- binutils-riscv64-linux-gnu
- 開発環境からインターネットへ接続できること
3. 事前学習
本講義の受講生には、事前学習のために以下の書籍を配布します。
- ゼロからのTCP/IPプロトコルスタック自作入門(マイナビ出版) https://book.mynavi.jp/ec/products/detail/id=149014
講義の時間が限られているため、当日はプロトコルスタック本体についての細かな説明はしません。上記の書籍に従ってLinuxのユーザ空間で動作するプロトコルスタックを実装し、全体の構成やパケット処理のフローを把握しておいてください。
なお、事前学習を最後まで進められなかった場合には、以下の手順で完成状態のコードを取得してください。
$ git clone https://github.com/pandax381/microps.git
$ cd microps
$ git checkout book
4. 講義内容
- 導入
- xv6について
- コードの取得
- ビルド
- xv6の起動
- QEMUモニタ
- xv6の終了
- 再ビルド
- 下準備
- 型定義の追加
- コンソール出力の改良
- 現在時刻の取得
- カーネルスタックの拡張
- 移植の土台作り
- 自作プロトコルスタックの移植(前編)
- メインモジュール
- Ethernetモジュール
- virtio-netドライバ
- ハードウェア割り込み
- ソフトウェア割り込み
- 自作プロトコルスタックの移植(後編)
- IPモジュール
- ARPモジュール
- ICMPモジュール
- UDPモジュール
- TCPモジュール
- ソケット
- ファイルディスクリプタとの互換性
- ソケット層の移植
- システムコールの追加
- 通信アプリケーション
- 応用課題(選択式)
- A: タイマー機能の有効化
- B: ソケットのTCP対応
- C: pingコマンドの実装
- D: インタフェース制御