$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

マスタリングTCP/IP 入門編を読んだ

最近ホームネットワークで調子が悪いことがあったのだけど、その理由の調査が一切できずに困っていた。また、これまでネットワークが一切分からない状態で、インフラ周りを触る時に完全に他人におまかせだったり、そもそも共通言語で話せなかったりして、その部分を課題に感じていた。そこでこの機会にと、マスタリングTCP/IP 入門編を読んだ。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

非常に面白く読んでよかったと感じた。入門編と言っているとおり、ネットワークの基礎知識がほんの少しだけあれば理解できるようになっていた。ただし、話題として共有するために結構深入りしている部分もあったので、よく分からないところは飛ばしつつ読んでいっても良いと思う。

特に分かりやすかったのは、ネットワークの概念を一般的に使われている概念に例えてくれるところ。例えばOSIの階層モデルの意味を、電話で二人が会話している時のイメージに例えてくれていたけど、こういう例えが非常に分かりやすかった。概念だけ聞いてると漠然と理解した気持ちになるだけなので、ありがたかった。

僕はWebサービスのアプリケーションエンジニアをしているので、以下の章が勉強になった。

  • 第1章: ネットワーク基礎知識
  • 第2章: TCP/IP基礎知識
  • 第3章: データリンク
  • 第4章: IPプロトコル
  • 第6章: TCPUDP

この本を読んだことで、データリンク層ネットワーク層トランスポート層それぞれで疑問が生じ、それを実践することでさらに理解を深められたのも良かった。実践した内容は以下の3記事。

どうやってIPからMACアドレスを解決するか - ARPの挙動を調べた - $shibayu36->blog;
tracerouteの仕組みをtcpdumpとwiresharkで理解する - $shibayu36->blog;
HTTP GETしたときのTCPパケットの様子を理解する - $shibayu36->blog;


とにかく面白かったので、ネットワークで困ったらまず最初に読むと良さそう。

読書ノート

自分が面白かったと思うところだけメモを取った。

## 第1章: ネットワーク基礎知識
- OSI参照モデルでは、各階層は、階層から特定のサービスを受け、上位層に特定のサービスを提供する 437
- 会話で階層化を考えると 453
    - 電話での会話の例。言語層と装置層の2階層モデル
- OSI参照モデルとプロトコルの意味 469
- OSI参照モデルの各層の役割と、機能イメージ 501
    - 物理層: 0/1のbitを電圧や光の点滅に変換。コネクタの形などの規定。
    - データリンク層: 直接接続された機器間でのデータフレームの識別と転送
    - ネットワーク層: アドレスの管理と経路の選択
    - トランスポート層: 両端ノード間のデータ転送の管理。データ転送の信頼性を提供
    - セッション層: 通信の管理。コネクションの確立や切断。(例)コネクションをいつ確立していつ切断する?いくつ貼る?
    - プレゼンテーション層: 機器固有のデータフォーマットと、ネットワーク共通のデータフォーマットの交換。(例)文字列や画像、音声などの情報の表現の違いを吸収。
    - アプリケーション層: 特定のアプリケーションに特化したプロトコル。(例)電子メール、遠隔ログイン
- OSI参照モデルによる通信処理の例 523
    - 電子メールの通信例で、分かりやすい例なので、OSI参照モデルのイメージに参考になる
- ネットワーク層とデータリンク層の役割分担の図 616
- コネクション型とコネクションレス型 661
    - コネクション型はデータ送信開始前に送信ホストと受信ホストの間で回線接続をする
    - コネクションレス型はコネクション確立や切断処理がない。送信側はいつでも送信できる。逆に受信側はいつデータが来るか分からない
- 回線を占有利用しないように、パケット交換方式が使われる 695
    - パケットはルータが受け取り、ルーターのバッファに格納しながら、順に転送していく
- 転送表と経路制御表によるパケット送出先の決定の図 804
- ネットワーウを構成する機器とその役割 804
    - ネットワークインタフェース、リピーター、ブリッジ/レイヤ2スイッチ、ルーター/レイヤ3スイッチ、レイヤ4-7スイッチ、ゲートウェイ
