CUBE SUGAR CONTAINER

技術系のこと書きます。

「Linuxで動かしながら学ぶTCP/IPネットワーク入門」という本を書きました

表題のとおり TCP/IP に関する本を書きました。 今回は、そのご紹介です!

今のところは Kindle 版が先行して販売されています。 一週間ほどで、紙の本も手に入るようになる見込みです。

(2020-03-06 追記) 紙の本が注文できるようになりました。

(2020-03-28 追記) Kindle 版には、特定の端末で閲覧できない問題を解消したコンテンツが配信されています。 以前に購入された方はコンテンツの更新をお試しください。

どんな本なの?

Linux を使って実際にネットワークを組んで動かしながら TCP/IP について学べる本です。 実際に手を動かすことで、より実践的で風化しにくい知識と技術を身につけることが本の目的です。

こんな人にオススメ

次のいずれかに当てはまるような方には、この本が参考になると思います。

  • ネットワークが専門ではない IT エンジニア、またはそれを志す学生さん
  • 他の TCP/IP に関する本を読んだことはあるけど、身についている実感が少ない
  • インターネットやインフラの技術についてよく知らないけど興味はある
  • ネットワークを気軽に組んで実験できる環境の作り方に興味がある

そして、この本を読んで試した後には、次のような効果が見込めます。

  • 「インターネットの本質を理解できた」という実感が得られる
  • ネットワークのトラブルシュートで見るべきポイントがわかる
  • なんとなく持っていたネットワークに対する苦手意識がなくなる
  • 「ネットワークがこういう状況では何が起こるんだろう」と思ったときに、試す環境が作れるようになる

執筆のきっかけ

執筆のきっかけは、実際に手を動かしながら TCP/IP について学べる本が世の中に必要なんじゃないか、と感じたことです。 TCP/IP という技術は、理屈について書いてある本はたくさんあるものの、実際に手を動かせるものとなると少なくなります。 さらに、手を動かすための環境構築までカバーした本となると、より限られます。

その原因は、TCP/IP を学ぶための環境構築が難しい点が挙げられると思います。 一般的に、ネットワークを組んで勉強しようとすると、複数台のコンピュータを用意する必要があるためです。 もちろん、仮想マシンを使えば物理的なコンピュータは 1 台で済みます。 ですが、それでもネットワークの構築という手間のかかる作業は残っています。

この本では、その問題を Linux の Network Namespace という機能を使って解決しています。 Network Namespace というのは、Docker といった Linux のコンテナ仮想化技術を支えている機能のひとつです。 Network Namespace を使うと、1 台の Linux マシンの中に、ネットワーク的にはシステムから独立した空間を作れます。 実験用のネットワークを作るのに必要な作業はいくつかのコマンドライン操作だけで、完了するまでには数秒もかかりません。

また、Linux を動かす環境には仮想マシンが使えるため、用意すべき物理的なコンピュータは今使っているラップトップで十分です。 もちろん、利用するソフトウェアはどれもフリーなものなので、追加で必要となる費用もありません。 読みながら試すときは Linux のコマンドライン操作が必要になりますが、あまり親しみのない人にも読んでもらえるように、付録には簡単にですが操作ガイドも用意しました。

どんなことが書いてあるの?

TCP/IP を理解する上で、重要なポイントをギュギュッと詰め込みました。 この本は、プロトコルのヘッダに含まれるすべてのフィールドを網羅的に解説していくような性格の本ではありません。 そのため、TCP/IP に詳しい方からすると「これは書いてないのか」と思う点もあるかもしれません。 ですが、この本を読んで「TCP/IP という技術の地図とコンパス」が頭に入れば、他の本も読みやすくなると思います。 また、書く内容を重要なポイントに絞っても、尚 B5 版で 200 ページを超えるボリュームになりました (付録含む)。

本書は、7 つの章に分かれています。 OSI 参照モデルでいうと L2 から L7 までを一冊でひととおりカバーしています。 説明の順序としては「L3 -> L2 -> L4 -> L7 -> NAT -> ソケットプログラミング」という流れです。 ざっくりと、どんなことを書いてあるのか次に示します。

  • 「TCP/IP とは」
    • この章では TCP/IP の概要とインターネットの動く仕組みについて学びます
    • インターネットでパケットがバケツリレーされる仕組みについて、実際に ping や traceroute コマンドを実行しながら説明を進めます
  • 「Network Namespace」
    • この章では Network Namespace を使って実験用ネットワークを組む方法を学びます
    • 「ルータなし → ルータあり → ルータ 2 台」という流れで、少しずつ複雑なネットワークを組みながら説明を進めます
    • ping を使ってネットワークの疎通を確認したり、パケットを tcpdump コマンドを使って観察します
  • 「イーサネット」
    • この章ではイーサネットが近隣までパケットを運ぶ仕組みについて学びます
    • MAC アドレスを使ってフレームが届く仕組みや、ブリッジ (Linux Network Bridge) でブロードキャストドメインを広げる方法を扱います
  • 「トランスポート層のプロトコル」
    • この章では、トランスポート層のプロトコルを使って、通信の種類を識別したり、信頼性のある通信を実現する方法を学びます
    • はじめに、UDP でポート番号を使って通信するアプリケーションを識別する仕組みについて扱います
    • その次に、TCP が信頼性のある通信を実現している仕組みを扱います
  • 「アプリケーション層のプロトコル」
    • この章では、TCP/IP の集大成としてインターネットでやり取りされる実用的な通信について学びます
    • 扱うプロトコルは HTTP、DNS、DHCP です
  • 「NAT」
    • この章では、IPv4 で組まれた家庭やオフィスなどのネットワークのほとんどで用いられている NAT という技術を学びます
    • はじめに、グローバルアドレスを節約するために用いられる Source NAT について扱います
    • その次に、「ポートを空ける」という表現でよく知られている Destination NAT について扱います
  • 「ソケットプログラミング」
    • この章では、TCP/IP をソフトウェアから扱う方法について学びます
    • プログラミング言語としては Python を使います
    • 取り扱う題材は、HTTP クライアント、エコーサーバ、独自の足し算バイナリプロトコルです

どんな人が書いたの?

著者は、とあるインターネット関連企業で働いているソフトウェアエンジニアです。 ネットワーク機器の開発で IPv6 プロトコルスタックを担当していた経験があります。 一時期は SDN (Software Defined Network) 関連のソフトウェアの研究開発や OSS コントリビューションを仕事としてやっていました。 また、時期によっては Web アプリケーションの開発もしていたので、L2 ~ L7 にかけてひととおりの開発経験があります。 なので、出自は「ソフトウェア寄りのネットワーク屋さん」といったところです。

なお、過去にブログで TCP/IP について扱って話題となったエントリだと、次のようなものがあります。

blog.amedama.jp

blog.amedama.jp

中身を軽く読んでみたい

本の雰囲気を確かめてから買いたいという方もいらっしゃるかと思うので、以下に立ち読み版の PDF をご用意しました。

drive.google.com

おわりに

私の好きな言葉のひとつに「特定の分野におけるプロフェッショナルとは、その分野でひととおりの失敗を経験した人のことをいう」という言葉があります。 ぜひ、この本を使って、たくさん失敗できる環境を手にしていただければ幸いです。

謝辞

この場を借りて、本の表紙を書いてくれた Asano Sonoko さん、技術的なレビューをしてくださった @ttsubo さんに心からお礼を申し上げます。 おかげさまで、プライベートで 2 年ほどかけて少しずつ書いた本を世に出すことができました。 本当にありがとうございました。