hirapi's blog

ちゃんとしたふりをする

TCP/IPを知る初手として『ネットワークはなぜつながるのか』を読んだ

『ネットワークはなぜつながるのか 第2版』を読んだ。
今まで何も知らずにWebエンジニアを名乗っててごめんなさいの気持ちになった。

www.amazon.co.jp

基本情報のテキストですぐ嫌になった分野だし、なんなら1年半前くらいにこの本を読もうとして挫折したこともあるけど、最近ふつふつと基礎固め欲がわきあがってきて、初手のひとつとして再挑戦することにした次第。
1週間かけて読み終えた(物理層のあたりはだいぶ飛ばし読みになってしまったけど)ので、過去の自分に「こうしたらがんばって読めるかも」とおせっかいをやく気持ちで、今回読み通せたポイントみたいなものを2つ書いてみた。

わからないところがあっても、メモだけしてとりあえず先へ進む

わからないところはあって当然で、その場で完全に飲み込む必要は無いように思った。理由は

  1. 章の後半で次の章の内容がちょっと出がち
  2. ある事柄について、多面的に知って初めて意義がわかる

の2つだ。

1. 章の後半で次の章の内容がちょっと出がち

この本は全体を通して、ひとつひとつの動作や仕様について「なぜそういうことをする必要があるのか」「なぜそういう取り決めになっているのか」という意図の説明に注意が払われている(ように思う)。
そのため、1章から順にブラウザ、プロトコル・スタック、LANアダプタ、ハブ、と追っていく中で、次の機器と連携する箇所についてはどうしても「ここでは〜という作業をする、なぜなら次に続く機器が〜という仕組みになっているからだ」という話が出てくる。
この時点で「次に続く機器」の仕組みを完全に理解しようとするのは難しいしあまり意味が無い。なぜなら次の章で「次に続く機器」についてちゃんと説明されるからだ。
こういうところはとりあえず次に行って、概要がつかめたときに時に戻ってきて読み返せばいい。

2. ある事柄について、多面的に知って初めて意義がわかる

たとえばサブネットとIPアドレスの話が第1章に出てくる。その時点ではそれぞれなぜ存在しているのか、なぜそうなっているのかよくわからないかもしれない。
けれど読み進めて行くと、第2章でサブネット内の全機器にパケットを送る「ブロードキャスト」を活用する場面(ARP)があり、第3章でグローバルIPアドレスとローカルIPアドレスやアドレス変換の話が出てくる。これらを読むと、サブネットがどういう存在なのか、IPアドレスのネットマスクとは何なのか、ということが少しずつつかめてくる。
いろんな面を知るとイメージが結びやすい。初出時によくわからなくても、へこまずに進んでみるのがいいと思った。

メモを取る理由

わからない点をメモしておくことも個人的には大事だった。
この本は情報量がとても多い。ので、わからない点はたくさん出てくる。それを保留している間にも新しい機器が出てきて新しい仕組みが出てくる。
それらを全部脳内メモリにのせておくのはとても難しく、読み進めているうちにどこがどうわからなかったか忘れてしまう。

私は本とnotion(ドキュメントツール)を行ったり来たりして、わからなかった箇所も含めて内容の大まかなメモを取りながら読んでいた。
パケット送信部分の説明でIPヘッダの項目の表をわからないまま写して、後で受信側がIPヘッダを読み取る場面で「なるほど!」と思えたらメモした表に戻って詳細を追記する、といった感じ。
特にわからない部分には「?」を付けておき、わかったら「?」を消して理解した範囲で説明を付けた。
時間はやや余計にかかるけど、ちゃんと理解するためには役に立つ、はず。

誰が何をするためのヘッダ(情報)なのかを整理する

進んでいくにつれて、ユーザーがもともと送りたかったデータにどんどんヘッダ(HTTPヘッダ、TCPヘッダ、IPヘッダ、MACヘッダ)が付加されていく。ヘッダには、受け取り手が次に何をするべきか、そのパケットをどう扱うべきかを端的に示す情報が詰まっている。

そもそもユーザーは誰にデータを渡したかったのかというと、Webサーバ上で動くプログラムだ。
次々に付けられていくヘッダには、最終目的地であるプログラムに至るまでに仲介する各フェーズで必要な情報が入っている。
本文中で何度か繰り返されるが、例えばIPヘッダの情報を見る機器・ソフトウェアにとっては、TCPヘッダ・HTTPヘッダ・データ本体の3つがまとめて「データ」となる。中継作業に使うのはIPヘッダの情報だけで、なんならTCPヘッダがあろうが無かろうが関係無い。
逆に言えば、IPヘッダにはその機器にとって必要な情報が詰まっている。したがって、IPヘッダの内容を見ればその機器の動きがわかるし、その機器の動きがわかればIPヘッダに存在する項目の意味もわかる。

  • どのヘッダがどのフェーズで使われるのか?
  • そのフェーズではどのヘッダでどの項目を見て、何をするのか?

これらを整理すると、登場する機器・ソフトウェアとヘッダの仕様とがリンクして、全体の流れについて合点がいきやすかった。

この本の章立てや図で表現されているように、ネットワークの仕組みは大小の階層構造から成っていて、例えば「TCP/IP」で検索すると4層の図が出てくる。
本文中の「ブラウザ」が「アプリケーション層」、「TCP」が「トランスポート層」、「IP」が「インターネット層」、「イーサネット」が「ネットワーク・インターフェース層」にあたる。
本文中にも「ハブはイーサネットのルールに従う」「ルータはIPのルールに従う」というように、要所要所で機器と階層の対応について言及される。各機器・ソフトウェアの動きを本文に沿って探検しながら、たまにこの階層図を見て「今の説明はこの部分」と確認しながら進むのもいいと思う。
(もちろんOSI参照モデルの図でも)

感想

よくある試験対策のテキストと違って「なぜそうなっているのか」がわかるように組まれているし、あわせてちょっとした歴史的経緯みたいなものも書いてあり、今までさっっっぱりわからなかったネットワークについてやっとイメージが持てた。
強いて困った点を挙げるなら、あまり馴染みのないネットワーク・インターフェース層について「これはイーサネットだけの話なのか、同じ層の他のものにも共通なのか」という点がよくわからなかった。UDPとの対比でTCPを理解するように、自分で他の仕様と比べてみたらわかるかな。

なんか偉そうに色々書いてしまったけど100%完全に理解したとはとうてい言い難いので、サーバの設定をしたり他の本を読んだりしていろんな角度から理解を深めていかねば。
(とはいえ、読めなかった昔の私よりは読み切った今の私のほうが偉いので、偉そうでもいいやと思い、このまま公開する)