- コンピュータをネットワークに接続するインタフェースのことをNIC、ネットワークアダプタ、ネットワークカード、LANカードなどと呼ぶ 898
- データリンクのフレームには、フレームが正しく届いたかチェックするFCSというフィールドがある 940
- ブリッジは壊れたフレームを他セグメントに送らないようにしたり、アドレス学習機能とフィルタリング機能でむだなトラフィックを流さないようにする 940
    - 一度そのブリッジを通過したフレームのMACアドレスは一定時間ブリッジ内部のテーブルに登録され、どのセグメントにどのMACアドレスを持つ機器が存在するかを判断する仕組み
- ゲートウェイとは、トランスポート層からアプリケーション層までの階層で、データを変換して中継する装置 982
    - 分かりやすい例は、インターネットの電子メールと携帯電話の電子メールを交換するサービス
- 各機器と該当するOSI参照モデルの階層のまとめ図 1024
    - 分かりやすい

## 第2章: TCP/IP基礎知識
- TCP/IPプロトコル標準化の流れ 1428
- インターネットの構造 1490
    - 小さなネットワーク同士が接続されて組織内のネットワークを構成
    - 組織のネットワーク同士が接続されて地域ネットワーク
    - 地域ネットワーク同士が接続されて、世界中を形作る
- OSI参照モデルとTCP/IPの関係図 1531
    - データリンク層はTCP/IPでいうところの何かなどが理解できる
- インターネット層プロトコル概論 1555
    - IP: ネットワークをまたいでパケットを配送し、インターネット全体にパケットを送り届けるプロトコル
    - ICMP: IPパケットの配送中に何らかの以上が発生してパケットを転送できなくなった場合に、パケットの送信元に以上をしらせるために使われる
    - ARP: パケットの送り先のMACアドレスをIPアドレスから取得するプロトコル
- トランスポート層プロトコル概論1575
    - TCP: 両端のホスト間でデータの到達性を保証。データの順番の入れ替わりやパケット消失もTCPが解決。ただしコネクション確立/切断のオーバーヘッドはある
    - UDP: コネクションレス型で信頼性はないがコネクション確立のオーバヘッドはない。ブロードキャスト、マルチキャストの通信、ビデオや音声などのマルチメディアの通信に向く
- TCP/IPの階層モデルと通信例 1677 ※
    - 非常に分かりやすいので、通信するときに何が起こっているか知るためにはここを見ると良い

## 第3章: データリンク
- データリンク層のプロトコルは、通信媒体で直接接続された機器間で通信するための仕様を定める 1810
- 媒体共有型のネットワーク 1899
    - コンテンション方式: 早い者勝ち。複数のデータが衝突したら壊れる。CSMA/CD方式のような衝突検知の仕組みもある。
    - トークンパッシング方式: トークンと呼ばれるパケットを巡回させ、送信権を制御
- 媒体非共有型のネットワーク: 1935
    - スイッチに直接接続され、スイッチがフレームを転送する
- ツイストペアケーブルは送受信をケーブル内の別々の線で行える 1962
- イーサネットスイッチ 1965
    - インターフェースと宛先MACアドレスの紐付けを記録したフォワーディングテーブルを持つ
    - フォワーディングテーブルを見て、フレームの宛先のインタフェースにのみデータを送る
    - あるMACアドレスを送信元とするパケットをあるインターフェースから受け取ったなら、それを自動で学習する
- VLAN 2045
- 通信速度が同じで通信ケーブルが違う場合はリピーターやハブで接続できる。通信速度が違う場合には、速度変換機能を持つブリッジやスイッチングハブ、ルーターでなければ相互に接続できない 2077
- イーサネットのフレームフォーマット 2171
    - プリアンブル、SFD、送信元、送信先、上位層のプロトコルタイプ
- 無線規格のIEEE802.11 2278

## 第4章: IPプロトコル
- ネットワーク層の役割は、「終点ノード間の通信を実現する」こと 2728
    - 通信経路になっているデータリンクの違いを覆い隠し、別のデータリンクに接続されているコンピュータ間での通信を可能に
- IPの役割とデータリンクの役割の違い 2779
    - データリンクは1区間の通信を実現
    - IPは最終目的地までの通信を実現
