【技術書まとめ】図解入門TCP/IP　仕組み・動作が見てわかる

ネットワークについてさらに頭を整理したかったので読んでみた。

# chapter 1 : ネットワークの基礎
- ネットワークとは
    - 1960年代は1台の大型コンピュータ（メインフレーム）をTSS(Time Sharing System)という方式で使用していた
        - 回線交換方式で繋ぎっぱなしだったので、安定しているが占有時の無駄が多かった
    - 1960年代後半から1970年代にARPANET(Advanced Research Projects Agency NETwork)がパケット交換方式のネットワークを世界で初めて採用した
        - 回線を占有せずパケット単位でネットワークに流すので効率がいい
        - ヘッダー情報を見て送り届け、ヘッダー情報を見て元データに復元する
        - 途中でパケットが壊れたり紛失したりしても、小さなパケットだけ再送すればよい
- 通信するときのルールがプロトコル
    - プロトコルはパケットを処理するときの約束事
        - 「https」なら「HTTPSで決められた約束事に基づいて、パケットを処理しますよー」という宣言となる
    - プロトコルで決まっていること
        - 物理的なLANケーブルの素材やコネクタの形状など、目に見えるものや電波の周波数やその変調方法もすべてプロトコルで定義されている
            - NIC(Network interface Card)はプロトコルで定義されている内容に基づいてパケットを流している
        - 住所を割り当てて、送信相手を特定している
            - 「172.217.175.4」でgoogleにアクセスできる
        - パケットの転送
            - どこからどこまでにどんな情報があり、どんな順序でやり取りするかのヘッダーがプロトコルよって定義されている。そのヘッダーという荷札に、送信元や宛先、復元のための通し番号などをつけて転送していく
        - 信頼性の確立
            - エラー通知や、データ再送の仕組みや、有限なネットワークリソースがパケットで溢れないような仕組みを提供している
                - MVNO(Mobile Virtual Network Operator)のスマホが遅くなる帯域制限など
        - セキュリティの確保
            - 正しい通信相手かどうか認証し、通信を暗号化する仕組みを提供している
    - プロトコルは階層で整理する
        - 同じ階層で処理をする
    - ふたつの階層構造モデル
        - TCP/IP参照モデル
            - 1970年代にDARPAが開発した
                - リンク層（ネットワークインターフェイス層）、インターネット層、トランスポート層、アプリケーション層き4つの層
                - OSI参照モデルより歴史が古く、かつ実用性を重視した階層構造になっている
            - 順々に処理を行い、自分の処理が終わってデータを引き渡すと、その後の処理には関与しない
        - OSI参照モデル
            - 国際標準化機構(ISO: International Organization for Standardization）が1984年に策定した階層構造モデル
            - 「あぷせとねでぶ」と覚えた
            - 通信機能を細かく分類しすぎて使い勝手が悪くなった
        - 本書で使用するモデル
        - PDU(Protocol Data Unit)
            - 各階層で処理されるひとまとまりのデータ
                - ヘッダーとペイロードで構成される
                - イーサネットフレームやIPパケットというように、プロトコル名称を頭につけると認識の違いが生まれにくい
            - 広義のパケットはネットワークを流れるデータそのもので、狭義のパケットはネットワーク層におけるPDUのことを表す
    - 標準化団体がプロトコルを決める
        - IEEEが比較的ハードウェアの処理に近いプロトコルを、IETFは比較的ソフトウェアの処理に近いプロトコルを標準化している
        - IEEE(Institute of Electrical and Electorinics Engineers、アイトルプルイー)
            - 「電気電子技術学会」　の略称で、ネットワークインターフェイスやケーブルなどハードよりの技術の標準化は「IEEE802 委員会」という1980年2月発足の分科会で議論されている
        - IETF(Internet Engineering Task Force)
            - HTTPやSSL/TSLなど比較的ソフトウェアよりのプロトコルはIETFが策定している
            - RFC(Request For Comments)という文書で公開される
    - 各階層が連携して動作する仕組み
        - それぞれの階層でペイロードにヘッダーを付けてカプセル化して、PDUにしてから、ひとつ下の階層に渡す
        - コネクション型が送っていいかお伺いを立ててから送り、コネクションレス型はいきなり送る
- ネットワークを構成する機器
    - 物理層で動作する機器
        - NIC(Network Interface Card)
            - もともとは拡張スロットに接続するカードタイプが多かったのでカードという名称が残っているが、現在はネットワークに接続するためのハードウェアの総称となっている
        - リピーター
            - 100m近くになると波形が崩れるので、それをもう一度増幅して転送することで伝送距離を延ばす
                - 最近は伝送距離が非常に長い光信号を伝送する光ファイバーの普及で、あまり使われなくなってきている
        - リピーターハブ
            - 受け取ったパケットのコピーをそのまま他のすべてのポートに転送する機器
                - ほとんどL２スイッチに置き換えられた
        - メディアコンバーター
            - 電気信号と光信号を相互に変換する機器
        - アクセスポイント
            - パケットを電波に変調・復調する、無線と有線の架け橋のような機器
                - 家庭用のWi-Fiルータなど
    - データリンク層で動作する機器
        - 同じネットワークにいる端末とMACアドレスによって接続できるようにする階層
        - ブリッジ
            - 端末から受け取ったMACアドレスをMACアドレステーブルで管理し、ブリッジングと呼ばれる転送処理をする
                - L2スイッチに置き換えられ、単体機器として見ることはなくなった
        - L2スイッチ
            - 基本的な機能はブリッジと同じ
    - ネットワーク層で動作する機器
        - ルーター
            - IPパケットのIPアドレスを見て目的地に届けるルーティングを行う
        - L3スイッチ
            - ルーターにL2スイッチを足しあわせたようなもの
    - トランスポート層で動作する機器
        - TCPのセグメント、UDPのデータグラムのヘッダーにあるポート番号をもとにパケット転送を行う
        - ファイアウォール
            - 端末間でやりとりされるパケットのIPアドレスやポート番号を見て、通信を許可したり、ブロックしたりする
                - ステートフルインスペクションと呼ばれる
    - アプリケーション層で動作する機器
        - 次世代ファイアウォール
            - ステートフルインスペクションに加えていろいろなセキュリティ機能が入っている
        - WAF(Web Application Firewall)
            - クライアントとサーバー間のやりとり情報のふるまいをアプリケーションレベルで一つ一つ精査してブロックする
        - 負荷分散装置（L7スイッチ）
            - ロードバランサーとも呼ばれる
            - 負荷分散方式で負荷分散したり、ヘルスチェックでサービスの可用性向上をする
    - つなげてみると
- いろいろなネットワーク機器のカタチ
    - データリンク層以上で動作するネットワーク機器は「物理アプライアンス」と「仮想アプライアンス」に分けられる
    - 物理アプライアンス
        - サーバーラックに搭載されているような、目で見ることができる「箱型の装置」
        - パフォーマンスが必要ならこれを選択する
    - 仮想アプライアンス
        - 仮想化技術によって作られる仮想マシン
- ネットワークのカタチ
    - LAN(Local Area Network）
    - WAN（Wide Area Network）
        - インターネットと閉域VPN網に大きく分けられる
        - インターネット
            - ISPや研究機関、企業が持っているたくさんのルーターがつながって無数のパケットを運んでいる。
            - それぞれのISPには「AS番号」というインターネット上の管理番号が割り当てられている
        - 閉域VPN網
            - 本社と支社を接続する企業ネットワークのような、LANとLANを接続するネットワークのこと
            - IPsecプロトコルを使って、拠点間をp2pで接続し、通信を暗号化する
    - DMZ（DeMilitarized Zone）
        - 冗長化によってサーバーが提供するサービスを安定稼働させるネットワークのこと
            - 最近はクラウドで構築される
- 新しいネットワークのカタチ
    - SDN（Software Defined Network）
    - CDN（Content Delivery Network）
        - オリジンサーバーとエッジサーバーで構成される
    - IoT（Internet of Things）
        - 軽量、高速、省電力の要件に合わせたプロトコルが使われる
    - IaaS
# chapter 2 : 物理層
- 物理層はケーブルやWi-Fiの電波など通信における物理的なものすべてを担っている階層
- 物理層は、データリンク層から受け取ったビット列（フレーム）を、ケーブルや電波に流せるアナログ波に変換するためのルールを定義し、さらに、ケーブルの材質やコネクタの形状、ピンアサイン（ピン配列）や無線の周波数帯域などの物理的な要素すべてを定義している
- 有線LAN(IEEE802.3)
    - イーサネットの起源は1960年代後半から1970年代前半にかけて、ハワイ大学で構築された「ALOHAnet」
        - いくつもの島に分散して存在しているハワイ大学のキャンパスを無線で接続したパケット交換型ネットワーク
            - パケットが送れなかったらランダムな時間だけ待って再送する仕組みがイーサネットの基礎となった
    - IEEE802.3のプロトコル
    - ツイストペアケーブル
        - 「〇〇BASE-T」など後ろにTがついているプロトコルはツイストペアケーブルを使用する
        - 見た目は1本のケーブルだが、8本の銅線を2本ずつより合わせてひとつに束ねている
        - シールドの有無によってUTP(Unshielded Twisted pair)ケーブルとSTP(Shielded Twisted Pair)ケーブルに分類できる
        - コネクタをRJ-45といい、並び順によってストレートケーブルとクロスケーブルに分類できる
        - カテゴリーが大きいほど伝送速度が速いプロトコルに対応できる
    - 光ファイバーケーブル
        - 「〇〇BASE-SX/SR」や「〇〇BASE-LX/LR」となっているプロトコルSはShort WaveLengthでLはLong Wavelength
        - 光の屈折率が高い「コア」と、屈折率が低い「クラッド」という同芯2層で構成されていて、光の伝送路のことを「モード」という
        - マルチモード光ファイバーケーブル(MMF)とシングルモード光ファイバーケーブル(SMF)がある
        - 主なコネクタは「SCコネクタ」「LCコネクタ」「MPOコネクタ」の3種類
    - ふたつの通信方法
        - 半二重通信
            - 送信するときと受信するときで、その都度通信方向を切り替えて使用する片側交互通行の道路のような方式
            - 同時にパケットを送信してぶつかると、「ジャム信号」という特殊なビットパターンを送信して、それを受け取った端末はランダムな時間だけ待って再送する、「CSMA/CD(Carrier Sense Multiple Access with Collision Detection)」という仕組みを使う
                - 初期のイーサネットを支えた技術
        - 全二重通信
            - 二車線の道路のような、送信と受信を同時に行う方式
        - オートネゴシエーション
            - 物理ポートで使用するプロトコルや通信方式（半二重/全二重通信）を自動で識別する機能
                - 接続とともに「FLP（Fast Link Pulse）」という特殊な信号パターンを使用して、プロトコルや通信方式を交換しあう
- 無線LAN（IEEE802.11）
    - 周波数帯域
        - 無線LANで使用する周波数帯域は、2.4GHz帯か5GHz帯のどちらかで、チャネルに分割して使う
        - 2.4GHz帯はISMバンドと呼ばれ、電子レンジやBluetoothなどでも使われる
            - 障害物に強く屋内外で使用できるが、日常生活で電波干渉してしまうものが多い
        - 5GHz帯
            - 障害物に弱く　屋外での使用に制限があるが、19チャネルすべてを同時に使用できる
    - 変調方式
        - 0と1で構成されているデジタルデータをアナログな電波に変換することを変調という
        - 一次変調で電波として送れるようにして、二次変調でノイズに強くなるようにする
    - 無線LANの通信方式
        - 送信と受信に同じチャネルを使うため、半二重通信で通信する
            - 衝突する前になんとかしようとする「CSMA/CA」という仕組みを使う
                1. フレーム送信前に、いったん待って、他の端末が電波を使っていないか確認する。待ち時間のことを「DIFS(DCF Interframe Space)」、確認処理のことを「キャリアセンス」という
                1. 誰も使用していないアイドル状態を確認できたら、それぞれランダム時間（バックオフ）だけ待つ
                1. バックオフが最も短い端末が早い者勝ちでフレームを送信し、それ以外の端末はビジー状態でいったん送信を待つ
                1. アクセスポイントはいったん待って、「フレームを受け取った」確認応答フレームを送信し、それ以外の端末はいったん送信を保留する。この待ち時間を「SIFS(Short Interframe Space）」という
                1. すべての端末が確認応答フレームの受信を確認したら、また1から4までを繰り返す
            - 有線LANの半二重通信で使用する「CSMA/CD」は、衝突した後になんとかしようとする
    - 高速化技術
        - ショートガードインターバル
        - チャネルボンディング
            - 隣り合うチャネルを同時に使用して伝送速度の向上を図る技術
        - MIMO(Multi-Input Multi-Output)
            - 空間ストリームを複数使用して伝送速度の向上を図る技術
                - IEEE802.11nでは4本、IEEE802.11acでは8本のアンテナで8空間ストリームを同時使用する
        - ビームフォーミング
            - IEEE802.11acからは標準機能となった
    - その他の無線プロトコル
        - Bluetooth
            - 2.4GHz帯(ISMバンド）を79チャネルに分割し、1秒間に1600回という速度でチャネルを切り替えながら通信する
        - Zigbee
            - 無線LANより伝送速度や通信距離で圧倒的に劣っているが、消費電力が少なく、スリープ次の待機電力がBluetoothよりも少ないため、必要なときだけ通信するIoTで利用されている
# chapter 3 : データリンク層
- データリンク層は、家庭LANをはじめとする同じネットワーク内にいる端末の接続性と、その信頼性を確保する
- データリンク層は、同じネットワークにいる端末を識別し、物理層上でビット列を正確に伝送する仕組みを提供している。
    - 物理層ではコンピューターで扱う0と1で構成されるデジタルデータと、LANケーブルや電波で扱う信号を相互に変換し、符号化することよって多少のビットの誤りは訂正できるが、複雑なエラーになるとどうにもならない。データリンク層では、データ全体の整合性をチェックすることで信頼性を担保し、またMACアドレスというネットワーク上の住所で送信端末と受信端末を識別する。
    - データリンク層は物理層と連携して動作するため、プロトコルとしても物理層とセットで定義されている
    - データリンクとは、隣接する機器との間に作る論理的な伝送路のこと。「どの端末に対してデータリンクを作るか」、「ビットが欠けていないか」を判断するため、カプセル化の処理を行う
- 有線LAN(IEEE802.3)
    - イーサネットのフレームフォーマット
        - 「イーサネットⅡ規格」と「IEEE802.3規格」の2種類がある
            - DEC社、Intel社、Xerox社が1982年にイーサネットⅡ規格を発表してから、30年以上変わらず使われている
                - TCP/IPでやりとりするパケットのほとんどがイーサネットⅡ規格
                - 「プリアンプル」「宛先/送信元MACアドレス」「タイプ」「イーサネットペイロード」「FCS」という5つのフィールドで構成されている
                - プリアンプル
                    - 「これからイーサネットフレームを送りますよー」という合図
                - 宛先/送信元MACアドレス
                    - イーサネットネットワークにおける住所のようなもの
                - タイプ
                    - ネットワーク層でどんなプロトコルで使用しているかを表す2バイト（16ビット）のID
                        - IPv4、IPv6、　ARPなど
                - イーサネットペイロード
                    - ネットワーク層でIPを使用していれば「イーサネットペイロード＝IPパケット」。送りやすいように小包に小分けにして送信するが、小包のサイズはイーサネットの場合デフォルトで46バイトから1500バイトの範囲内で収めなくてはならない（MTU: Maximum Transmission Unit)。
                - FCS(Frame Check Sequence)
                    - イーサネットフレームが壊れていないか確認するための4バイトの(32ビット）のフィールド
                    - FCSがイーサネットにおけるエラー検知のすべてを担っている
            - IEEE802.3規格はイーサネットⅡをベースにした規格だがマイナー規格となっている
    - MACアドレス
        - 1バイト(8ビット）ずつハイフンやコロンで区切って、16進数で表記する
        - 物理アプライアンスであれば、物理NICを製造するときROM(Read Only Memory)に書き込まれ、仮想アプライアンスであれば、デフォルトでハイパーバイザーから仮想NICに対して割り当てられる
        - 上位3バイトはIEEEがベンダーごとに割り当てたベンダーコードでOUI(Organizationally Unique Idenrifier)といい、下位3バイトはUAA(Universal Administered Address)といい、出荷時にベンダーから割り当てられたり、ランダムに生成されたりする
        - 通信の種類ごとのMACアドレスの違い
            - ユニキャスト
                - 1:1の通信
            - ブロードキャスト
                - 1:nの通信でARPなどで使われる
                - 宛先MACアドレスは6バイト(48ビット)がすべて「1」、16進数にすると「ff:ff:ff:ff:ff:ff」という特別なものを使う
            - マルチキャスト
                - 1:nの通信で「n」は特定のグループの端末
    - L2スイッチ
        - L2スイッチング
            - メモリ上の表であるMACアドレステーブルで管理して、イーサネットフレームの転送先を切り替える「L2スイッチング」をする
            1. PC1がイーサネットフレームをケーブルに流す
            1. PC1のフレームをL2スイッチがう受け取ると、MACアドレステーブルに登録する
            1. L2スイッチはPC2がどの物理ポートかわからないため、PC1以外のポートすべてにフラッディングする
            1. PC2は、PC1に対する返信フレームを作ってケーブルに流す。他のPCは自分に関係のないフレームと判断して破棄する
            1. L2スイッチはPC2をMACアドレステーブルに登録する
            1. これ以降L2スイッチはフラッディングをせず、PC1とPC2間の通信を直接転送するようになる
            1. L2スイッチは、PC1あるいはPC2が一定時間通信しなくなるとMACアドレステーブルの関連行を削除する
        - VLAN
            - 1台のL2スイッチを仮想的に複数のL2スイッチに分割する技術
                - 「VLAN ID」を設定し、総務部はVLAN3、営業部はVLAN5など、セキュリティ目的や運用管理で使用する
            - ポートベースVLAN
                - ひとつのポートに対して、ひとつのVLANを割り当てる機能
            - タグVLAN
                - イーサネットフレームにVLAN情報を「VLANタグ」としてくっつける機能
                    - IEEE802.1qワーキンググループで標準化されていて、「ワンキュー」や「イチキュー」と言われたりする
        - PoE(Power over Ethernet)
            - ツイストペアケーブルを使用して電源を供給する機能
- 無線LAN(IEEE802.11)
    - IEEE802.11フレームのフレームフォーマット
        - 有線LANと共存できるように、MACアドレスのフィールドが4つに増えている
        - プリアンプル
            - 「これからIEEE802.11のフレームを送りますよー」という合図
        - フレーム制御
            - フレームの種類や送信元/宛先の種類、フラグメント情報、電力状態（省電力状態）などがセットされる
            - データフレーム
                - IPパケットを送受信するためのフレームで、有線LANはこのタイプのフレームしかない
            - 管理フレーム
                - どのアクセスポイントとどのように接続するかを決めるアソシエーションを管理するフレーム
            - 制御フレーム
                - 有線LANと比べて不安定なので、「ACKフレーム」によって、データフレームの転送を助けている
        - Duration/ID
            - 無線回線を占有する予定時間(NAV: Network Allocation Vector)の通知や、端末のバッテリー消費量を抑制するパワーマネジメント識別子に使用される
        - MACアドレス1/2/3/4
            - IEEE302.11のフレームは、最大で4つのMACアドレスフィールドを持つことができ、フレームの種類やネットワーク構成によって、個数や用途が変化する
            - データフレームのMACアドレス
                - 無線LANのネットワーク構成には、「インフラモード」「アドホックモード」「WDS(Wireless Distribution System)モード」　の3種類がある
                - インフラモード
                    - 無線LAN端末が必ずアクセスポイントを介して通信するネットワーク構成。ひとつ目に無線区間の宛先MACアドレス、ふたつ目に無線区間の送信元MACアドレス、３つ目に無線LAN端末の送信元MACアドレスや宛先MACアドレスがセットされ、4つ目はなし
                - アドホックモード
                    - アクセスポイントを介さず、無線LAN端末同士が直接通信するネットワーク構成。ひとつ目に無線区間の宛先MACアドレス（受信端末のMACアドレス）、ふたつ目に無線区間の送信元MACアドレス（送信端末のMACアドレス）、3つ目にはユーザーが定義したIDがセットされ、4つ目はなし
                - WDSモード
                    - アクセスポイント同士で通信する、無線LANでネットワークを延伸するときなどに使用されるネットワーク構成。ひとつ目に無線区間の宛先MACアドレス（受信側アクセスポイントのMACアドレス）、ふたつ目に無線区間の送信元MACアドレス（送信側アクセスポイントのMACアドレス）、3つ目に宛先MACアドレス、4つ目に送信元MACアドレスがセットされる
            - 管理フレームのMACアドレス
                - 無線LANとアクセスポイントだけでやりとりされるフレーム。ひとつ目に無線区間における宛先MACアドレス、ふたつ目に無線区間における送信元MACアドレス、3つ目にアクセスポイントのMACアドレス（BSSID）がセットされる。ビーコンフレームは、配下にいるすべての端末に伝達する必要があるため、ひとつ目のフィールドにブロードキャストMACアドレス(ff:ff:ff:ff:ff:ff）がセットされる
            - 制御フレーム
                - 管理フレームと同じで、無線LANとアクセスポイントだけでやりとりされるフレーム。ACKフレームは、MACアドレスフィールドをひとつしか持っていない
        - シーケンス制御
            - 4ビットの「フラグメント番号」と12ビットの「シーケンス番号」で構成され、フラグメンテーション（断片化）されたフレームを再結合したり、重複したフレームを破棄したりする
            - アクセスポイントからACKフレームが届かないと、一定時間待って、再送する。その際、シーケンス制御に、前に送信したフレームにセットしたものと同じ値をセットする。アクセスポイントは、その値を見て、重複フレームと判断する
        - IEEE802.11ペイロード
            - ネットワーク層のプロトコル情報を表すタイプフィールドを含む「LLC(Logical Link Control)ヘッダー」で、さらにカプセル化した後に、ネットワーク層のデータであるIPパケットをセットする。イーサネットヘッダーにはタイプフィールドがあるが、IEEE802.11にはそれがないので、LLCヘッダーをくっつけて、ネットワーク層のプロトコルを知らせている
        - FCS(Frame Check Sequence)
            - 仕組みはイーサネットと同じ
    - 無線LAN端末がつながるまで
        - 無線LANは誰もが電波を受信できる環境で使われるので、「アソシエーション」→「認証」→「共有鍵生成」→「暗号化通信」という4つのフェーズを経て、暗号化通信を行う
        - アソシエーションフェーズ
            - どのアクセスポイントと接続するか決めるフェーズで、「スキャン」→「認証」→「アソシエーション」という3つのステップで構成される
            - スキャン
                - アクセスポイントと無線LAN端末がお互いの存在を認識するステップであり、端末は接続したいSSIDを見つけるとプロープ要求を送り、アクセスポイントは「プローブ応答」を返す
            - 認証
                - 今となっては形式的な手順として残っている
                    - とりあえずオープンシステム認証でパスさせておいて、実際の認証はアソシエーションの後の認証フェーズで行う
                - 「オープンシステム認証」は認証処理をせず、「共有鍵認証」はかつて使用された「WEP」で使われパスワードをもとに認証を行う
            - アソシエーション
                - アソシエーションは最終確認である「アソシエーション要求」と「アソシエーション応答」のやりとり
        - SSID
            - 無線LANを識別するための文字列で、ざっくり言うと無線LANの名前
            - もともとはセキュリティ強化の用途で使用されていた
        - 認証フェーズ
            - アソシエーションが完了した後、接続相手が正しい端末かどうかの確認をする
            - パーソナルモード
                - パスワードで認証する方式
            - エンタープライズモード
                - デジタル証明書やID/パスワード、SIMカードなどを使用して認証する方式で、「IEEE802.1x」として標準化されている
                - PPPの拡張機能である「EAP(Extensible Authentication Protocol)」を使用して認証する
                - そのままではLANに流せないので、無線LAN-アクセスポイントを「EAPoL(EAP on LAN)」というプロトコルでカプセル化し、アクセスポイント-認証サーバー間を「RADIUS(Remote Authentication Dial In User Service)」というUDPの認証プロトコルでカプセル化する
                - EAPの認証方法はいくつもあり、デジタル証明書で双方向に認証する「EAP-TLS」、ID/パスワードで無線LAN端末を認証しデジタル証明書で　認証サーバーを認証する「PEAP」、公衆無線LANサービスで使われるようなSIMカード情報で双方向に認証する「EAP-SIM/AKA」などがある
        - 共有鍵生成フェーズ
            - 認証フェーズで生成したマスターキーから、実際の暗号化/複合で使用する共有鍵を生成するフェーズ
                - マスターキーはあくまで共有鍵の「素（素材）」であって、共有鍵ではない
            - 「4ウェイハンドシェイク」でユニキャスト用(PTK: Pairwise Transit Key)とマルチキャスト用の共有鍵(GTK: Group Temporal Key)を生成共有する
        - 暗号化通信フェーズ
            - WEP→WPA→WPA2→WPA3の順にセキュリティレベルが上がる
            - WEP
                - 同じ共有鍵を使い続けるだけでなく、暗号化方式の「RC4(Rivest's Cipher 4/Ron's Code 4)」に致命的な脆弱性が見つかったため、現在はほとんど使われていない
            - WPA
                - WEPを改良して脆弱性の軽減を図った暗号化方式。共有鍵を一定期間で変更する（TKIP: Temporal Key Integrity Protocol)が、WEPをベースにしているので脆弱性が指摘されている
            - WPA2
                - 暗号化アルゴリズムとしてRC4+TKIPよりもはるかに安全な「AES(Advanced Encryption Standard)」を採用している。
            - WPA3
                - AESよりもさらに安全な「CSNA(Commercial National Security Algorithm)」に対応できる
    - 無線LANのカタチ
        - 分散管理型
            - アクセスポイントを1台ずつ設定して、それぞれ運用していく形態
            - 台数が増えるほど運用が大変になり、クリーンな電波環境の維持にも気を配る必要がある
        - 集中管理型
            - 「無線LANコントローラー(WLC)」というサーバーを使用して、たくさんのアクセスポイントを運用管理していく形態
            - イニシャルコストとアクセスポイントの台数に限界がある
        - クラウド管理型
            - 集中管理型の進化版で、「クラウドコントローラー」からアクセスポイントを管理していく形態
    - 無線LANに関するいろいろな機能
        - ゲストネットワーク
            - 自宅のネットワークにはつながらず、インターネットにしかアクセスできないSSIDのネットワークができる
        - MACアドレスフィルタリング
            - 接続可能なMACアドレスを事前登録するなど、MACアドレスでフィルタリングを行う機能
        - Web認証
            - Webブラウザ上でユーザー名とパスワードを入力して認証する
        - バンドステアリング
            - 2.4GHz帯と5GHz帯の両方の周波数帯（デュアルバンド）に対応している無線LAN端末を、電波干渉が発生しづらい5GHz帯に誘導する機能
            - アクセスポイントは5GHzのアンテナからだけプローブ応答を返すことによって、5GHz帯を選択させる
- ARP
    - ネットワークの世界ではアドレスを示すものは「IPアドレス」と「MACアドレス」のふたつだけ。MACアドレスは、NICそのものに焼き付けられている物理的なアドレスで、IPアドレスは、OS上で設定する論理的なアドレス。このふたつのアドレスを紐づけ、データリンク層とネットワーク層の架け橋的な役割を担っているプロトコルが「ARP(Address Resolution Protocol)」。IPパケットをイーサネットフレームにカプセル化するときに、まだ宛先MACアドレスがわからないので、実際のデータ通信に先立ってARPで事前に「アドレス解決」をする
        - ARPはIPv4のみで、IPv6はICMPv6で行う
    - ARPのフレームフォーマット
        - ハードウェアタイプ
            - 使用しているレイヤー2プロトコルを表す2バイトのフィールドで、イーサネットは「0x0001」が入る
        - プロトコルタイプ
            - 使用しているレイヤー3プロトコルを表す2バイトのフィールドで、IPv4の場合は「0x0800」が入る
        - ハードウェアアドレスサイズ
            - MACアドレスの長さをバイト単位で表す1バイトのフィールドで、MACアドレスは48ビット=6バイトなので「6」が入る
        - プロトコルアドレスサイズ
            - IPアドレスの長さをバイト単位で表す1バイトのフィールドで、IPv4アドレスの長さは32ビット=4バイトなので「4」が入る
        - オペレーションコード
            - ARPフレームの種類を表す2バイトのフィールドで、よく見かけるコードはARP Requestを表す「1」、ARP Replyを表す「2」のふたつ
        - 送信元MACアドレス/送信元IPv4アドレス
            - APRを送信する端末のMACアドレスとIpv4アドレスを表す可変調のフィールド
        - 目標MACアドレス/目標IPv4アドレス
            - ARPでアドレス解決したいMACアドレスとIPv4アドレスを表す可変調のフィールド
            - 最初はMACアドレスを知りようがないため、ダミーのMACアドレス「00:00:00:00:00:00」をセットする
    - ARPによるアドレス解決の流れ
        - 「〇〇さんはいますかー？」と ARP Request をブロードキャストで送り、〇〇さんが「私でーす！」と ARP Reply を1:1のユニキャストで返す、病院の待合室のような様子。ARPはこのふたつのパケットだけでMACアドレスとIPアドレスを紐づけている
        - 具体的なアドレス解決の例
            1. PC1はIPパケットの宛先IPアドレスを見て、自身の「ARPテーブル」を検索し、もしすでに情報があれば[6]まで進む
            1. オペレーションコードにARP Requestを表す「1」を入れ、目標MACアドレスは知りようがないため、ダミーのMACアドレス(00:00:00:00:00:00）を入れ、目標IPアドレスが異なるIPv4ネットワークの場合は、そのネットワークの出口となる「ネクストホップ」を目標IPv4アドレスとする。イーサネットヘッダーの宛先MACアドレスはブロードキャスト(ff:ff:ff:ff:ff:ff)にして、APR Requestを送信する
            1. ARP Requestが同じイーサネットワークにいるすべての端末に到達する
            1. PC2は、オペレーションコードをARP Replyを表す「2」を入れ、ユニキャストを使用して、ARP Replyを返信する
            1. PC1はARP Replyの送信元MACアドレスと送信元IPv4アドレスを見て、PC2のMACアドレスを認識し、合わせてARPテーブルに書き込んで一時保存する
            1. PC1はアドレス解決したPC2のMACアドレスを使って通信を開始する
    - ARPのキャッシュ機能
       　- すべての通信の始まりの始まりはARPから
       　- 弱点としてのブロードキャストの非効率性を補うために、「キャッシュ機能」を備えている
            - タイムアウト時間が経過したら、エントリを削除し、またARP Requestを送信する
                - Windows10のタイムアウト時間は10分
    - GARPを利用した機能
        - GARP(Gratuitous ARP)は、ARPフィールドの目標IPv4アドレスに自分自身のIPv4アドレスをセットした、特別なARP
            - 「IPアドレスの重複検知」や「隣接機器のテーブル更新」などに利用される
        - IPv4アドレスの重複検知
            - OSはIPv4アドレスが設定されたとき、そのIPv4アドレスを目標IPv4アドレスにセットしたGARP(ARP Request)を送信して、「このIPv４アドレスを使ってもいいですか？」と、みんなにお伺いを立て、ARP Replyが返ってこないのを確認して、初めてIPv4アドレスの設定を反映する
        - 隣接機器のテーブル更新
            - GARPを利用して「私のIPv4アドレスとMACアドレスはこれです！」と主張して、隣接機器のARPテーブルとMACアドレステーブルの情報更新を促す
- その他のL2プロトコル
    - IEEE802.3、IEEE802.11、ARP以外のL2プロトコル
    - PPP(Point to Point Protocol)
        - ポイントとポイントを1:1で結ぶためのレイヤー２プロトコルで、以前は「ダイヤルアップ接続などで使用されていた
        - リンクを確立、維持、切断する「LCP(Link Control Protocol)」、認証を行う「PAP」「CHAP」、IPの情報を配布する「NCP(Network Control Protocol)」を組み合わせて、データリンクを作る
            1. LCPを使用して、認証タイプや最大受信データサイズ(MRU: Maximum Receive Unit)などをネゴシエーションし、データリンクを確立する
            1. 認証タイプが設定されていたら、PAPまたはCHAPによって、LCPで作ったデータリンク上で認証する
            1. NCPを使用して、IPアドレスやDNSサーバーのIPアドレスを通知したりして、IPレベルで通信できるようにする
            1. LCPでデータリンクの状態を監視する。PPPサーバーは一定の時間間隔でLCPのEcho Requestを送信し、PPPクライアントはEcho Replyを返す。一定時間Echo Replyが返ってこなかったら、データリンクを切断する
            1. データリンクが使用されなくなったり、管理的に切断したりすると、LCPでリンク終了処理に入る
        - PAP(Password Authentication Protocol)
            - PPPクライアントがユーザーIDとパスワードを送信し（Authenticate Request)、サーバーが認証する(Authenticate Ack)
            - パスワードがクリアテキストで流れるため、現在はほとんどCHAPで置き換えられている
        - CHAP(Challenge Handshake Authentication Protocol)
                1. LCPによってデータリンクが確立されると、サーバーが「チャレンジ値」というランダムな文字列をクライアントに渡す
                1. クライアントはチャレンジ値とID、パスワードを組み合わせてハッシュ値を計算して、IDとともに送り返す。ハッシュ値からデータを逆算することはできないため、ハッシュ値を盗聴されてもパスワードは導き出せない
                1. サーバーでも同じハッシュ値の計算をして、同じであれば認証成功となる
            - 実際の環境では膨大なユーザーを扱う必要があるため、認証サーバーが絡んでくる
                - 認証サーバーとのやりとりには「RADIUS(Remote Authentication Dial in User Service)」というUDPの認証プロトコルを使用する
    - PPPoE(Point to Point Protocol over Ethernet)
        - もともとダイヤルアップ接続で使用されていたPPPをイーサネットネットワーク上でも使用できるように拡張したプロトコル
            - フレッツだと、宅内に設置される「ホームゲートウェイ(HGW: Home Gateway)」は、ONU(Optical Network Unit、光回線終端装置)を介してフレッツ網に接続し、フレッツ網と各ISPを接続する「網終点装置(NTE: Network Termination Equipment)」とPPPoEで接続し、網終端装置はPAP/CHAPで受け取ったユーザー名とパスワードを各ISPが持つ認証サーバー（RADIUSサーバー）に問い合わせ、認証に成功したらインターネットに接続できるようになる
        - 「〇〇 over △△」は「〇〇を△△でカプセル化している」という意味
    - IPoE(Internet Protocol over Ethernet)
        - イーサネットとIPをそのまま使用できるので、「ネイティブ接続方式」とも呼ばれる
    - PPTP(Point to Point Tunneling Protocol)
        - インターネット上に仮想的な専用線（トンネル）を作るVPNプロトコル
    - L2TP(Layer2 Tunneling Protocol)
        - IPsecやPPTPと同じく、インターネット上に仮想的な専用線を作るプロトコル
        - L2TPを実際に使用するときは、「L2TP over IPsec」として使用することがほとんど
        - サードパーティのVPNソフトウェアをインストールしたくなければ、必然的にL2TP over IPsecを選択することになる
# chapter 4: ネットワーク層
- ネットワーク層は、ネットワークとネットワークをつなぎ合わせ、インターネットをはじめとする異なるネットワーク上にいる端末との接続性を確保する
- データリンク層は、同じネットワークの端末たちを接続する以上はしてくれないので、ネットワーク層がデータリンク層でできている小さなネットワークをつなぎ合わせて、大きなインターネットを作ることを可能にする
- IPv4
    - 1981年に発行されたRFC791 「INTERNET PROTOCOL」で標準化されているコネクションレス型のプロトコルで、L2ヘッダーのタイプコードでは「0x0800」と定義されている
    - IPv4のパケットフォーマット
        - IPによってカプセル化されるパケットのことを「IPパケット」という
            - 「IPヘッダー」と「IPペイロード」で構成される
            - バージョン
                - IPのバージョンを表す4ビットのフィールドで、IPv4の場合は「4」（2進数表記で「０１００」）が入る
            - ヘッダー長
                - IPv4のヘッダーの長さを表す4ビットのフィールドで、「Internet Header Length」、略して「IHL」と言ったりもする
                - IPv4ヘッダーの長さを4バイト(32ビット）単位に換算した値が入り、IPv4ヘッダーは基本的に20バイトなので、「5」が入る
            - ToS(Type of Service)
                - IPv4パケットの優先度を表す1バイト(8ビット）のフィールドで、優先制御や帯域制御、ふくそう制御などのQos(Quality of Service)で使用する
                - 「あこの値だったら、最優先で転送する」や、「この値だったら、これだけ保証する」とあらかじめ、ふるまいを設定しておく
                - ToSは、先頭6ビットの「DSCP(Differentiated Services Code Point)フィールド」と、残り2ビットの「ECN(Explicit Congestion Notification)フィールド」で構成されている
                    - DSCPフィールドは、優先制御と帯域制御に使用し、ECNフィールドはふくそうを通知するときに使用する
            - パケット長
                - IPv4ヘッダーとIPv4ペイロードをあわせたパケット全体の長さを表す2バイト(16ビット)のフィールドで、これを見ることでどこまでがIPv4パケットなのか知ることができる
                - イーサネットのデフォルトのMTU(Maximum Transmission Unit)いっぱいまでデータが入ったパケット長の値は「1500」（16進数で「05dc」）になる
            - 識別子
                - 「IPフラグメンテーション」で使い、MTUのサイズを超えたパケットがフラグメンテーションされると、フラグメントパケットは同じ識別子をコピーして持ち、受け取った端末はこの識別子の値を見てパケットを再結合する
            - フラグ
                - 3ビットで構成されていて、1ビット目は使用しない
                - 2ビット目は「DF(Don't Fragment)ビット」といい、IPパケットをフラグメンテーションしてよいかどうかを表す。「0」だったら許可し、「1」だったら許可しない。
                    - ここ最近のアプリケーションは処理遅延を考慮してDFビットを「1」にセットして、上位層でデータサイズを調整している
                - 3ビット目は「MF(More Fragments)ビット」といい、フラグメンテーションされたIPv4パケットが後ろに続くかどうかを表す。「０」だったら続かない、「1」だったら続く
            - フラグメントオフセット
                - フラグメンテーションしたときに、そのパケットがオリジナルパケットの先頭からどこに位置しているか示す13ビットのフィールドで、フラグメンテーションされた最初のパケットには「0」が、その後のパケットには位置を示した値が入る
                - パケットを受け取る端末は、この値を見て、IPパケットの順序を正しく並べ替える
            - TTL(Time to Live)
                - パケットの寿命を表す1バイト（8ビット）のフィールドで、IPの世界では、IPパケットの寿命を「経由するルーターの数」で表す
                - ルーター経由ごとにひとつずつ減算され、値が「0」になるとパケットが破棄される。破棄したルーターは「Time-to-live exceeded（タイプ11/コード０）」というICMPv4パケットを返す
            - プロトコル番号
                - どんなプロトコルで構成されているかを表す
            - ヘッダーチェックサム
                - RFC1071「Computing the Internet Checksum」で定義されていて、「1の歩数演算」でIPv4ヘッダーの整合性をチェックする
            - 送信元/宛先IPv4アドレス
                - IPv4ネットワークにおける住所のようなもの
                - NICに割り当てられている物理的なMACアドレスは、「次にどの機器にフレームを渡すか」を指定し、OSで割り当てられる論理的なIPアドレスは、「最終的にどこにパケットを届けるか」を指定し、このふたつのアドレスを紐づけるためにARPがある
            - オプション
                - IPv4パケット送信における拡張機能が格納されるフィールドだが、実際にはあまり使われていない
            - パディング
                - IPv4ヘッダーのビット数を整えるために使用されるフィールド
    - IPv4アドレスとサブネットマスク
        - IPv4アドレスは32ビット（4バイト）で構成されていて、8ビット（1バイト）ずつドットで区切って、1０進数で「ドット付き10進記法」で表記される。ドットで区切られたグループのことを「オクテット」という
        - サブネットマスクはネットワークとホストの分かれ目
            - どのIPv4ネットワークにいるのかを表す「ネットワーク部」と、どの端末なのかを表す「ホスト部」を区切る目印のようなものがサブネットマスク
                - 「どのIPv4ネットワークにいるどの端末なのか」を識別することができる
            - 「1」のビットがネットワーク部、「0」のビットがホスト部
        - 10進数表記とCIDR表記
            - 「192.168.100.1」というIPv4アドレスに「255.255.255.0」というサブネットマスクが設定されている場合、CIDR表記では「192.168.100.1/24」となる
    - いろいろなIPv4アドレス
        - IPv4アドレスは「0.0.0.0」から「255.255.255.255」まで2の32乗（約43億）個ある
        - 使用用途による分類
            - クラスAからクラスEまでの５つのアドレスクラスに分類でき、クラスA→クラスB→クラスCの順に規模が小さくなる
            - アドレスクラスの分類は、32ビットのIPv4アドレスの先頭1〜4ビットで行う
            - クラスフルアドレッシング
                - アドレスクラスに基づいてIPv4アドレスを割り当てる方式で、わかりやすく管理しやすいが、たとえばクラスAのIPアドレスでは、ひとつの企業や団体で1600万以上のIPv4アドレスが割り当てられるなど無駄が多い
            - クラスレスアドレッシング
                - ネットワーク部とホスト部の他に、サブネットマスクを8ビット単位ではなく、1ビット単位で自由に適用することで「サブネット部」を導入して、新しいネットワーク部を作り出す
                    - 「192.168.1.0」をサブネット化して、「192.168.1.0/28」から「192.168.1.240/28」まで、16個のサブネット化されたネットワークを作る
        - 使用場所による分類
            - グローバルIPv4アドレス
                - インターネットにおける一意なアドレス
                    - 「ICANN(Internet Corporation for Assigned Names and Numbers)」という非営利法人の一機能であIANAと、その下部組織（RIR、NIR、LIR）によって階層的に管理されている
                    - 日本ではJPNIC(Japan Network Information Center)が管理している
            - プライベートIPv4アドレス
                - 組織内であれば自由に割り当ててよい一意なアドレス
                - グローバルIPv4アドレスに変換する「NAT」が使われる
        - 除外アドレス
            - ネットワークアドレス
                - ホスト部のビットがすべて「0」のIPv4アドレスで、ネットワークそのものを表す
                    - 「192.168.100.1」で「255.255.255.0」がサブネットマスクであれば、「192.168.100.0」がネットワークアドレスとなる
                - サブネットマスクもすべて「0」とした「0.0.0.0/0」は「デフォルトルートアドレス」となり、「すべてのネットワーク」を表す
            - ブロードキャストアドレス
                - ホスト部のビットがすべて「1」のIPv4アドレスで、同じネットワークに存在するすべての端末を表す
                    - 「192.168.100.1」でサブネットマスクが「255.255.255.0」なら「192.168.100.255」がブロードキャストアドレス
                - IPv4アドレスもサブネットマスクもすべて「1」として「255.255.255.255/32」は「リミテッドブロードキャストアドレス」で、自分のIPv4アドレスやネットワークアドレスがわからないときや、DHCPv4でアドレスを取得するときなどに使用する
            - ループバックアドレス
                - 自分自身を表すIPv4アドレス
                    - 第１オクテットが「127」で、「127.0.0.1/18」を使用するのが一般的
- IPv6
    - IPv4アドレスの長さは、32ビット（4バイト）なので、最大約43億個（=2**32)までしか割り当てられない
        - 地球上の人口が約77億人
    - IPv6は、2017年に発行されたRFC8200「Internet Protocol, Version 6(IPv6) Specification」で標準化されているプロトコル
    - IPv6のパケットフォーマット
        - IPv4ヘッダーとの違いは、「ヘッダーの長さ」と「フィールド数の削減」のふたつ
        - ヘッダーの長さ
            - IPv4は可変長のオプションフィールドがあるため、ヘッダーの長さが20バイトから変動するが、IPv6は40バイト（320ビット）に固定している
            - ヘッダー長が固定されることで精査が必要なくなり、ネットワーク処理負荷が減り、パフォーマンスが向上する
        - フィールド数の削減
            - IPv4は、将来性を考慮して機能が盛りだくさんで策定されたが、結局時代に合わなくなったり、性能向上の足かせになったりした
                - IPv6は徹底的なシンプル化が図られた
            - バージョン
                - IPv6なので「6」（2進数表記で「0110」）が入る
            - トラフィッククラス
                - IPv6のパケットの優先度を表す1バイト（8ビット）のフィールドで、IPv4の「ToS」フィールドに相当し、有線制御や帯域制御、ふくそう制御などQoS(Quality of Service)で使用される
            - フローラベル
                - 通信フローを識別するフィールドで、IPv4にはない
                - 「送信元IPアドレス」「宛先IPアドレス」「送信元ポート番号」「宛先ポート番号」「L4プロトコル」という5つの情報で、通信フローを識別する
            - ペイロード長
                - IPv4ではパケット長として、ヘッダーとペイロードの長さを合わせた値だったが、IPv6ではペイロードの長さのみが入るようになった
            - ネクストヘッダー
                - 拡張ヘッダーがある場合は、拡張ヘッダーを示す値が入り、ない場合は、IPv4の「プロトコル番号」と同じ役割を担う
            - ホップリミット
                - ホップ数の上限を表す1バイト（8ビット）のフィールドで、IPv4の「TTL」に相当する
            - 送信元/宛先IPv6アドレス
                - IPv6ネットワークにおける住所のようなもの
    - IPv6アドレスとプレフィックス
        - IPv4アドレスが32ビット（4バイト）しかないのに対して、IPv6アドレスは128ビット（16バイト）もある
            - IPアドレスの長さを4倍にしたことで、約340兆の1兆倍の1兆倍となった
            - 128ビットを16ビットずつ「:」で8つに区切って、16進数で表記する
        - サブネットプリフィックスとインターフェースID(IID)
            - サブネットプリフィックスは、IPv4アドレスのネットワーク部に相当し、インターフェースIDは、IPv4アドレスのホスト部に相当する
                - 「2001:db8:0:0:0:0:0:1/64」の場合、「2001:db8:0:0」のネットワークに所属している「0:0:0:1」という端末である
        - IPv6アドレスの表記ルール
            - 各フィールドの先頭にある連続する「0」は省略できる
            - 複数のフィールドを跨いで「0」が続く場合は、「::」に省略できる
                - 省略できるのは1回だけ
                - オール「0」のフィールドがひとつの場合は省略できない
                - 可能なかぎり短くする
                - 最も省略できるところで省略する
                - 省略できるところが同じ長さだった場合は最初の箇所で省略する
            - 小文字で表記する
    - いろいろなIPv6アドレス
        - ユニキャストアドレス
            - Webやメールの通信は、クライアントとサーバー間だけでパケットがやりとりされるユニキャスト
            - グローバルユニキャストアドレス(2000::/3)
                - IPv4アドレスのグローバルIPv4アドレスに相当する、インターネット上で一意なIPv6アドレス
                - 先頭の3ビットが「001」で、16進数で「2000::/3」となる
            - ユニークローカルアドレス(fc00::/7)
                - プライベートIPv4アドレス(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)に相当する、組織内で一意なIPv6アドレス
                - 先頭の7ビットが「1111110」のIPv6アドレスで、16進数で表記すると「fc00::/7」となる
            - リンクローカルアドレス(fe80::/10)
                - 同じIPv6ネットワークにおいてのみ通信できるアドレスで、すべてのiPv6インターフェースにはリンクローカルアドレスを割り当てる必要がある
                - 先頭10ビットが「111111010」で、16進数で表記すると「fe80::/10」となる
        - マルチキャストアドレス
            - IPv4アドレスのクラスD(224.0.0.0/4)に相当するIPv6アドレスで、特定のグループ（マルチキャストグループ）に対する通信で使用する
                - IPv6におけるARPであるNDP（近隣探索プロトコル）でもマルチキャストが使用されている
                - IPv4にあったブロードキャストも、IPv6ではマルチキャストの一部として吸収された
            - 先頭8ビットがすべて「1」になっているアドレスで、16進数で表記すると「ff00::/8」となる
        - エニーキャストアドレス
            - 複数の端末によって共有されているグローバルユニキャストアドレスのこと
                - 経路的に最も近いサーバーに転送される
- IPルーティング
    - ネットワーク層で動作する機器は「ルーター」と「L3スイッチ」で、異なるネットワークをつなぎ、IPパケットを転送する
    - ルーティングとは
        - ルーターやL3スイッチは、宛先IPアドレスと照らし合わせる「宛先ネットワーク」と、IPパケットを転送すべき隣接機器のIPアドレスを表す「ネクストホップ」によって、IPパケットの転送先を切り替えている
        - 管理する表を「ルーティングテーブル」という
        - ルーターがIPパケットをルーティングする様子
            - すべての機器が隣接機器のMACアドレスを学習済みの場合の流れ
            1. PC1は、送信元IPアドレスにPC1のIPアドレス（192.168.1.1）、宛先IPアドレスにPC2のIPアドレス(192.168.2.1）をセットして、IPヘッダーでカプセル化し、自身のルーティングテーブルを検索する。「192.168.2.1」は、直接接続されている「192.168.1.0/24」ではなく、すべてのネットワークを表すデフォルトルートアドレス（0.0.0.0/0）にマッチする。今度はデフォルトルートアドレスのネクストホップのMACアドレスをARPテーブルから検索する。送信元MACアドレスにPC1(eth0）のMACアドレス、宛先MACアドレスにR1（e0/0）のMACアドレスをセットして、イーサネットでカプセル化し、ケーブルに流す。デフォルトルートのネクストホップのことを「デフォルトゲートウェイ」といい、端末はネット上のWebサイトにアクセスするとき、とりあえずデフォルトゲートウェイにIPパケットを送信し、あとはデフォルトゲートウェイの機器にルーティングを任せる。たとえば、家庭のLAN環境であればデフォルトゲートウェイはブロードバンドルーターであり、ブロードバンドルーターのデフォルトゲートウェイはISPである。
            1. PC1からIPパケットを受け取ったR1は、自身のルーティングテーブルを検索する。宛先IPアドレスは「192.168.2.1」なので、ルーティングテーブルの「192.168.2.0/24」とマッチする。そこで、今度は「192.168.2.0/24」のネクストホップ「192.168.12.2」のMACアドレスをARPテーブルから検索してセットし、イーサネットでカプセル化し、ケーブルに流す
            1. R2は、自身のルーティングテーブルを検索し、宛先IPアドレスは「192.168.2.1」なので、ルーティングテーブルの「192.168.2.0/24」とマッチする。そこで今度は「192.168.2.1」のMACアドレスをARPテーブルから検索し、PC2に向けてイーサネットでカプセル化しケーブルで流す
            1. PC2は、データリンク層で宛先MACアドレス、ネットワーク層で宛先IPアドレスを見て、パケットを受け入れて上位層へと処理を引き渡す
    - ルーティングテーブル
        - 静的ルーティング（スタティックルーティング）
            - 手動でルーティングテーブルを作る方法で、宛先ネットワークとネクストホップを一つひとつ設定する
        - 動的ルーティング（ダイナミックルーティング）
            - 隣接するルーター同士で「ルーティングプロトコル」を使ってルート情報を交換し、自動でルーティングテーブルを作る方法
            - 動的ルーティングはネットワークの追加も簡単
            - ネットワーク上のルーターがすべてのルートを認識している状態を「収束状態」といい、それまでにかかる時間を「収束時間」という
            - ネットワークに障害が発生した場合は、自動的にルートが切り替わる
    - ルーティングプロトコル
        - ルーティングプロトコルは制御範囲によって「IGP(Interior Gateway Protocol: 内部ゲートウェイプロトコル)」と「EGP(Exterior Gateway Protocol: 外部ゲートウェイプロトコル)」の2種類に分けられる
            - このふたつを分ける概念が「AS(Autonomous System: 自律システム)」で、これはひとつのポリシーに基づいて管理されているネットワークの集まりのこと。「AS=組織（ISP、企業、研究機関、拠点）」と考えてもいい
            - AS内を制御するルーティングプロトコルがIGP、ASとASの間を制御するルーティングプロトコルがEGP
        - IGPのポイントは「ルーティングアルゴリズム」と「メトリック」
            - ルーティングアルゴリズム
                - どうやってルーティングテーブルを作るか、そのルールのこと
                - ディスタンスベクター型
                    - 距離（ディスタンス）と方向（ベクター）に基づいて計算するルーティングプロトコル
                    - 宛先までに、どれだけのルーターを経由するかが最適ルートの判断基準になる
                - リンクステート型
                    - リンクの状態（ステート）に基づいて最適ルートを計算するルーティングプロトコル
                    - リンク（インターフェース）の状態や帯域幅、IPアドレスなど、いろいろな状態を交換しあってデータベースを作り、その情報をもとにルーティングテーブルを作る
            - メトリック
                - メトリックは宛先ネットワークまでの論理的な距離を表す
        - IGPは「RIP」「OSPF」「EIGRP」の3つ
            - RIP(Routing Information Protocol)
                - ディスタンスベクター型のルーティングプロトコルで、現在の環境ではOSPFやEIGRPへの移行が進んでいる
                - メトリックに「ホップ数」を使い、定期的にやりとりしあってルーティングテーブルを作る
                - 帯域幅が小さい場合でも、ホップ数が少なければ最適ルートとして選んでしまう
            - OSPF(Open Shortest Path Fast)
                - リンクステート型のルーティングプロトコルで、古くからRFCで標準化されている伝統的なルーティングプロトコルなので、複数ベンダーが混在する中〜大規模のネットワーク環境でよく使用される
                - 各ルーターがリンクの状態や帯域幅、IPアドレス、サブネットマスクなどいろいろな情報を交換しあって、「リンクステートデータベース（LSDB)」を作り、そこから最適なルート情報を計算し、ルーティングテーブルを作る
                - RIPとは違い、OSPFは変更があったときだけルーティングテーブルに更新をかける
                - 通常時はHelloパケットという小さなパケットを送信して、相手が正常に動作しているかどうかだけ確認している
                - いろいろな情報を集めて作られるLSDBが大きくなりすぎないように、ネットワークをエリアに分けて、同じエリアのルーターだけでLSDBを共有する
                - メトリックには「コスト」を使用する
                    - デフォルトで「100÷帯域幅(Mbps)」に当てはめて整数値として算出され、ルーターを越えるたびに出力インターフェースで加算される
                - ルーターが学習したコストがまったく同じだった場合は、コストが同じルートをすべて使用して、通信を負荷分散する動作、「ECMP(Equal Cost Multi Path)」を使う
                - IPv4ではOSPFv2、IPv6ではOSPFv3を使う
            - EIGRP(Enhanced Interior Gateway Routing Protocol)
                - ディスタンスベクター型プロトコルを拡張したもので、もともとはCisco社独自のルーティングプロトコルで、のちにRFC7868で仕様が公開された
                - EIGRPは、RIPやOSPFをいいとこどりしたルーティングプロトコル
                    - RIPのように最初に自分の持つルート情報を交換してトポロジーテーブルを作り、そこから最適なルートだけを抽出して、ルーティングテーブルを作る。OSPFのように変更時のみルーティングテーブルの更新がかかり、通常時はHelloパケットで正常動作しているか判断する
                - メトリックにはデフォルトで「帯域幅」と「遅延」を使用する
                    - 帯域幅は「10,000÷最小帯域幅（Mbps)」で計算する
                    - 遅延は「マイクロ秒(μs)÷10」で計算する
        - EGPは「BGP」一択
            - EGPはASとASをつなぐときに使用するルーティングプロトコルで、現在のネットワーク環境では、一般的に「BGP(Border Gateway Protocol)」が使われる
            - AS番号
                - インターネットに送出されたパケットは、ルーターがBGPをやりとりすることで作られた全世界のルート情報「フルルート」を使用して、バケツリレーのように宛先IPアドレスを持つ端末へ転送されていく
                - ASを識別する番号のことを「AS番号」といい、0〜65535まである
                - 「グローバルAS番号」は、インターネット上で一意のAS番号で、グローバルIPアドレスと同じように管理されISPやデータセンター事業者、通信事業者などの組織に割り当てられている
                - 「プライベートAS番号」は、その組織内であれば自由に使用してよいAS番号
            - ルーティングアルゴリズム
                - BGPはパスベクター型のプロトコルで、経路（パス）と方向（ベクター）に基づいてルートを計算する
                    - 宛先までどれたけのASを経由するかが、ベストパスの判断基準のひとつ
                    - BGPピアとルート情報を交換してBGPテーブルを作り、ベストパス選択アルゴリズムに基づいて選択する
                    - OSPFやEIGRPと同じように、変更があったときだけルーティングテーブルを更新し、通常時はKEEPALIVEメッセージで正常動作か確認する
            - ベストパス選択アルゴリズム
                - インターネットは、地球全体のASを BGPで網目状につなぎ合わせたものなので、国や政治お金など、さまざまな状況に柔軟に対応できるように、BGPにはたくさんのルート制御機能が用意されている
                - BGPのルート制御には、「アトリビュート（属性）」を使用する
                    - UPDATEメッセージの中に、「NEXT_HOP」や「LOCAL_PREF」などの属性を埋め込んでBGPテーブルに載せる
    - 再配送
        - RIP, OSPF, EIGRP, BGPなどのルーティングプロトコルそれぞれをうまく変換して、協調的に動作させることを「再配送」という
        - 境界のルーターで設定する
    - ルーティングテーブルのルール
        - 出来上がったルーティングテーブルをどうやって使用するか
            - 「ロンゲストマッチ」「ルート集約」「AD値」がポイント
        - より細かいルートが優先（ロンゲストマッチ）
            - 宛先IPアドレスの条件にヒットするルートがいくつかあったとき、サブネットマスクが最も長いルートを使用するというルーティングテーブルのルール
        - ルート集約でルートをまとめる
            - ネクストホップが同じである複数のルートをまとめることを「ルート集約」という
                - ルートの数を減らし、ルーターの負荷を減らす
            - ネクストホップが同じルートのネットワークアドレスをビットに変換して、共通しているビットまでサブネットマスクを移動する
            - ルート集約を極限まで推し進めて、すべてのルートをひとつに集約したものが「デフォルトルート」で、宛先IPアドレスに合致するルートがなかったら、デフォルトルートのネクストホップである「デフォルトゲートウェイ」にパケットを送信する
        - 宛先ネットワークがまったく同じだったらAD値で勝負！
            - AD(Administrative Distance)値は、ルーティングプロトコルごとに決められている優先度のようなもので、小さければ小さいほど優先度が高くなる
    - VRF
        - 「VRF(Virtual Routing and Forwarding)」は、1台のルーターに、「RD(Route Distinguisher)」という数字を使用して、独立した複数のルーティングテーブルを持たせる仮想化技術
            - VLANのルーターバージョンに近い
        - いくつかの古いルーターを物理的に1台にまとめることができ、管理台数の削減ができる
    - ボリシーベースルーティング
        - 基本的には従来のルーティングで設計し、どうしようもない要件があるときだけ、例外的にポリシーベースルーティングを使用する
- IPアドレスの割り当て方法
    - 割り当て方法には、大きく「静的割り当て」と「動的割り当て」の2種類がある
    - 静的割り当て
        - 端末に対して、一つひとつ手動でIPアドレスを設定する方法
            - サーバーやネットワーク機器は、IPアドレスがころころ変わると通信に影響が出るので、この割り当て方式を採用する
    - 動的割り当て
        - 「DHCP(Dynamic Host Configuration Protocol)」をはじめとするいくつかのプロトコルを駆使して、端末に対して自動でIPアドレスを設定する方法
        - IPv4の動的割り当て
            - DHCPv4は、ブロードキャストとユニキャストの両方を駆使しつつ、UDPでやりとりを行う
        - IPv6の動的割り当て
            - 「SLAAC(Stateless Address Auto Configuration)」と「DHCPv6」の2種類がある
            - SLAAC
            - DHCPv6
                - DHCPv6はDHCPv4と互換性はなく、また、DHCP単体で動作せずRS/RAと連携しつつ動作する
    - DHCPリレーエージェント
        - DHCPパケットをユニキャストに変換する機能で、DHCPクライアントからひとつ目（1ホップ目）にあるルーターで有効にする
            - ネットワークがたくさんあっても、1台のDHCPサーバーでまかなうことができる
- NAT
    - IPアドレスを変換する技術を「NAT(Network Address Translation)」という
        - NATは変換前後のIPアドレスやポート番号を「NATテーブル」というメモリ上の表（テーブル）で管理する
    - 静的NAT(Static NAT)
        - 内部と外部のIPアドレスを1:1に紐づけて変換する
            - 「1:1NAT」とも呼ばれ、狭義のNATはこの静的NATのことを指す
        - サーバーをインターネットに公開する時や、特定の端末が特定のIPアドレろでインターネットとやりとりしたいときなどに使用する
    - NAPT(Network Address Port Translation)
        - 内部と外部のIPアドレスをn:1に紐づけて変換する
            - 「IPマスカレード」や「PAT(Port Address Translation)」と呼ぶこともある
    - CGNAT(Carrier Grade NAT)
        - NAPTを通信事業者やISPで使用できるように拡張したもの
        - スマートフォンのLTEアンテナもプライベートIPv4アドレスが割り当てられている
        - ポート割り当て機能
            - 加入者に割り当てることができるポート番号は、ひとつのIPv4アドレスにつき64512(65535 - 1027 +1)個しかないので、CGNATは外部のIPアドレスを複数の「アドレスプール」というまとまりにして、n:nに紐づける
        - EIM/EIF機能（フルコーンNAT)
            - オンライン対戦のマッチングのようなP2P通信で、一定時間同じ送信元IPv4アドレスと送信元ポート番号が割り当てられるので、あたかも加入者端末がグローバルIPv4アドレスを持っているかのように通信できる
    - NATトラバーサル（NAT越え）
        - NAT機器を越えて端末同士を直接通信させるための技術
        - ポートフォワーディング
            - 特定のIPアドレス/ポート番号に対する通信を、あらかじめ設定しておいた内部の課端末に転送する機能
                - LAN内にいるサーバーを外部に公開するときに使う
        - UPnP(Universal Plug and Play)
            - 端末からのリクエストによって、自動的にポートフォワーディングできる機能
        - STUN(Session Travaersal Utilities NATs)
            - UDPを使用して、外部（インターネット）から内部（LAN）に対する通信を許可する機能
        - TURN(Traversal Using Relay around NAT)
            - TURNサーバーを介した通信機能のこと
                - 直接通信ではないので多少の遅延は発生するが、STUNよりもお手軽
- IPv4とIPv6の共存技術
    - デュアルスタック
        - ひとつの端末にIPv4アドレスとIPv6アドレスの両方を割り当てる技術
    - DNS64/NAT64
        - DNSサーバーの機能を利用して、IPv6端末がIPv4端末と通信できるようにする技術
            - DNS64がIPv4アドレスを16進数に変換して、後ろの32ビットに埋め込む。NAT64はIPv6からIPv4アドレスを抽出する
    - トンネリング
        - IPv6ネットワークを経由してIPv4パケットを届けたり、その逆をしたりする
- ICMPv4
    - 縁の下の力持ちの「ICMP(Internet Control Message Protocol)」は、IPレベルの通信を確認したり、いろいろなエラーを通知したりする重要な役割を担う
    - ICMPv4のパケットフォーマット
        - メッセージの最初にある「タイプ」と「コード」の値の組み合わせで、IPレベルでどんなことが起きているか、ざっくり知ることができる
    - 代表的なICMPv4の動作
        - Echo Request/Reply
            - IPレベルの通信状態を確認するICMPv4パケットが「Echo Request」と「Echo Reply」
                - pingすると、タイプが「8」、コードが「0」のEcho Requestが送信され、応答としてタイプが「0」、コードが「0」のEcho Replyを返す
        - Destination Unreachable
            - 宛先到達不可
        - Time-to-live exceeded
            - ルーティングループの防止と通信経路の確認というふたつの役割を担っている
            - ルーティングループの防止
            - 通信経路の確認
                - 「traceroute」で通信経路を確認する
- ICMPv6
    - ICMPv6のパケットフォーマット
        - ICMPv6も「タイプ」と「コード」の組み合わせが重要
    - 代表的なICMPv6の動作
        - IPv6アドレスの重複検知
        - 宛先IPv6アドレスから宛先MACアドレスを求める
        - ネットワーク情報の提供
- IPsec
    - 「IPsec(Security Architecture for Internet Protocol)」は、ネットワーク層でIPパケットのカプセル化や認証、暗号化を行い、インターネット上に仮想的な専用線（トンネル）を作る仮想化技術
    - 拠点館VPNとリモートアクセスVPN
        - 拠点間IPsecVPN
            - 支社やクラウド環境など拠点が複数ある企業の接続に使用される
            - IPsecを利用して、インターネット上にトンネル（仮想的な直結回線）を作って、あたかも専用線があるかのように接続できる
        - リモートアクセスIPsecVPN
            - 自宅からテレワークするような場合に、OSの標準機能やサードパーティのVPNソフトウェアなどを使用して、VPN用の仮想的なNICを作り、VPN装置（ルーターやファイアウォールなど）にIPsecトンネルを作る
    - IPsecプロトコルが持っている機能
        - IKE
            - いきなりトンネルができるのではなく、安全に通信するために、「IKE(Internet Key Exchange)」で事前準備をしてから、トンネルを作る
                - 送信元ポート番号と宛先ポート番号が500番のUDPパケットで、「IKEv1」と「IKEv2」というバージョンがある
            - IKEv1
                - 「フェーズ1」と「フェーズ2」がある
                - フェーズ1は、トンネルを制御する「ISAKMP SA(Internet Security Association and Key Management Protocol Security Association)」を作るフェーズ
                    - 「メインモード」と「アグレッシブモード」という2種類の交換手順がある
                - フェーズ2は、実際のデータをやりとりする「IPsec SA」を作るフェーズ
            - IKEv2
                - メーカーや機種、バージョンによって実装状況が異なり、相性問題が発生しやすいという欠点を克服するため、新たに標準化されたプロトコル
                - 「IKE_SA_INIT」と「IKE_AUTH」というふたつのステップで構成されている
        - ESP/AH
            - IPsec/Child SAでは、「ESP(Encapsulating Security Payload)」か「AH(Authentication Header）」のどちらかのプロトコルを使用する
            - ESPは暗号化機能があるが、AHにはない
        - NATトラバーサル
            - 送信元ポート番号が見えないと、紐づけができず、NAPTできない
# chapter: 5 トランポート層
- トランスポート層とは
    - トランスポート層によって処理すべきアプリケーションに振り分けられる
    - ネットワークとアプリケーションの架け橋となる階層
    - ポート番号を利用して、パケットを渡すアプリケーションを識別したり、アプリケーションの要件にあわせて、パケットの送受信量を制御したり、転送途中に消失したパケットを再送したりする
    - アプリケーションが即時性を求めるときにはUDP、信頼性を求めるときにはTCPを使う
- UDP
    - 即時性（リアルタイム性）を求めるようなアプリケーションである、音声通話（VoIP）や名前解決、DHCPや時刻同期などで使われる
        - いきなり「UDPコネクション」という論理的な通信路を作ってデータを送信する
        - 送ったら送りっぱなし
    - UDPのパケットフォーマット
        - 送信元/宛先ポート番号
            - クライアント（送信元端末）はコネクションを作るとき、OSが決められた範囲からランダムに割り当てた値を「送信元ポート番号」に、アプリケーションごとに定義されている値を「宛先ポート番号」にセットして、サーバー（宛先端末）に送信する
        - UDPデータグラム長
            - データグラム全体のサイズを表す、1バイト（8ビット）のフィールド
        - チェックサム
            - UDPチェックサム検証には、IPヘッダーのチェックサムと同じ「1の補数演算」が採用されている
    - ポート番号
        - UDPもTCPもまずはポート番号ありきで、IPパケットを受け取ったとしてもポート番号がないと、どのアプリケーションで処理すればよいかわからない
        - ポート番号とアプリケーションは一意に紐づいていて、ポート番号さえ見ればどのアプリケーションにデータを渡せばよいかわかるようになっている
        - System Ports
            - ポート番号「0 〜 1023」がSystem Portで、一般的には「Well-known Ports」として知られている
            - UDPの123番ならntpdやxntpdなど時刻同期で使用する「NTP」のサーバーアプリケーションに紐づくなど
        - User Ports
            - ポート番号「1024 〜 49151」はUser Portで、メーカーガ開発した独自のサーバーアプリケーションに一意に紐づいている
            - TCPの3306番なら、オラクル社のMySQLに紐づくなど
        - Dynamic and/or Private Ports
            - ポート番号「49152 〜 65535」はDynamic and/or Portsて、クライアントアプリケーションがコネクションを作るとき、送信元ポート番号としてランダムに割り当てる
            - デフォルトで、Windows OSでは「49152 〜 65535」で、Linux OSでは「32768 〜 60999」
    - ファイアウォールの動作（UDP編）
        - フィルタリングルール
            - どんな通信を許可し、どんな通信を拒否するか定義している
        - コネクションテーブル
            - ステートフルインスペクションは、コネクション情報をもとにフィルタリングルールを動的に書き換えて、メモリ内のテーブルで管理し、セキュリティ強度を高めている
        - ステートフルインスペクション
            1. ファイアウォールは、UDPデータグラムを受け取り、フィルタリングルールと照合する
            1. アクションが「許可(Accept, Permit）」のエントリにヒットすると、コネクションテーブルにコネクションエントリを追加する。同時に、送信元と宛先を反転させた、戻り通信を許可するフィルタリングルールを動的に追加する
            1. アクションが「拒否（Reject）」のエントリにヒットすると、コネクションテーブルには追加せず、クライアントに対して「Destination Unreachable（タイプ3）」のICMPパケットを返す
            1. アクションが「ドロップ（Drop）」のエントリにヒットした場合は、コネクションテーブルに追加せず、そこに機器があることを示さないために、何もしない。パケットをこっそり破棄するので「Silentry Descard」とも呼ばれる
            1. 戻り通信を受け取ると、クライアントに転送し、コネクションエントリのアイドルタイム（無通信時間）を「0秒」にリセットする
            1. ファイアウォールは通信が終了したら、コネクションテーブルのアイドルタイムをカウントアップし、アイドルタイムアウト（アイドルタイムの最大値）が経過すると、コネクションエントリとそれに関連するフィルタリングエントリを削除する
- TCP
    - TCP(Transmission Control Protocol)は、データを送り届けることについて信頼性を求めたいアプリケーションで使用する
        - 「TCPコネクション」という論理的な通信路を作って、通信環境を整える
        - 「送信パイプ」と「受信パイプ」で構成されている
        - 2本の論理的なパイプを全二重に使用して「送りまーす！」「受け取りました！」と確認し合って送り、信頼性を向上させている
        - 2020年現在、インターネット上のトラフィックの80%以上がTCPで構成されている
    - TCPのパケットフォーマット
        - RFC793「Transmission Control Protocol」をベースとして標準化されているプロトコル
        - プロトコル番号は「6」
        - ヘッダーの長さだけでも、IPヘッダーと同じ、最低20バイト（160ビット）ある
        - 送信元/送信先ポート番号
            - アプリケーション（プロセス）の識別に使用される2バイト（16ビット）の数字
        - シーケンス番号
            - TCPセグメントを正しい順序に並べるために使用される4バイト（32ビット）のフィールド
            - 送信側端末は「初期シーケンス番号（ISN: Initial Sequence Number)」から順に、通し番号を付与する
        - 確認応答番号（ACK番号: Acknowledge番号）
            - 「次はここからのデータをください」と相手に伝えるために使用される4バイト（32ビット）のフィールド
            - コントロールビットのACKフラグが「1」になっているときだけ有効になる
            - 「受け取りきったデータのシーケンス番号（最後のバイトのシーケンス番号）+1」がセットされている
            - TCPは、シーケンス番号とACK番号を協調的に動作させてデータの信頼性を確保している
        - データオフセット
            - TCPヘッダーの長さを表す4ビットのフィールド
            - どこまでがTCPヘッダーであるかわかる
            - IPヘッダーと同じく、TCPヘッダーの長さを4バイト（32ビット）単位に換算して入れる
                - 最も小さいTCPヘッダーの長さは20バイトなので「5」が入る
        - コントロールビット
            - コネクションの状態を制御するフィールド
            - フラグを「0」にしたり「1」にしたりすることによって、現在のコネクションがどのような状態にあるのか伝えあっている
                - フラグが立つ
        - ウィンドウサイズ
            - 受け取れるデータサイズを通知するためのフィールド
            - 「これくらいまでだったら受け取れますよ」という感じで、確認応答を待たずに受け取れるデータサイズをウィンドウサイズとして通知する
            - 送信側端末は、ウィンドウサイズが「０」のパケットを受け取ると、いったん送信するのを止める
        - チェックサム
            - 受け取ったTCPセグメントが壊れていないか、整合性のチェックに使用される2バイト（16ビット）のフィールド
            - TCPセグメントを受け取った端末は、検証に成功すると、セグメントを受け入れる
        - 緊急ポインタ
            - コントロールビットのURGフラグが「1」になっているときにだけ有効な2バイト（16ビット）のフィールド
            - 緊急データがあったとき、緊急データを示す最後のバイトのシーケンス番号がセットされる
        - オプション
            - TCPに関連する拡張機能を通知しあうために使用される
            - 「種別（Kind）」によって定義されているいくつかのオプションを、「オプションリスト」として並べていく形で構成されている
            - MSS(Maximum Segment Size)
                - TCPペイロードの最大サイズ
                - MTUとの比較
                    - MTUは、IPパケットの最大サイズで、小分けになったものの、最も大きい小分けの単位
                        - イーサネットのデフォルトで1500バイト
                    - MSSは、TCPセグメントに詰め込むことができるアプリケーションデータの最大サイズを表す
                        - IPv4であれば「MTU - 40バイト（IPv4ヘッダー + TCPヘッダー）」で、「イーサネット(L2） + IPv4（L3）」環境なら、MSSは1460（= 1500 - 40）バイト
                        - トランスポート層は、アプリケーションデータをMSSに区切って、TCPにカプセル化する
                    - TCP端末は、3ウェイハンドシェイクするときに、「このMSSのアプリケーションデータだったら受け取れますよー」と、サポートしているMSSの値をお互いに教え合う
            - SACK(Selective Acknowledgment)
                - 消失したTCPセグメントだけを再送する機能
                - SACKに対応していると、部分的にTCPセグメントが消失した場合、「どこからどこまで受け取ったか」という範囲をオプションフィールドで通知するので、消失したTCPセグメントだけを再送できる
                - RFC2018「TCP Selective Acknowledgment Options」で標準化されていて、ほぼすべてのOSでサポートされている
    - TCPにおける状態遷移
        - 接続開始フェーズ
            - 「3ウェイハンドシェイク（3WHS）」でコネクションをオープンする
                - コネクションを確立する前に行うあいさつを表す処理手順
                - お互いがサポートしている機能やシーケンス番号を決めて、「オープン」する
                    - コネクションを作りにいく側の処理を「アクティブオープン」、コネクションを受け付ける側の処理を「パッシブオープン」という
            1. クライアントは「CLOSE」、サーバーは「LISTEN」の状態
            1. クライアントはSYNフラグを「1」、シーケンス番号にランダムな値をセットしたSYNパケットを送信し、「SYN-SENT」状態に移行して、続くSYN/ACKパケットを待つ
            1. SYNパケットを受け取ったサーバーは、SYNフラグとACKフラグを「1」にセットしたSYN/ACKパケットを返し、「SYN-RECEIVED」状態に移行する
            1. SYN/ACKパケットを受け取ったクライアントは、ACKフラグを「1」にセットしたACKパケットを返し、「ESTABLISHED」状態に移行する
            1. ACKパケットを受け取ったサーバーはESTABLISHED状態に移行する。ここまででアプリケーションデータの最初に付与されるシーケンス番号がそれぞれ確定する
        - 接続確立フェーズ
            - 「フロー制御」「輻輳制御」「再送制御」という3つの制御を組み合わせて転送する
            - フロー制御
                - 受信側の端末が行う流量調整
                - 受信側端末が受け取りきれないことがないように考慮しつつ、可能なかぎりたくさんのデータを送信するようにしている
                    - 「スライディングウィンドウ」という
            - 輻輳制御
                - 送信側の端末が行う流量制御
                - TCPは、大量のパケットによってネットワークが輻輳しないように「輻輳制御アルゴリズム」によって、パケットの送信数を制御している
                    - 「輻輳ウィンドウ(cwnd: congestion window）」という
                - パケットロス（損失）が発生したら輻輳と判断する「ロスベース」、遅延が発生したら輻輳と判断する「遅延ベース」、両方を総合的に判断する「ハイブリッドベース」がある
            - 再送制御
                - パケットロスが発生したときに行うパケットの再送機能
                    - ACKパケットによってパケットロスを検知する
                - 重複ACK(Duplicate ACK)
                    - 受信側端末は、TCPセグメントのシーケンス番号が飛び飛びになると、パケットロスが発生したと判断して、確認応答が同じACKパケットを連続して排出する
                    - 送信側端末は、一定以上の重複ACKを受け取ると、対象となるTCPセグメントを再送する
                    - 重複ACKをトリガーとする再送制御のことを「Fast Retrasmit（高速再送）」という
                - 再送タイムアウト（Retransmission Time Out: RTO）
                    - 送信側端末は、TCPセグメント送信後、ACKパケットを待つまでの時間を「再送タイマー（Retransmission Timer」として保持している
                    - 再送タイマーは、RTT（パケットの往復遅延時間）から数学的なロジックで算出され、ACKパケットを受け取るとリセットされる
        - 接続終了フェーズ
            - コネクションの終了処理は、「4ウェイハンドシェイク」によってオープンの処理よりもしっかり進められる
            - クライアント、サーバーの役割にかかわらず、先にFINを送出してコネクションを終わらせに行く側の処理のことを「アクティブクローズ」、それを受け付ける側の処理のことを「パッシブクローズ」という
            1. クライアントは予定したデータやりとりが終わって、アプリケーションからクローズ処理の要求が入ると、アクティブクローズの処理を開始する。FINフラグとACKフラグを「1」にしたFIN/ACKパケットを送信し、サーバーからのFIN/ACKパケットを待つ「FIN-WAIT1」状態に移行する
            1. FIN/ACKパケットを受け取ったサーバーは、パッシブクローズの処理を開始する。ACKパケットを送信して、「CLOSE-WAIT」状態に移行する
            1. ACKを受け取ったクライアントは、サーバーからのFIN/ACKパケットを待つ「FIN-WAIT2」状態に移行する
            1. サーバーはFIN/ACKパケットを送信し、最後のACKを待つ「LAST-ACK」状態に移行する
            1. サーバーからFIN/ACKを受け取ったクライアントは、ACKパケットを送信し、「TIME-WAIT」状態に移行する。TIME-WAITは、もしかしたら遅れて届くかもしれないACKパケットを待つ、保険のような状態
            1. ACKパケットを受け取ったサーバーは「CLOSED」状態に移行し、コネクションを削除し、確保していたリソースを解放する。これでパッシブクローズは終わり
            1. TIME-WAITに移行しているクライアントは、設定された時間（タイムアウト）を待って「CLOSED」状態に移行し、コネクション削除しリソースを解放する。これでアクティブクローズは終わり
    - いろいろなオプション機能
        - TCP Fast Open
            - 2回目の3ウェイハンドシェイクから、いきなりSYNでHTTPリクエストを送信して、1往復遅延時間（RTT）を節約する
        - Nagleアルゴリズム
            - データサイズが小さいTCPセグメントをまとめて送信する機能
        - 遅延ACK
            - MSSに満たない小さいTCPセグメントに対するACK応答を少しだけ遅らせる機能
            - Nagleアルゴリズムとの相性に注意する
        - Early Retransmit
            - Fast Retransmitが発動しない特定のTCP環境において、重複ACKのしきい値を下げ、Fast Retransmitを誘発する機能
        - Tall Loss Probe
            - 送信したTCPセグメントのうち、最後のほうが失われてしまった場合に、再送タイムアウトよりも早く再送を試みる機能
    - ファイアウォールの動作（TCP編）
        - 「送信元/宛先IPアドレス」、「トランスポート層プロトコル」、「送信元/宛先ポート番号」（5 Tuple、ファイブタプル）でコネクションを識別して、通信制御をする
        - 通信の許可/拒否の「フィルタリングルール」、通信管理の「コネクションテーブル」で、ステートフルインスペクションを実行する
            1. ファイアウォールは、クライアント側にあるOutsideインターフェースでSYNパケットを受け取り、フィルタリングルールと照合する
            1. アクションが「許可（Accept, Permit）」にヒットしたら、コネクションテーブルにコネクションエントリを追加し、戻り通信を今日するフィルタリングルールを動的に追加してから、サーバーにTCPセグメントを転送する
            1. 一方アクションが「拒否（Reject）」なら、クライアントに対してRSTパケットを返す
            1. アクションが「ドロップ（Drop）」の場合は、TCPセグメントを何もなかったようにこっそりと破棄（Silent Discard）する
            1. 許可の場合に、サーバーからSYN/ACKパケットが返ってきたら(2)で作ったフィルタリングルールを適用して、クライアントに転送し、コネクションエントリの状態を「SYN-SENT」→「ESTABLISHED」に更新して、アイドルタイムを「0秒」にリセットする
            1. アプリケーションデータを送り終えたら、4ウェイハンドシェイクによるクローズ処理をする。「FIN/ACK」→「ACK」→「FIN/ACK」→「ACK」の流れを見て、コネクションエントリを削除し、戻り通信用のルールも削除する。うまくクローズできなかったときは、ファイアウォールはアイドルタイムがタイムアウトしたら、コネクションエントリとルールを削除して、メモリを開放する
# chapter6: アプリケーション層
- アプリケーション層とは
    - アプリケーションとしての処理を行い、アプリケーションとユーザーをつなぐ階層
        - トランスポート層は、転送制御をしながら、アプリケーションごとにパケットを選別してくれるが、それ以上のことはしてくれない
## HTTP
- HTTP
    - HTTPのバージョン
        - 「HTTP（Hypertext Transfer Protocol）」
            - 「http://…」は「HTTPでアクセスしますよー」とWebサーバーに宣言しつつ、リクエストを送信する
        - HTTP/0.9
            - テキストファイル(HTMLファイル）をサーバーからダウンロードするだけ
        - HTTP/1.0
            - テキストファイル以外にもいろいろなファイルを扱えるようになり、アップロードや削除もできるようになった
        - HTTP/1.1
            - 「キープアライブ（持続的接続）」や「パイプライン」など、TCPレベルにおけるパフォーマンス向上を図る機能が盛り込まれた
            - キープアライブ
                - 一度作ったTCPコネクションを使い回す機能
            - パイプライン
                - リクエストに対するレスポンスを待たずに、次のリクエストを送信する機能
                    - 実際には「HoL（Head of Lock）ブロッキング」が起こるのでChromeでもデフォルトで無効にしている
        - HTTP/2
            - Googleが開発したSPDY(スピーディ）というプロトコルをベースに標準化されている
        - HTTP/3
            - Googleが開発したQUIC(Quick UDP Internet Connections）をベースに標準化が進められている
            - アプリケーションデータを送れない時間を徹底的に削ることによってパフォーマンス向上を図っている
    - HTTP/1.1のメッセージフォーマット
        - リクエストメッセージのフォーマット
            - 各ヘッダーフィールドは「<ヘッダー名>:<フィールド値>」で構成されている
            - リクエストライン
                - クライアントがサーバーに「〇〇してください！」と処理をお願いするための行
                - リクエスト種類を表す「メソッド」、リソース識別子を表す「リクエストURI(Uniform Resource Identifier）」、HTTPバージョンを表す「HTTPバージョン」の3つで構成されている
                - メソッド
                    - GETやPOSTなど、クライアントがサーバーに対してお願いするリクエストの種類を表す
                - リクエストURI
                    - サーバーの場所やファイル名、パラメータなど、いろいろなリソースを識別するために使用する文字列
                        - 「絶対URI」と「相対URI」がある
                        - 絶対URI
                        - 相対URI
                    - URIのひとつとして「URL（Uniform Resource Locator）」があり、ネットワークにおけるサーバーの場所を表している
        - レスポンスメッセージのフォーマット
            - ステータスライン
                - WebサーバーがWebブラウザに対して処理結果の概要を返す行
                - ステータスラインは、HTTPのバージョンを表す「HTTPバージョン」、処理結果の概要を3桁の数字で表す「ステータスコード」、その理由を表す「リーズンフレーズ」で構成されている
    - いろいろなHTTPヘッダー
        - リクエストヘッダー
            - リクエストメッセージを制御するためのヘッダー
            - Acceptヘッダー
                - Webブラウザが、「〇〇のファイルだったら処理できます！」とWebサーバーに伝える
                - 複数のMIMEタイプが処理できて、優先度を付けたい場合は、「qvalue（品質係数）」を使う
            - Hostヘッダー
                - HTTP/1.1で唯一必須のヘッダー
                - WebブラウザがリクエストするWebサーバーのドメイン名(FQDN)とポート番号がセットされる
                    - 「http://www.example.com:8080/html/hogehoge.txt」ならHostヘッダーには「www.example.com:8080」がセットされる
            - Refererヘッダー
                - 直前のリンク元のURIを示すヘッダー
                    - 「私はこのURIから飛んできました！」
            - User-Agentヘッダー
                - WebブラウザやOSなど、ユーザーの環境を表すヘッダー
                - 統一されたフォーマットがなく、Webブラウザごとに異なる
        - レスポンスヘッダー
            - レスポンスメッセージを制御するヘッダー
            - ETagヘッダー
                - Webサーバーの持つファイルなどのリソースを一意に識別するためのヘッダー
                - 「If-Matchヘッダー」「If-None-Matchヘッダー」などのリクエストヘッダーと組み合わせて使う
            - Locationヘッダー
                - リダイレクト先を通知するために300番台のステータスコードとあわせて使用する
            - Serverヘッダー
                - サーバーの情報がセットされるヘッダー
                - 脆弱性を想定できるため無効にしておく
        - 一般ヘッダー
            - Cache-Controlヘッダー
                - Webブラウザやサーバーのキャッシュを制御するために使う
                - キャッシュには、Webブラウザに保持される「プライベートキャッシュ」と、プロキシサーバーやCDNに保持される「共有キャッシュ」の2種類がある
                - 「ディレクティブ」をフィールド値に格納することで制御する
            - Connectionヘッダー/Keep-Aliveヘッダー
                - キープアライブ（持続的接続）を制御するヘッダー
                - 次のリクエストがこないときにタイムアウトする時間（timeoutディレクティブ）や、そのTCPコネクションにおける残りリクエスト数（maxディレクティブ）などを伝える
        - エンティティヘッダー
            - メッセージボディに関連する制御情報を含むヘッダー
            - Content-Encoding/Accept-Encodingヘッダー
                - Webブラウザが処理できるメッセージボディの圧縮方式（コンテンツコーディング）を指定するヘッダー
                - 「gzip（GNU zip）」「compress（UNIXの標準圧縮）」「deflate（zlib）」「identity（エンコーディングなし）」の4種類
            - Content-Lengthヘッダー
                - HTTP/1.1では、キープアライブ（持続的接続）によってひとつのコネクションを使い回すことがあるため、必ずしもTCPコネクションがクローズされない
                    - 「Content-Lengthヘッダー」を使用して、メッセージの境界をTCPに伝え、適切にTCPコネクションがクローズされるようにする
        - その他のヘッダー
            - Set-Cookie/Cookie
                - Cookieとは、HTTPサーバーとの通信で特定の情報をブラウザに保持させる仕組み、または保持したファイルのこと
                - CookieはWebブラウザ上でFQDN（Fully Qualified Domain Name、完全修飾ドメイン名）ごとに管理されている
            - X-Forwarded-For
                - 変換前の送信元IPアドレスを格納するヘッダー
                    - X-Forwarded-Forの値を見ると、どのIPアドレスからアクセスされているか特定できる
            - X-Forwarded-Proto
                - X-Forwarded-Forのプロトコル版
                    - 変換前のプロトコルを格納する
                    - 「SSLオフロード（SSLアクセラレーション）」で処理負荷になりがちなSSLの処理をサーバーから肩代わりできるが、これを使うと元のプロトコルがわからなくなる
        - メッセージボディ
            - 実際に送りたいアプリケーションデータそのものが入るフィールド
    - HTTP/2のメッセージフォーマット
        - HTTP/1.1はメッセージヘッダーとメッセージボディを改行コード（\r\n）で区切ったテキストメッセージ単位でTCPコネクションに流すので、バイナリ形式への変換処理が必要になる
        - HTTP/2はメッセージヘッダーを「HEADERSフレーム」に、メッセージボディを「DATAフレーム」に分割格納し、バイナリ形式のフレーム単位でストリームに流す
            - 「ストリームID」でどのストリームに流すか指定する
        - リクエストラインとステータスライン
            - リクエストライン
                - HTTP/2ではメソッドを「:methodヘッダー」に、URIを「:pathヘッダー」に、HTTPバージョンを「:versionヘッダー」に格納して、HEADERSフレームで送信する
            - ステータスライン
                - HTTP/2ではHTTPバージョンを「:versionヘッダー」に、ステータスコードを「:statusヘッダー」に格納してHEADERSフレームで送信する
                    - リーズンフレーズは廃止された
        - プロトコルアップグレード
            - SSLハンドシェイクパターン
                - ALPN(Application-Layer Protocol Negotiation）を使用して、お互いがHTTP/2に対応していることを伝えあい、HTTP/2で接続する
            - HTTPヘッダーパターン
                - HTTP/1.1でGETするとき、あわせて「Upgradeヘッダー」を付けて、「HTTP/2にも対応していますよ」と伝える
            - ダイレクト接続パターン
                - あらかじめHTTP/2で接続できるとわかっている検証環境などで使用する
    - 負荷分散装置の動作
        - 負荷分散装置は、ネットワーク層（IPアドレス）やトランスポート層（ポート番号）、アプリケーション層（メッセージ）の情報を利用して、複数のサーバーにコネクションを割り当てる機器
            - 「仮想サーバー」で受け取ったコネクションを振り分ける
        - 宛先NAT
            - 負荷分散装置は、クライアントからパケットを受け取ると、サーバーの生死状態やコネクションの状態を確認し、最適なサーバーのIPアドレスに宛先IPアドレスを変換する
            - 「コネクションテーブル」でどのコネクションをどのIPアドレスに宛先NATしていくかを把握している
            1. 負荷分散装置は仮想サーバー（仮想IPアドレス）でクライアントのコネクションを受け取り、コネクションテーブルで管理する
            1. サーバーの状態やコネクションの状態などで動的にサーバーのIPアドレスに変換して、コネクションを分散させ、変換後のIPアドレスもコネクションテーブルに載せる
            1. サーバーはアプリケーション処理をした後に、デフォルトゲートウェイとなっている負荷分散装置に戻り通信を送り、負荷分散装置は送信元IPアドレスをNATしてクライアントに送り、コネクションテーブルで管理する
        - ヘルスチェック
            - 負荷分散装置は、定期的に監視パケットをサーバーに送って、ダウンと判断したら切り離す
            - L3チェック、L4チェック、L7チェックに分けられる
                - サーバーのリソースにゆとりがあれば「L3チェック＋L7チェック」、ゆとりがなければ「L3チェック＋L4チェック」を選択する
        - 負荷分散方式
            - 「どの情報を使って、どのサーバーに割り振るか」が負荷分散方式
            - 対象サーバーのスペックが同じであれば、ラウンドロビンか最小コネクション数がよく利用される
        - オプション機能
            - 負荷分散装置は、最近は活躍の場をアプリケーション層にまで広げていて、「アプリケーションデリバリーコントローラー（ADC）」とも呼ばれるようになっている
            - パーシステンス
                - アプリケーションの同じセッションを、同じサーバーに割り振り続ける機能
                - 送信元IPアドレスパーシステンス
                    - クライアントのIPアドレスをもとに同じサーバーに割り振り続ける方式
                    - 送信元IPアドレスが個別になりやすいインターネットサーバーなどで利用される
                - Cookieパーシステンス
                    - Cookie情報をもとに同じサーバーに割り振り続ける方式
                    - 送信元IPアドレスが同じになるNAPT環境やプロキシ環境でも、より柔軟に負荷分散できる
            - アプリケーションスイッチング
                - リクエストURIやWebブラウザの種類など、アプリケーションデータに含まれるいろいろな情報をもとに、よりきめ細かく、かつ幅広い負荷分散をする
            - HTTP/2オフロード
                - オフロードはサーバーの行う処理を「肩代わり」する機能
                - HTTP2オフロードを使用すれば、サーバーはHTTP/1.1のまま、システムをHTTP/2に対応することができ、実装までの時間を節約できる
## SSL/TLS
- SSL/TLS
    - SSL/TLSはデータを暗号化したり通信相手を認証したりすることでデータを守る
    - SSLで使用している技術
        - SSLで防ぐことができる脅威
            - SSLは「暗号化」「ハッシュ化」「デジタル証明書」という、3つの技術を組み合わせて使用する
            - 暗号化で盗聴を防ぐ
                - 暗号化は、決められたルールに基づいてデータを変換する技術
            - ハッシュ化で改ざんを防ぐ
                - ハッシュ化は、アプリケーションデータから、決められた計算（ハッシュ関数）に基づいて固定長のデータ（ハッシュ値）を取り出す技術
                    - アプリケーションデータが変われば、ハッシュ値も変わる
                    - SSLはデータとハッシュ値をあわせて送信し、受信端末はデータから計算したハッシュ値と添付されているハッシュ値を比較検証する
            - デジタル証明書でなりすましを防ぐ
                - デジタル証明書は、その端末が本物であることを証明するファイルのこと
                    - SSLではデータ送信の前に「あなたの情報をください」とお願いして、送られてきたデジタル証明書をもとに正しい相手か確認する
                    - デジタル証明書のお墨付きは、「認証局（CA、Certification Authority）」と呼ばれる第三者機関の「デジタル署名」によって判断する
        - SSLで使用する暗号化方式
            - 共通鍵暗号化方式
                - 暗号化鍵と複合鍵に同じ鍵（共通鍵）を使用する暗号化方式
                    - あらかじめ共有した鍵
                - さらに「ストリーム暗号」と「ブロック暗号」に大別できる
                    - ストリーム暗号は、1ビットごと、あるいは1バイトごとに暗号化処理を行う暗号化方式
                        - 代表的なストリーム暗号である「RC4(Rivest's Cipher 4/Ron's Code4)」に致命的な脆弱性が見つかり、現在は使用されない
                    - ブロック暗号は、データを一定のビット数ごと（ブロック）に区切って一つひとつ暗号化処理をする
                        - 代表的なブロック暗号である「AES（Advanced Encryption Standard）」は目立った脆弱性報告がなく、よく使用されている
                - 暗号化/復号処理が高速だが、鍵配送問題を別の仕組みで解決する必要がある
            - 公開鍵暗号化方式
                - 暗号化鍵と復号鍵に異なる鍵を使用する暗号化方式
                    - 片方の鍵から片方の鍵を導き出せないようになっている、公開鍵と秘密鍵の鍵ペア
                1. Webサーバーは公開鍵と秘密鍵（鍵ペア）を作る
                1. Webサーバーは公開鍵をみんなに公開・配布し、秘密鍵だけを保管する
                1. Webブラウザは公開鍵を暗号化鍵として使用し、データを暗号化して送信する
                1. Webブラウザは秘密鍵を復号鍵として使用し、データを復号する
                - メリットは鍵を配送する必要がないこと
                    - 公開鍵は秘密鍵がないかぎり機能しないし、公開鍵から秘密鍵は算出できない
                - デメリットは処理速度と処理負荷が大きいこと
            - ハイブリッド暗号化方式
                - 共通鍵暗号か方式と公開鍵暗号化方式は、メリットとデメリットがちょうど逆の関係にあるので、SSLは組み合わせて使用することで処理の効率化を図っている
                1. Webサーバーは公開鍵と秘密鍵を作る
                1. Webサーバーは公開鍵をみんなに公開・配布し、秘密鍵だけを保管する
                1. Webブラウザは共通鍵（共通鍵暗号化方式で使用する鍵）の素を公開鍵で暗号化して送る
                1. Webサーバーは共通鍵の素を秘密鍵で復号する
                1. WebサーバーとWebブラウザは共通鍵の素から共通鍵を生成する
                1. Webブラウザはアプリケーションを共通鍵で暗号化する
                1. Webサーバーはアプリケーションデータを共通鍵で復号する
        - SSLで使用するハッシュ関数
            - ハッシュ化は、アプリケーションデータをハッシュドポテトのように細切れにして、同じサイズのデータにまとめる技術
            - ハッシュ値を比較したほうが効率的
                - データが異なると、ハッシュ値も異なる
                - データが同じだと、ハッシュ値も同じ
                - ハッシュ値から元データには戻せない
                - データのサイズが異なっても、ハッシュ値のサイズは固定
            - アプリケーションデータの検証
                - 「メッセージ認証コード（MAC: Message Authentication Code）」は、アプリケーションデータとMAC鍵（共通鍵）をまぜこぜにして、MAC値（ハッシュ値）を計算する技術
            - デジタル証明書の検証
                - SSLでは、デジタル証明書の検証にもハッシュ化を使用している
                - 世の中から信頼されている第三者「認証局（CA）」に、「AさんがAさんであること」をデジタル署名という形で認めてもらい、そのデジタル署名にハッシュ化を使用する
                - デジタル証明書は、「署名前証明書」「デジタル署名のアルゴリズム」「デジタル署名」で構成されている
                    - デジタル署名は、署名前証明書を、デジタル署名のアルゴリズムで指定されたハッシュ関数でハッシュ化し、認証局の秘密鍵で暗号化したもの
                - デジタル証明書を受け取った受信者は、デジタル署名を認証局の公開鍵（CA証明書）で復号し、署名前証明書のハッシュ値と比較検証する
        - SSLで使用する技術のまとめ
    - SSLのバージョン
        - SSLのバージョンの歴史は、そのまま脆弱性との戦いの歴史
        - どのバージョンを使用するかは「SSLハンドシェイク」によって決定される
        - SSL2.0
            - 「SSL1.0」はリリース前に致命的な脆弱性が見つかって、日の目を見ずに終わった
            - SSL2.０は「ダウングレード攻撃」や「バージョンロールバック攻撃」などの致命的な脆弱性が見つかり、使われなくなった
        - SSL3.0
            - SSL3.0は長期間にわたってSSLの王道だったが、「POODLE(Padding Oracle On Downgraded Legacy Encryption)攻撃」が発見されて、その役目を終えた
        - TSL1.0
            - TSL1.0はSSL3.0と基本的な機能は大きく変化していない
            - 20年以上にわたって使用されたが、対応する暗号化方式や認証方式が陳腐化してきたので、2020年に主要ブラウザで無効化された
        - TSL1.1
            - TLS1.1はTSL1.0で指摘されていた「BEAST(Browser Exploit Against SSL/TSL)攻撃」に対応していたりしたが、TLS1.0とあわせて無効化された
        - TSL1.2
            - 2020年現在、最も使用されているバージョン
        - TSL1.3
            - より強力なハッシュ関数、暗号化方式に対応することで安全性の向上を図り、SSLハンドシェイクのプロセスを簡略化することでパフォーマンスの向上も図っている
    - SSLのレコードフォーマット
        - SSLレコードとは
            - SSLによって運ばれるメッセージのことを、「SSLレコード」という
            - SSLレコードは、「SSLヘッダー」と、その後に続く「SSLペイロード」で構成され、SSLヘッダーは「コンテンツタイプ」「プロトコルバージョン」「SSLペイロード長」という3つのフィールドで構成されている
        - コンテンツタイプ
            - SSLレコードの種類を表す1バイト（8ビット）のフィールド
            - 「ハンドシェイクレコード」「暗号仕様変更レコード」「アラートレコード」「アプリケーションデータレコード」の4つ
            - ハンドシェイクレコード
                - 実際の暗号化通信に先立って行われる「SSLハンドシェイク」で使用するレコード
            - 暗号仕様変更レコード（Change Cipher Spec レコード）
                - SSLハンドシェイクによって決まったいろいろな仕様（暗号化方式やハッシュ化方式など）を確定したり、変更したりするために使用する
            - アラートレコード
                - SSLに関係するエラーがあったことを伝えるレコード
                - このレコードを見ることでエラーの概要がわかる
            - アプリケーションデータレコード
                - 実際のアプリケーションデータ（メッセージ）が含まれるレコード
        - プロトコルバージョン
            - 上位1バイト（8ビット）がメジャーバージョン、下位1バイト（8ビット）がマイナーバージョンを表す
        - SSLペイロード長
            - SSLペイロードの長さをバイト単位で定義する2バイト（16ビット）のフィールド
    - SSLの接続から切断までの流れ
        - サーバー証明書を用意する
            1. HTTPSサーバーで秘密鍵を作る
                - 「BEGIN RSA PRIVATE KEY」で始まり、「END RSA PRIVATE KEY」で終わる
            1. 1で作った秘密鍵をもとに、「CSR（Certificate Signing Request）」という申請書のようなものを作って認証局に送る
                - CSRを作るために必要な情報は「ディスティングウィッシュネーム」と呼ばれる
                - CSRは、署名前情報が暗号化されているテキストファイルで、「BEGIN CERTIFICATE REQUEST」で始まり、「END CERTIFICATE REQUEST」で終わる
                - CSRをコピーして、認証局の申請サイトの指定された部分にペーストする
            1. 認証局が申請元の身元を審査しパスしたら、CSRをハッシュ化、　認証局の秘密鍵で暗号化して、デジタル署名としてくっつける。そして、認証局はサーバー証明書を発行し、申請元に送信する
                - サーバー証明書は「BEGIN CERTIFICATE」で始まり、「END CERTIFICATE」で終わるテキストファイル
            1. 認証局から受け取ったサーバー証明書をサーバーにインストールする。最近の認証局は、中間認証局から入手する「中間証明書（中間CA証明書、チェーン証明書）」も一緒にインストールするように定めている
        - SSLハンドシェイクで事前準備
        - 暗号化通信
            1. 対応している暗号化方式とハッシュ関数の提示
                - 「Client Hello」で、利用可能な暗号化方式や一方向ハッシュ関数の組み合わせ（暗号スイート : Cipher Suite）」をリストで提示する
                - 共通鍵の作成に必要な「client random」などのパラメータも送る
            1. 通信相手の証明
                - 本物のサーバーと通信しているかをサーバー証明書で確認する
                - 「Server Hello」「Certificate」「Server Hello Done」の3つのプロセスでできている
                1. Server Hello
                    - 暗号スイートのリストを照合し、マッチした暗号スイートの最も優先度の高い暗号スイートを選択し、共通鍵作成に使用する「server random」などのパラメータも含めてServer Helloとして返す
                1. Certificate
                    - 自分自身のサーバー証明書を送り、「自分が第三者機関から認められた本人であること」を証明する
                1. Server Hello Done
                    - 「私の情報はすべて送り終わりました」と通知し、Webブラウザは、受け取ったサーバー証明書を検証（ルート証明書で復号→ハッシュ値を比較）し、正しいサーバーであるかを確認する
            1. 共通鍵の交換
                - アプリケーションデータの暗号化とハッシュ化に使用する共通かぎの素を交換する
                - 通信相手が本物のサーバーであることを確認すると、「プリマスターシークレット」という共通鍵の素を作ってサーバーに送る
                - WebブラウザとHTTPSサーバーは、プリマスターシークレットとClient Helloで得た client random とServer Helloで得た server random をまぜこぜにして、「マスターシークレット」を作る
                - このマスターシークレットから、共通鍵である「セッション鍵」と、ハッシュ化に使用する「MAC鍵」を作る
                - Webブラウザは「Client Key Exchange」で、プリマスターシークレットを公開鍵で暗号化して送る
            1. 最終確認作業
                - お互いに「Change Cipher Spec」と「Finished」を交換しあって、これまでに決まったことを確定し、SSLハンドシェイクを終了する
                - このやりとりが終了すると、SSLセッションが出来上がり、アプリケーションデータの暗号化通信が始まる
        - 暗号化通信
            - アプリケーションデータをMAC鍵でハッシュ化した後、セッション鍵で暗号化して、アプリケーションデータレコードで転送する
        - SSLセッション再利用
            - SSLハンドシェイクは処理にやたらと時間がかかるので、2回目以降に使い回す「SSLセッション再利用（SSLセッションリザンプション）」という機能が用意されている
        - SSLセッションのクローズ
            - まずクローズしたい側から「close_notify」が送出され、その後TCPの4ウェイハンドシェイクが行われ、TCPコネクションもクローズされる
    - クライアント証明書でクライアントを認証する
        - あらかじめWebブラウザにインストールしておいた「クライアント証明書」を利用して、クライアントを認証する
        1. クライアント証明書を要求
            - Client Hello → Server Hello → Certificate の流れは変わらない
        1. クライアント証明書を送付
            - Certificate Request と Server Hello を受け取ったWebブラウザは、Certificate（クライアント）であらかじめインストールされているクライアント証明書を送信する
        1. これまでのハッシュ値を送付
            - Client Key Exchange でプリマスターシークレットを送信する
            - 続けて、「Certificate Verify」でこれまでのやりとりをハッシュ化、秘密鍵で暗号化して、「デジタル署名」として送信する
            - Certificate Verifyを受け取ったサーバーは、Certificate（クライアント）の中に含まれていた公開鍵で復号し、自分自身でも計算したハッシュ値と比較して、改ざんされていないか確認すr
    - SSLオフロード機能の動作
        - これまでサーバーで行っていたSSLの処理を負荷分散装置で行う機能
        - サーバーはSSLの処理をしなくてよくなるため、処理負荷が劇的に軽減する
## DNS
- DNS
    - DNS（Domain Name System）とは
        - IPアドレスとドメイン名を相互に変換するプロトコル
            - 「172.217.175.4」は「www.google.com」というドメイン名が付けられている
    - ドメイン名
        - ドットで区切られた文字列で構成されている
            - 一つひとつの文字列のことを「ラベル」という
        - ドメイン名は別名「FQDN（Fully Qualified Domain Name、完全修飾ドメイン名）」と呼ばれる
            - 「ホスト部」と「ドメイン部」で構成されている
        - 右から順に「ルート」「トップレベルドメイン（TLD: Top Level Domain）」「第２レベルドメイン（2LD: 2nd Level Domain）」……と構成されている
            - トップレベルドメインには地域ごとに割り当てられている「ccTLD（country code Top Level Domain、国別コードトップドメイン）」と、特定の領域・分野に割り当てられている「gTLD（generic Top Level Domain、分野別トップレベルドメイン）」の2種類がある
            - 「jp」は日本を表すccTLDで、「com」商用サイトを表すgTLD
        - ルートを頂点としたツリー状の階層構造を「ドメインツリー」という
    - 名前解決とゾーン転送
        - 名前解決
            - IPアドレスとドメイン名を相互に変換する処理のことを「名前解決」という
                - 「DNSクライアント」「キャッシュサーバー」「権威サーバー」が相互に連携しあうことで成り立つ
                - 「DNSサーバー」という言葉は、キャッシュサーバー（別名: フルサービスリゾルバー、参照サーバー）を指す場合と、権威サーバー（別名: コンテンツサーバー、ゾーンサーバー）を指す場合、その両方をまとめて指す場合がある
            - DNSクライアント（別名: スタブリゾルバー）
                - DNSサーバーに名前解決を要求するWebブラウザやdigコマンドのようなクライアント端末・ソフトウェア
                - 結果はキャッシュする
            - キャッシュサーバー（別名: フルサービスリゾルバー、参照サーバー）
                - DNSクライアントからの再帰クエリを受け付け、インターネット上にある権威サーバーに名前解決の要求（反復クエリ）を送信するDNSサーバー
                - 結果はキャッシュする
            - 権威サーバー（別名: コンテンツサーバー、ゾーンサーバー）
                - 自分が管理するドメインに関して、キャッシュサーバーからの反復クエリを受け付けるDNSサーバー
                - 自分が管理するドメインの範囲（ゾーン）に関する各種情報を「ゾーンファイル」というデータベースに、「リソースレコード」という形で格納している
                - 権威サーバーは「ルートサーバー」と呼ばれる親分サーバーを頂点とした階層構造になっている
                - DNSクライアントから再帰クエリを受け付けたキャッシュサーバーは、受け取ったドメイン名を右のラベルから順に検索していき、そのゾーンを管理する権威サーバーにどんどん反復クエリを実行していく
                    - 最後までたどり着いたら、そのその権威サーバーにドメイン名に対応するIPアドレスを教えてもらう
        - DNSサーバーの冗長化とゾーン転送
            - 名前解決に失敗すると目的のWebサイトにアクセスできなくなるので、シングル構成ではなく、「プライマリDNSサーバー」と「セカンダリDNSサーバー」の冗長構成にする
            - キャッシュサーバーの冗長化
                - キャッシュサーバーはキャッシュしているだけなので、サーバー機能で冗長化する必要はない
                - DNSクライアント側の設定で、プライマリDNSサーバーとセカンダリDNSサーバーを指定しておく
            - 権威サーバーの冗長化
                - 自分が管理するドメインに関する情報（ゾーンファイル）を同期して、絶えず保持する必要がある
                - プライマリDNSサーバーとセカンダリDNSサーバー間でゾーンファイルを同期する処理のことを「ゾーン転送」という
                - 上位DNSサーバーにはプライマリDNSサーバーとセカンダリDNSサーバー、両方の情報を登録する
        - ゾーンファイルとリソースレコード
            - ひとつのゾーンファイルで管理するドメイン名の範囲のことを「ゾーン」といい、権威サーバーは、ゾーンファイルの情報をもとに、反復クエリに応答する
    - DNSのメッセージフォーマット
        - 名前解決はUDP（ポート番号: 53番）を使用し、処理速度を優先する
        - ゾーン転送はTCP（ポート番号: 53番）を使用して、信頼性を優先する
    - DNSを利用した機能
        - HTTPパケットやHTTPパケット、メールパケットの行き先を決定するDNSの役割を応用した拡張技術
        - DNSラウンドロビン
            - DNSを利用した負荷分散技術
            - 権威サーバーで、ひとつのドメイン名（FQDN）を複数のIPアドレスを登録しておくと、DNSクエリ（反復クエリ）を受け取るたびに、順番に異なるIPアドレスを返す
            - 負荷分散装置を用意しなくてもお手軽に負荷分散できるが、順番にIPアドレスを返すだけなので、耐障害性や柔軟性に乏しいという欠点がある
        - 広域負荷分散
            - 地理的に離れたサイト（場所）にあるサーバーに通信を振り分け、負荷分散する技術を「広域負荷分散（GSLB: Global Server Load Balancing）」という
            - 災害が発生したときに、別のサイトでサービスを提供し続ける災害対策として使用されることが多くなっている
        - CDN
            - CDN（Content Delivery Network）は、Webコンテンツを大量配信するために最適化されたインターネット上のサーバーネットワークのこと
## メール系プロトコル
- メール送信プロトコル
    - クライアントのリクエストに対してサーバーがリプライを返す、シンプルな「SMTP（Simple Mail Transfer Protocol）」を使う
    - SMTP
        - TCPの25番を使う
        - メールサーバーはメールソフトからメールを受け取ると、宛先メールアドレスの@より後のFQDNを見て、DNSサーバーにMXレコード（SMTPサーバーのIPアドレス）を問い合わせて、そのIPアドレスに対してメールを送信する
        - SMTPサーバーという郵便ポストに手紙を投函すると、あとはネットワークという郵便局が郵送してくれる
        - SMTPを使用するときには、認証機能や暗号化機能を持たせ、セキュリティレベルの向上を図る
        - 認証機能
            - SMTP認証
                - RFC4954「SMTP Service Extension For Authentication」で標準化されているユーザー認証機能で、TCPの587番を使用する
                - ユーザー名とパスワードでユーザーをチェックする
            - POP before SMTP
                - POPを利用したユーザー認証機能
                    - POPはメールを受信する前にユーザー認証をするので、それを応用する
                - 現在はほとんど利用されていない
            - 暗号化機能
                - 暗号化には「SMTPS（SMTP over SSL/TLS）」を使用する
                - SMTPSはお互いがSMTPSに対応していることを「STARTTLS」というSMTPの拡張機能を使用して確認しあう
- メール受信プロトコル
    - SMTPによって転送されたメールは、メールサーバーの「メールボックス」という名の私書箱に格納される
    - ユーザーはその私書箱から「POP3（Post Office Protocol version 3）」や「IMAP （Internet Message Access Protocol）」というプロトコルを使用して、自分のメールを取り出す
    - POP3
        - TCPの110番を使用して通信する
        - SMTPは、データを送信を送信したいときに送信する「プッシュ型」のプロトコルだが、POP3は必要なときにだけメールボックスのデータをダウンロードすr「プル型」のプロトコル
        - 暗号化機能
            - 暗号化に関する拡張機能には「APOP（Authentication Post Office Protocol）」と「POP3S（POP3 over SSL/TSL）」の2種類がある
            - APOPはハッシュ関数でパスワードだけを暗号化する機能なので、「ないよりはまし」くらいの一定のセキュリティ効果
            - POP3SはSSL/TSLで暗号化し、TCPの995番を使う
    - IMAP4
        - TCPの143番を使う
        - IMAP4はメールをメールサーバーに残したまま、メールソフトで閲覧する
        - 暗号化機能
            - POP3と同じように、SSL/TSLで暗号化した「IMAP4S（IMAP4 over SSL/TSL）」で拡張し、TCPの993番を使用してやりとりする
- Webメール
    1. Webブラウザを使用して、WebメールサーバーにHTTPSでアクセスし、ユーザーIDとパスワードで認証し、メール作成送信するとメールがHTTPSでPOSTされる
    1. WebメールサーバーはDNSで相手先を特定し、SMTPでメール送信する
    1. 相手先Webメールサーバーは受け取ったメールをユーザーのメールボックスに格納する
    1. 宛先メールアドレスのユーザーはHTTPでGETする
## 管理アクセスプロトコル
- 管理アクセスプロトコルとは
    - 遠隔（リモート）からネットワーク機器の情報を見たり、設定したりするときに使用するプロトコル
    - Telnetは暗号化しないのに対し、SSHは暗号化する
- Telnet
    - 数あるアプリケーションプロトコルの中でも、最も原始的、かつシンプルなプロトコル
    - アプリケーションヘッダー（L7ヘッダー）がなく、アプリケーションペイロード（L7ペイロード）に、コマンドやASCIIコードのテキストデータをそのまま格納する
    - TelnetはデフォルトでTCPの23番を使用するが、ポート番号を変更surことで、HTTP/1.1やSMTPなどのようなコマンド処理（HTTPのGETやPOSTなど）を実行できる
    - すべてのデータが平文（プレーンテキスト）でやりとりされるので、盗聴できてしまう
    - 最近では管理アクセスというより、トランスポート層レベルのトラブルシューティングで使用されることの方が多い
    - Telnetを使用したトラブルシューティング
        - トラブルシューティングのほとんどがpingから始まり、応答があると、トランスポート層レベルの疎通確認に移る
        - ポート番号を変更してTelnet接続を試みることによって、3ウェイハンドシェイクが確立できるかどうか、TCPレベルの疎通確認を行うことができる
- SSH
    - デフォルトでTCPの22番を使用する
    - Telnetに暗号化や公開鍵認証、メッセージ認証などパワーアップさせたのがSSH
    - 3ウェイハンドシェイクでTCPコネクションをオープンする
        1. パラメータの交換
            - 対応しているバージョンや暗号化方式など各種パラメータをリストで交換する
        1. 鍵共有
            - DH（ディフィー・ヘルマン）鍵共有で公開鍵を交換し、データの暗号化に使用する共通鍵を共有する
        1. ユーザー認証
            - 接続してきているのが本当に正しいユーザーか、「パスワード認証」や「公開鍵認証」でサーバーが確認する
            - 公開鍵認証では、あらかじめ、クライアントは秘密鍵と公開鍵のペア、サーバーはそのユーザーの公開鍵を持っている
            - サーバーはクライアントから接続要求を受け取ると、乱数を生成し、公開鍵で暗号化して送信する
            - クライアントはそれを秘密鍵で復号し、乱数を取り出し、ハッシュ値にして返信する
            - ハッシュ値を受け取ったサーバーは、自分でも乱数からハッシュ値を計算し、同じ値だったら認証成功と判断する
        1. ログイン
            - ログイン完了し、コマンド実行できるようになる
    - ファイル転送
        - SSHを利用したファイル転送機能には、シンプルで軽快な「SCP（Secure CoPy）」と、いろいろな機能を持った「SFTP（SSH File Transfer Protocol）」の2種類がある
    - ポートフォワーディング
        - 特定のポート番号に対する通信を、SSHで作った暗号化通信路を使用して、別の端末に転送する機能
        - 踏み台サーバーでログイン経路を一本化する
        - 踏み台サーバー経由で、管理対象の負荷分散装置にHTTPSでログインする場合の例
            1. SSHクライアントから踏み台サーバー（SSHサーバー）に対して、SSH（TCP/22番）でログインして、暗号化通信路を作る
            1. SSHクライアントでポートフォワーディングを設定する
                - 「TCPの何番（ローカルポート）のパケットを、このIPアドレス（リモートアドレス）に、TCPの何番を転送してください」と設定する
                    - 自分自身（localhost、126.0.0.1、::1）でローカルポートがListenされるようになる
                    - 「TCPの10443番のパケットを、負荷分散装置に、TCPの443番で転送してください」
            1. 自分自身のローカルポートにアクセスする
                - Webブラウザで「https://localhost:10443/」にアクセスする
                - 自分自身のTCP/10443番にHTTPSのパケットが送り込まれ、それをSSHクライアントがピックアップする
            1. SSHクライアントは、[1]で作った暗号化通信路を使用して、踏み台サーバーにSSH（TCP/22番）でパケットを転送する
            1. 踏み台サーバーは、リモートアドレス（負荷分散装置）のリモートポート（TCP/443番）に対してパケットを転送する。これで踏み台サーバー経由で、負荷分散装置にHTTPSでログインできる
## 運用管理プロトコル
- 「運用管理プロトコル」は、ネットワークやサーバーをより円滑に運用・管理していくためのプロトコル
- NTP
    - 「NTP（Network Time Protocol）」、ネットワーク機器やサーバーの時刻を合わせるために使用するプロトコル
        - どの機器で、何時何分何秒に何が起きたのかという流れを整理するのに時刻要素は欠かせない
        - NTPクライアントが「今、何時ですかー？」とUDPの123番で問い合わせ（NTP Query）、NTPサーバーが「〇〇時〇〇分〇〇秒ですよー！」と返す（NTP Reply)
        - NTPの階層構造
            - NTPは「Stratum（ストレイタム）」という値を用いた階層構造になっている
- SNMP
    - 「SNMP（Simple Network Management Protocol）」は、ネットワーク機器やサーバーの性能監視や障害監視で使用するプロトコル
    - SNMPのバージョン
        - 「v1」「v2c」「v3」という3つのバージョンがある
    - SNMPマネージャーとSNMPエージェント
        - SNMPの構成要素は、管理する「SNMPマネージャー」と、管理される「SNMPエージェント」のふたつ
        - SNMPマネージャーは、SNMPエージェントが持っている管理情報を収集・監視するアプリケーション
        - SNMPエージェントは、「OID（Object Identifier）」という数値で識別されるオブジェクトを「MIB（Managemant Information Base）」という階層上のデータベースで保持している
    - 3つの動作
        - SNMPはUDPを使用していて、「Get Request」「GetNextRequest」「SetRequest」「GetResponse」「Trap」という5種類のメッセージを組み合わせ、「SNMP Get」「SNMP Set」「SNMP Trap」という3種類の動作を実現している
            - いずれも「コミュニティ名」という合言葉が一致して、初めて通信が成り立つ
        - SNMP Get
            - 機器の情報を取得する動作
                - 「〇〇の情報をください！」という問い合わせに対して、「〇〇ですよ！」と応答するシンプルなもの
                - GetRequestはUDPのユニキャストで、ポート番号は「161」
        - SNMP Set
            - 機器の情報を更新する動作
                - 「〇〇の情報を更新してください！」という要求に、「できました！」と応答する
                    - ネットワーク機器やサーバーのポートのシャットダウンなど
                - SetRequestはSNMP Getと同様、UDPのユニキャストで、ポート番号は「161」
        - SNMP Trap
            - 障害を通知する動作
                - 「〇〇で障害が発生しました！」とエージェントから送信される
                - Trapだけはエージェント発の通信で、UDPのユニキャストでポート番号は「162」
- Syslog
    - 「Syslog」は、ネットワーク機器やサーバーのログを転送するために使用されるプロトコル
        - ネットワーク機器が一定期間保存しているイベントログをSyslogサーバーに対して転送し、ログの一元化を図る
    - Facility
        - ログメッセージの種類を表す
    - Severity
        - ログメッセージの重要度を表す値
            - 0〜7の8段階で構成されている
- 隣接機器発見プロトコル
    - 「どのポートに、どんな機器が、どのように接続されているか」の情報をやりとりするプロトコル
        - 隣接機器発見プロトコルには「CDP（Cisco Discovery Protocol）」と「LLDP（Link Layer Discovery Protocol）」の2種類があり、それぞれに互換性はない
## 冗長化プロトコル
- どこかが故障して障害が発生しても、即座に別経路を確保し、継続してサービスを提供できるように冗長化を図る
- 物理層の冗長化技術
    - リンクアグリゲーション
        - 複数の物理リンクをひとつの論理リンクにまとめる技術を、「リンクアグリゲーション（LAG、ラグ）」という
        - リンクアグリゲーションは、スイッチのポート（物理ポート）のいくつかを論理ポートとしてグループ化し、隣接スイッチの論理ポートと接続することで、論理リンクを作る
        - 通常時は論理リンクに含まれるすべての物理リンクでフレーム転送を行い、リンク障害が起きた時には、即座に障害リンクを切り離し、縮退しながらフレームを転送し続ける
            - ダウンタイムはpingレベルで1秒程度なのでアプリケーションレベルの通信には、ほとんど影響しない
    - チーミング
        - 複数の物理NICをひとつの論理NICにまとめる技術
        - 物理環境におけるチーミング
            - OSの標準機能で実装する
            - 一般的に使用することが多いのは「フォールトトレランス」「ロードバランシング」「リンクアグリゲーション」の3種類
        - 仮想化環境におけるチーミング
            - 仮想化されたサーバーやネットワーク機器（仮想マシン）は、仮想化ソフトウェア上で動作する仮想スイッチに接続し、それに紐づく物理NIC経由でネットワークに接続する
    - スタック技術
        - 複数のスイッチを「スタックケーブル」と呼ばれる特殊なケーブルや広帯域のLANケーブルで接続し、ひとつの論理機器にまとめる技術のことを「スタック技術」という
- データリンク層の冗長化技術
    - データリンク層の冗長化は、「STP（Spanning-Tree Protocol）」で実現する
        - STPは、物理的にループしているネットワークのどこかのポートをブロックして、論理的なツリー構成を作るプロトコル
        - 隣接スイッチ間で「BPDU（Bridge Protocol Data Unit）」という特殊なイーサネットフレームをやりとりして、ツリー構成の根っことなる「ルートブリッジ」と、パケットを流さない「ブロッキングポート」を決定する
        - パケットが流れる経路のどこかで障害が発生すると、ブロッキングポートを開放し、迂回経路を確保する
        - 「n秒待ったら◯をして、m秒待ったら△をする」という時間のかかる「STP」と、「◯が起きたら□をして、□をしたら△をする」というどんどん処理を行う「RSTP（Rapid STP）」、RSTPが片方の経路にトラフィックが偏るのを補う、「インスタンスごとにルートブリッジとブロッキングポートを作る」という「MSTP（Multiple STP）」がある
        - ループ防止プロトコル
            - 最近はSTPを冗長化プロトコルとしてではなく、「ブリッジグループ」を防止するループ防止プロトコルとして使用する
            - ブリッジングループ
                - イーサネットフレームが経路上をぐるぐる回る現象
                    - 「L2ループ」や「ループ」ともいう
            - BPDUガード
                - ブリッジングループは、IPヘッダーにあるようなTTL（Time To Live）の概念がないイーサネットを使用しているかぎり、避けては通れない大きな問題
                - 予防策のひとつが「BPDUガード」
- ネットワーク層の冗長化技術
    - ネットワーク層の冗長化は「FHRP（First Hop Redundancy Protocol）」を使用する
    - FHTPは、サーバーやPCのファーストホップ、つまりデフォルトゲートウェイを冗長化する時に使用するプロトコル
        - 複数のデフォルトゲートウェイを、ひとつの仮想的なデフォルトゲートウェイように動作させることによって冗長化を図る
        - 共有するIPアドレス（仮想IPアドレス）を持って、生死監視をしあい、プライオリティが高いアクティブなルーターがARP Requestに応答しパケット処理する
    - トラッキング
        - アクティブ機とスタンバイ機は、生死監視パケットに含まれるプライオリティによって決まる
        - FHRPは特定のオブジェクト（インターフェースやping疎通など）の状態を監視し、障害と判定したらプライオリティを下げる「トラッキング」という機能を備えている
    - ファイアウォールの冗長化技術
        - FHRPと大きく変わらないが、違うのは「同期技術」
            - ファイアウォールの冗長化技術は、アクティブ機が処理したコネクションの情報をスタンバイ機
    - 負荷分散装置の冗長化技術
        - 負荷分散装置の冗長化技術はファイアウォールと同期の範囲が異なる
            - パーシステンス情報やコンテンツそのものをスタンバイ機に同期する
                - 帯域を消費しやすい
## ALGプロトコル
- SSHはTCP/22番、HTTPSはTCP/443番というように、普通は同じポート番号を使い続けて通信する
    - ポートを動的に決定し、途中からポート番号を切り替えて通信するプロトコルもある
        - 「ALG（Application Level Gateway）プロトコル」
        - 対応するにはALG機能が必要
- FTP
    - 「FTP（File Transfer Protocol）」はファイル転送用のアプリケーションプロトコル
    - FTPは「コントロールコネクション」と「データコネクション」というふたつのコネクションを組み合わせて使用する
    - 「アクティブモード」と「パッシブモード」というふたつの転送モードがある
        - アクティブモードは、サーバーからクライアントに対して、送信元ポートにTCP/20番でデータコネクションを作る
        - パッシブモードは、クライアントからサーバーに対してデータコネクションを作る
- TFTP
    - 「TFTP（Trivial File Transfer Protocol）」は、UDPでファイルを転送するためのプロトコル
    - 認証機能も暗号化機能もないため、ネットワーク機器のファームウェアのバージョンアップなどの特定用途で使われる
- SIP
    - 「SIP（Session Initiation Protocol）」は、IP電話の呼制御を行うプロトコル
        - IP電話はSIPでSIPサーバーに電話をかけ、「RTP（Real-time Transport Protocol）」という別のプロトコルで相手とピアツーピアで音声や動画をやりとりする