電気ひつじ牧場

技術メモ

技術書典10で「Rustで始めるTCP自作入門」を頒布してます

どんな本か

Rustを使い,「TCPセグメントが1つ送信できる」という段階から「自作TCPを使って画像ファイルを送信できる」という段階まで少しずつTCPの実装を作成していく本です.

最終的に出来上がるもの

自作TCPの上で次のアプリケーションが動くことを目標にしています.

  • エコーサーバ,エコークライアント
    • 文字列のやりとりを行う
    • サーバは複数のクライアントを同時にハンドリングする
  • ファイルサーバ,クライアント
    • アップロード機能のみ
    • クライアントから数MBのファイルをサーバにアップロードする
    • 少しくらいパケットがロスしても問題なく完了する

これらのアプリケーションを作るにあたって,自作TCPにおいて作成する機能は主に次の通りです.

  • listen, accept, connect, send, recv, closeといった基本的なAPI
  • 再送制御
  • 順序制御
  • スライディングウィンドウ

対象読者について

  • Rustの基本的な文法を知っている人("The Rust Programming Language(https://doc.rust-jp.rs/book-ja/)"の内容が大体わかる)
  • TCP/IPの基本的な知識がある,またはいつでも参照できるよう入門書(マスタリングTCP/IPなど)が手元にある人
  • Linux開発環境が用意できて,それ関する基本的な知識(コマンド操作など)がある人
  • ネットワークプログラミングに興味のある人
  • Rustで何か作ってみたい人

となっています.Rustの文法そのものに関する説明は本書には無いので,基本的な文法は抑えてから読むのをお勧めします.それほど高度な文法は使われていないため,リファレンスがあれば読み進めるには問題ないと思います.やや難解なところは都度解説を入れています.

ネットワークソフトウェアやTCPそのものに関する解説も少ししか登場しません.「コネクション」,「確認応答」といった用語は知ってる前提として,「それらをどうプログラムとして表現するか」という部分に重きをおいて解説しています.

各章について

1章

1章は基礎編です.std::netにあるTCPのソケットを使ってエコーサーバを作り,アプリケーションからTCPの挙動を観察します.この観察を元に,TCP実装に必要となりそうな要素を考えてきます.また,生ソケットといった実装に必要な知識についても紹介しています.

f:id:cha-shu00:20201230120245j:plain:w280f:id:cha-shu00:20201230120417j:plain:w280

2章

2章は準備編です.LinuxのNetwork Namespaceを利用して,TCP実装に用いる環境の構築を行います.

f:id:cha-shu00:20201230120506j:plain:w280

3章

3章がメインとなる実装編です.小さなTCPセグメントを送信するところから始まり,スリーウェイハンドシェイク,送信,受信,切断の機能を徐々に追加していきます.最終的には,少しのパケットロスが生じる環境下で画像ファイルを送信することができるようになります.

f:id:cha-shu00:20201230120459j:plain:w280f:id:cha-shu00:20201230120455j:plain:w280 f:id:cha-shu00:20201230120451j:plain:w280f:id:cha-shu00:20201230120502j:plain:w280 f:id:cha-shu00:20201230120447j:plain:w280f:id:cha-shu00:20201230120443j:plain:w280

4章

4章は振り返り編です.3章で作った実装を眺めながら,TCPのパフォーマンスに影響を与える要素や仕様が持つ問題点,及びそれを解決すべく生まれたQUICプロトコルについて解説します.

f:id:cha-shu00:20201230123333j:plain:w280

頒布先リンク

techbookfest.org

書籍で解説しているソースコード

ソースコードは環境構築スクリプトと共に公開しています.どんなものが出来上がるのか知りたいという方は下記リンクからどうぞ.

github.com

おわりに

現時点で200部ほど買って頂いています(ありがとうございます).買ってくださった方は感想・作ってみた・批判・高評価・低評価などを呟くなりブログに書くなりして頂けると励みになるのでよろしくお願い致します!