- IPの3つの役割: IPアドレス、終点ホストまでのパケット配送、IPパケットの分割処理と再構築処理
- パケットはルーターにたどり着くごとに、次にどちらに行くかが判定され、この作業を繰り返して最終的な目的地にたどり着く 2841
- すべてのホストやルーターはルーティングテーブルを持ち、これで経路が決定される 2861
- 途中の経路のデータリンクの最大転送単位(MTU)を超えないように、IPでは大きなIPパケットを複数の小さなIPパケットに分割するフラグメンテーションを行う 2878
    - 分割されたパケットは宛先のホストで再び一つにまとめられ、IPの上位層に渡される
- IPパケットが途中のルーターで転送されるときは、宛先IPアドレスのネットワーク部が利用される 2952
- ローカルブロードキャストとダイレクトブロードキャスト 2999
- IPマルチキャスト 3029
    - 224.0.0.0から239.255.255.255までの範囲がIPマルチキャストアドレス
- CIDR: クラスに縛られない組織間の経路制御 3133
- 可変長サブネットマスク(VLSM): 組織内の部署ごとにサブネットマスク長が変えられる 3155
- 経路制御の方法 3275
    - netstat -rで経路制御表を確認できる
    - 経路制御表に一致するものが複数あれば一致するビット列が長い方のネットワークアドレスを選択
    - 次に配送すべきルーターのアドレスが記載されている場所に、そのホストやルーター自身のNICのIPアドレスが書かれている場合は、「宛先ホストが同一データリンクに接続されている」という意味
    - デフォルトルートとは、経路制御表に登録されているどのアドレスにもマッチしない場合の経路
- 分割されたIPデータグラムを元のIPデータグラムに戻す再構築の処理は、終点ホストでしか行わない 3381
    - 途中のルーターは分割処理のみ
- 経路MTU探索: 送信先ホストから宛先ホストまで分割処理が必要にならない最大のMTUを探索する 3380
    - ルーターに分割処理をさせて負荷を上げないように送信側で決定してから送信する
    - 図: 3407
    - IPヘッダの分割禁止フラグをONにすると、途中のルーターは分割が必要になればパケットを破棄してICMP到達不能メッセージでMTUの値を送り返してくれる。これを使って再送信を繰り返して、ICMPが返ってこなくなれば経路MTUが得られたことになる
- IPv4ヘッダフォーマット 3526
    - 識別子: フラグメントを復元する際の識別子
    - フラグメントオフセット: 分割されたフラグメントがオリジナルデータのどこに位置していたか
    - TTL: 何個のルーターを経由してよいか

## 第5章: IPに関連する技術
- ICMPには、IPパケットが目的のホストまで届くかどうか確認する機能や、何らかの原因でIPパケットが廃棄されたときにその原因を通知してくれる機能、不十分な設定をよりよい設定に変更してくれる機能などがある 4097
- DHCPでIPアドレスを取得するときは、2段階で行われる 4288
- DHCPリレーエージェント: サブネットごとにDHCPサーバーを管理しなくて良いようになる 4321
- NAPT: アドレスとポートをけ替えることで、1つのグローバルIPアドレスで複数のホスト間の通信が可能になる 4344
- NAT越え 4382
    - NATの外側から内側のサーバーに接続するにはどうするか
    - NATの内側のホストで動かしているアプリケーションが、NATの変換テーブルを作成するために、ダミーのパケットを外側に送り、変換テーブルを作らせて通信する
    - アプリケーションがNATルーターと通信してNATテーブルの作成をしたり、NATルーターに付けられているグローバルIPアドレスをアプリケーションに伝える方法もある
- IPトンネリング: ネットワーク層のヘッダの次にまたネットワーク層のヘッダが続く通信方法 4402
- IPエニーキャスト: 同じIPに向けて送っても地域ごとに適したサーバーにIPパケットが送られ、そこから応答が返ってくる仕組み 4485
    - 電話でいう110番の仕組み
    - DNSのルートネームサーバーでの利用
- 通信品質を制御する仕組み: IntServ、DiffServ 4507
- Mobile IP: ホストが接続しているサブネットが変わってもIPアドレスが変わらないようにする技術 4572

## 第6章: TCPとUDP
- トランスポート層ではポート番号を利用して、そのホストのどのプログラムにパケットを渡せばよいか決定する 4620
- TCP: コネクション指向で信頼性が高い 4668
    - TCPでメッセージを送信すると、区切り目のないデータ構造として受信側のアプリケーションに届く
    - 順序制御、再送制御、フロー制御、輻輳制御、ネットワークの利用効率を向上させる仕組みなどたくさんの機能を持つ
- TCPは信頼性のある通信をアプリケーションに提供し、UDPは高速性やリアルタイム性を重視する場合などに使われる 4689
- TCPやUDPによる通信では、宛先IP、送信元IP、宛先ポート番号、送信元ポート番号、プロトコル番号の5つの数字の組み合わせで通信を識別 4733
- ポート番号はトランスポートプロトコルごとに決定されるので、異なるトランスポートプロトコルなら同じポート番号を利用できる 4770
- TCPは確認応答(ACK)を使って信頼性を確保する 4992
    - シーケンス番号を使って、既に届いたパケットの識別などをしている
- 再送タイムアウトの決定 5032
    - パケットを送信するたびにラウンドトリップ時間とそのゆらぎを計測し、その二つを考慮して動的に決める
- SYN、ACK、FINなどを使ってコネクションの確立、切断を行う 5052
    - 確立と切断だけで7つ以上のパケットがやり取りされる
- TCPはコネクション確立要求をするときに通信を行うデータ単位(MSS)を決定する 5053
    - 送信側と受信側の通知するMSSの小さい方を利用
- スライディングウインドウ方式での並列処理 5085
    - 複数のセグメントを並列で送信して通信性能を向上させる
    - ある程度確認応答が失われても再送する必要がなくなる
    - ウィンドウ制御する場合の送信データが失われた場合の再送の仕組み 5119
- フロー制御 5119
    - 送信側は受信側の受信能力に合わせてパケット送信量を制御
    - 受信側はTCPのヘッダに受信可能なウィンドウサイズを通知して、送信側に制御させる
- ふくそう制御 5147
    - スロースタートアルゴリズム
- ピギーバック 5206
    - 確認応答と返事のデータパケットを1つのパケットで送ることができる
    - 送受信するパケットの数を減らせる
- UDPヘッダのフォーマット 5285
    - チェックサム計算には送信元IPアドレス、宛先IPアドレスを含めたUDP疑似ヘッダをUDPデータグラムの前に付けてから計算する。疑似ヘッダを付けないと、トランスポートレイヤで宛先のIPなどの誤りを検知できないため
- TCPヘッダのフォーマット 5332
    - シーケンス番号: 送信したデータの位置。データを送信するたびに送信したデータのオクテット数だけ値が加算
    - 確認応答番号: 次に受信すべきデータのシーケンス番号
    - コントロールフラグ: ACKとかSYNとかのタイプを指定する
    - ウィンドウサイズ: 確認応答番号で示した位置から、受信可能なデータサイズを通知する

## 第7章: ルーティングプロトコル(経路制御プロトコル)
- スタティックルーティングは管理者に大きな負担がかかる、ネットワーク障害時に自動的に迂回するような制御ができない 5515
- ダイナミックルーティングでは、経路制御に必要な情報を交換するために、隣り合うルーター間で定期的にメッセージをやりとりする 5536
    - 情報がバケツリレー式に伝えられて、隅々まで伝わると経路制御表が完成し、IPパケットを正しく転送できる
- 自律システム(ルーティングドメイン)の内部で利用されるルーティングプロトコルがIGP、ドメイン間で利用されるのがEGP 5573
- IGPにはRIP、RIP2、OSPFが利用されている。EGPではBGPが利用されている 5574
- 経路制御アルゴリズムには距離ベクトル型とリンク状態型の二つがある 5591
    - 距離ベクトル型はネットワークへの距離と方向の二つで目的のネットワークの位置を決定する方法
    - リンク状態型はルーターがネットワーク全体の接続状態を理解して経路制御表を作る

## 第8章: アプリケーションプロトコル
- SSHでポートフォワードすることで、セキュリティを確保した通信が可能に 6007
- SNMPはネットワーク管理のプロトコル 6689

## 第9章: セキュリティ
- VPNを構築する時に最も使われているのはIPsec 7019
    - IPヘッダの後ろに暗号ヘッダや認証ヘッダを付け、そのヘッダ以降のデータを暗号化する
    - 受信側は暗号ヘッダや認証ヘッダを解釈しデータを復号する
    - 通信経路ではIPパケットレベルでデータが暗号化されているので、中身が盗聴されることがなく、改ざんの検知もできる