【技術書まとめ】マスタリングTCP/IP　入門編（第6版）

# 第1章 ネットワーク基礎知識
- コンピュータとネットワークの発展
    - カードに記述されたプログラムを大型コンピュータがバッチ処理する時代
    - BASIC言語を使ってタイムシェアリング(TSS)でネットワークで繋がったホストコンピュータを操作する時代
    - コンピュータとコンピュータ間で通信する1970年代
    - コンピュータネットワークとウィンドウシステムが登場する1980年代
    - 異機種の機器接続のためにインターネットの通信技術が普及した1990年代
    - ボイラー制御システムなどでもIPプロトコルが使われるインターネット技術中心の時代
- プロトコルとは
    - コンピュータとコンピュータがネットワークを利用して通信するために決められた「約束ごと」
        - メーカーやCPUやOSが違っても互いに通信できる
    - 最初は独自規格ばかりで通信できなかったが互換性が強く望まれてプロトコルが標準化された
        - よく引き合いに出されるOSI参照モデルはISO
        - TCP/IPはIETF(Internet Engineering Task Force)という大学などの研究機関とコンピュータ業界が中心となって標準化した
    - OSI参照モデル
        - 階層に分けて単純化し拡張性や柔軟性を持たせた
            - 下位層から特定のサービスを受けて上位層に特定のサービスを提供する
                - 層の間でサービスのやり取りをするときの約束ごとを「インタフェース」と呼ぶ
                - 通信相手の同じ階層とやり取りするときの約束ごとを「プロトコル」と呼ぶ
        - 7つの階層はあくまでもモデルであり、各層のおおまかな役割を決めているだけのガイドライン
            - おおよその役割はこの階層モデルのどの層にあたるかで見当をつけられる
            - 「アプリケーション層によって書き込まれたデータが、プレゼンテーション層によって符合化され、セッション層で交わした手順を利用してデータが送信される。実際にデータを送信するのはトランスポート層以下で、トランスポート層がデータがきちんと届いたか確認再送したりし、ネットワーク層がエンドツーエンドで最終目的地までの通信を実現する。データリンク層は物理的な機器同士でのやり取りを可能にして、物理層ではデータの0や1を電圧やパルスに変換する」
            - コネクション型のTCPとコネクションレス型のイーサネット・IP・UDP
- なぜパケットで送るのか
    - 最初は電話回線のような回線交換だったが、占有利用なので終わるまで待つ必要があった
        - パケットに分けて転送の順番待ち行列に並べる方法が考え出された
            - 各コンピュータが一斉にデータを送受信できるようになった
                - パケット交換機（ルーター）によって通信回線が結ばれる
- 通信方式の種類
    - ユニキャストは電話のような1対1
    - ブロードキャストはテレビ放送のような一斉同報
    - マルチキャストはビデオ会議
    - エニーキャストは「誰か一人が答えて！」という問いかけ
- MACアドレスは製造者識別子、製品番号、通番があるがどのネットワークインタフェースカードが世界中のどこで使われているか特定できないため、組織やプロバイダや地域などの階層性のあるIPアドレスが必要になるとも言える
- ネットワーク機器
    - リピーター
        - ネットワークを物理層で延長するリピーターハブなどの装置
    - ブリッジ/レイヤ２スイッチ
        - ネットワークをデータリンク層で延長するスイッチングハブなどの装置
        - FCS（フレームチェックシーケンス）でフレーム（パケット）が壊れていないか検査する
    - ルーター/レイヤ3スイッチ
        - ネットワーク層のIPアドレスによってパケットを転送するルーターなどの装置
    - レイヤ4-7スイッチ
        - トランスポート層より上の情報でトラフィックを処理するロードバランサーなどの装置
    - ゲートウェイ
        - プロトコルの変換をする装置
# 第2章 TCP/IP基礎知識
- なぜTCP/IPをサポートするようになったのか
    - 軍事通信中にネットワークの一部が敵の攻撃で破壊されても、迂回経路を通してデータが配送されて通信が停止しないネットワークが必要になった1960年代
    - ARPANETというUCLA、UCSB、SRI、ユタ大学の4つのノードを繋いだネットワークがパケット交換によるインターネットの起源となった
    - 1970年代前半にTCP/IPが開発される
    - 1980年前後のBSD UNIXにTCP/IPが実装されTCP/IPネットワークの構築が盛んになった
    - 1990年代になると企業や一般家庭にインターネット接続サービスが普及した
- TCP/IPとはTCPとIPだけでなくインターネットを構築する上で必要なプロトコルのセットのような概念となっている
- TCP/IP標準化の精神
    - TCP/IPはIETP(Internet Engineering Task Force)の誰にでもオープンなメーリングリストで行われる
        - RFC(Request For Comments)というドキュメントが作られる
            - IPの仕様はRFC791で、TCPの仕様はRFC793で決められている
            - 変化しない主要なプロトコルや標準にはSTDをつけることにした
    - プロトコルは実装を念頭におきながら仕様が決められる
        - OSIが広まらなかったのは実装が遅かったのと改良の仕組みがなかったことが原因
    - 標準化の流れ
        - 標準化作業はRFC2026に定義されている
            - 仕様を煮詰めるインターネットドラフト(I-D: Internet-Draft)
                - 実装やシミュレーション、運用実験とともにメーリングリストで議論される
                - 有効期間は6ヶ月
                    - 変更を反映するか、無意味なI-Dを自動的に消去する
            - 認められるとRFCとなり、提案標準(Proposed Standard)となる
                - IETFの主要メンバーから構成されるIESG(IETF Engineering Steering Group)からの承認
            - 標準の草案であるドラフト標準となる
                - 提案標準が多くの機器で実装され広く運用され、IESGに承認されるとドラフト標準となる
                    - 実際の運用で問題があればドラフト標準になる前に修正される
                        - 修正作業もインターネットドラフトで行われる
            - 最後に標準(Standard)となる
                - さらに多くの機器で実装利用され、「実用性が十分にあって問題がない」と多くの人に考えられ、IESGによって承認が得られると標準となる
        - 標準を決めてから普及させる団体とは根本的に考え方が違う
            - 標準になったときにはすでに十分に普及しているから
                - 時代に先行するためにはドラフトを実装したりすぐに切り替えられるようにサポート体制が必要
- インターネットとは、異なる組織がIX(Internet Exchange)によって相互に接続された巨大なネットワークである
- TCP/IPとOSI参照モデル
    - OSI参照モデルは「通信プロトコルに必要な機能は何か」を中心にモデル化されている
    - TCP/IPは「プロトコルをコンピュータに実装するにはどのようにプログラミングしたらよいか」を中心にモデル化されている
    - ハードウェア（物理層）はイーサネットや電話や無線でもなんでもいい
    - ネットワークインターフェイス層（データリンク層）は、OSとハードウェアの橋渡しをするデバイスドライバと考えていい
    - インターネット層（ネットワーク層）はIPが使われる
        - IP(Internet Protocol)
            - ネットワークをまたいでパケットを配送し、インターネット全体にパケットを送り届けるためのプロトコル
            - パケットが届かなかった時の再送などは行わないので信頼性はない
        - ICMP(Internet Control Message Protocol)
            - IPでパケット配送中のエラーを知らせるためのプロトコルで、ネットワーク診断などにも利用される
        - ARP(Address Resolution Protocol)
            - パケットの送り先のMACアドレスをIPアドレスから取得するプロトコル
    - トランスポート層
        - TCP(Transmission Control Protocol)
            - コネクション型で信頼性がある
                - コネクションの確率/切断だけで制御用パケットを約7回もやり取りするので用途によっては無駄が多い
                    - ビデオ会議の音声・画像データなどの一定間隔で決められた量を転送する通信にはあまり向いていない
        - UDP(User Datagram Protocol)
            - コネクションレス型で信頼性はない
                - パケット数が少ない通信や、ブロードキャストやマルチキャスト通信、ビデオや音声などのマルチメディア通信に向いている
    - アプリケーション層（セッション層以上の上位層）
        - OSI参照モデルのセッション層、プレゼンテーション層、アプリケーション層
- パケットヘッダ
    - ヘッダの構造は細かいところまで明確に決められている
        - 上位プロトコル識別フィールドがどこに位置していて、何ビットのフィールドを持っているかなど
        - 双方のコンピュータでプロトコル識別信号やチェックサムの計算方法が違えば、まったく通信できなくなる
- TCP/IPによるメールの送受信処理
    1. アプリケーション層で`ISO-2022-JP`や`UTF-8`などで符号化され、TCPコネクションの確立を指示する。
    1. TCPモジュールがコネクションを確立する。アプリケーション識別のためのポート番号、シーケンス番号、チェックサムなどのTCPヘッダが付けられる。
    1. IPモジュールがIPヘッダを付ける。ルーティングテーブルを参照して次に受け渡すルーターやホストを決定する。MACアドレスはARPで調べる。
    1. イーサネットドライバが宛先MACアドレスと送信元MACアドレスをヘッダとして付けて、データのプロトコルを示すイーサネットタイプを書き込む。送信処理中はFCSがハードウェアで計算されパケットの最後につけられる。
    1. パケットを受け取ったホストはMACアドレスを調べ、自分宛であれば受け取る。自分宛でないときは捨てる。ネットワークのパケットモニタリングをするときは捨てないように設定する。プロトコルがIPであればIP担当部分に渡し、ARPなどであればその担当部分に渡す。処理できないプロトコル値であれば捨てる。
    1. 宛先IPアドレスが自分宛であればそのまま受信して上位層のプロトコルを調べる。自分宛でない場合は、経路制御表から次に送るホストやルーターを調べて転送処理する。
    1. TCPはチェックサムを計算してデータが破損していないか確認する。ポート番号を調べて通信しているアプリケーションを特定する。「確認応答」を送信ホストに返す。確認応答が送信ホストに届かない時は、送信ホストは確認応答が返ってくるまでデータを繰り返し送信する。受信できたらアプリケーションプログラムにデータをそのまま渡す。
    1. アプリケーションが受信しメッセージなどを無事に格納できたら、処理が正常で終了したことを送信元アプリケーションに伝える。受け取ったデータがディスプレイなどに表示される。
# 第３章 データリンク
- TCP/IPではOSI参照モデルのデータリンク層以下（データリンク層と物理層）を定義していない
    - 透過的に機能していることを前提としている
- データリンク層の通信媒体
    - より対線、同軸ケーブル、光ファイバー、電波、赤外線など
    - スイッチ、ブリッジ、リピーターが中継する
- データリンクの技術
    - MACアドレスはネットワークインターフェイスカード(NIC)のROMに焼き込まれている
    - 媒体共有型のネットワーク
        - コンテンション方式（CSMA/CD）
        - トークンパッシング方式
    - 媒体非共有型のネットワーク
        - イーサネットスイッチなどで構築する
    - より対線では通常8本(4ペア)の芯線が外皮に包まれ、全二重通信ができる
    - スイッチの転送表は自動的に生成される
- イーサネット
    - ほかのデータリンクと比べて制御の仕組みが単純だったため普及した
        - 全二重通信前は衝突検知によって高速化が難しいとされていたが、スイッチ技術の進歩などでその障壁も無くなった
            - IEEE802がLANの標準化を進めている。802は1980/02から。
    - プリアンプルとSFD（スタートフレームデリミタ）は合わせて8オクテット
        - 1オクテットは8ビット
            - ビットは2進数表示を行なった時の最小単位で0と１で表現される
    - イーサネットのフレーム本体のフォーマット
    - FCSにはフレーム全体を特定のビット列（生成多項式）で割った余りを格納する
- 無線通信
    - IEEE802.11
        - 無線LANは媒体共有型ネットワークで、CSMA/CDに似たCSMA/CAというアクセス制御方式を採用している
- PPP(Point-to-Point Protocol)
    - 物理層を含まない純粋なデータリンク層
        - 電話回線やISDN、専用線、ADSL、ケーブルテレビなど物理層を選ばない
    - PPPoE
- ATM
- FTTH(Fiber To The Home)
- VPN(Virtual Private Network)
# 第４章 IP(Internet Protocol)
- IPはパケットを目的のコンピュータまで届けるという、TCP/IPでもっとも重要な役割を持つ
- TCP/IPのインターネット層はIPとICMP(Internet Control Message Protocol)の2つのプロトコルで構成されている
    - OSI参照モデルでは第３層のネットワーク層
        - 終点ノード間の通信を実現する
            - データリンク層とネットワーク層が協力する
            - 通信経路であるデータリンクの違いを無視して、その間の連携をとりながらパケットを配送する
                - データリンク層の機器はIPパケットを単なる0や1のビット列として伝達できる
            - 旅行会社が作ってくれた行程表と、電車や飛行機やバスの切符、この二つが揃って初めて目的地までデータを届けられる
- IPアドレス、終点ホストまでのルーティング、IPパケットの分割処理と再構築処理の3つの役割がある
    - IPアドレスとは
        - ネットワーク層はIPアドレスによって「ネットワークに接続されているすべてのホストの中から、通信を行う宛先を識別する」
            - データリンク層ではイーサネットならMACアドレスで識別する
        - 32ビットの正整数値だが人間には読みにくいので8ビットずつの4つの組みに分けて10進数で表現した
            - 43億通りあるが世界の総人口よりも少ない
                - NAT技術により解決された
            - NICに1つのIPアドレスを割り当てる
        - ネットワーク部とホスト部から構成される
            - ホスト部のすべてのビットが0というアドレスはネットワークアドレスを表したり、IPアドレスが分からない時に利用する
                - すべてのビットが1のアドレスはブロードキャストアドレスとして使われる
        - ブロードキャストアドレス
            - 同一リンクに接続されたすべてのホストにパケットを送信するためのアドレス
                - 172.20.0.0/16なら172.20.255.255
        - IPマルチキャスト
            - 先頭から4ビットまでが「1110」であればマルチキャストアドレスとして認識される
        - サブネットマスク
            - クラスごとに決まるホスト部をサブネットワークアドレス部として使い、複数の物理ネットワークに分割できるようにした
        - CIDR
            - 連続する複数のクラスアドレスを1つの大きなネットワークとして扱える
        - プライベートIPアドレス
            - NATを使ってグローバルアドレスで通信できるようになった
            - IPv4のグローバルIPアドレスが枯渇した現代は、工夫してIPv4とNATを使ってなんとか間に合わせて運用している
        - グローバルIPアドレスはICANNで一元管理されている
            - 日本ではJPNIC
            - FTTHやADSLではプロバイダが管理しているIPアドレスを自動的に割り当てられることもある
    - 経路情報（ルーティング)とは
        - ホストやルーターは必ずルーティングテーブルを持っている
            - 事前に設定するスタティックルーティング
            - ルーター同士で情報交換するダイナミックルーティング
        - デフォルトルート
            - 経路制御表のどのアドレスにもマッチしない場合の経路
                - `0.0.0.0/0`または`default`
        - ホストルート
            - `192.168.153.15/32`などの`IPアドレス/32`となるアドレス
        - ループバックアドレス
            - 同じコンピュータ内部のプログラム間で通信したい場合に利用する
                - `127.0.0.1`や`localhost`
                - パケットはネットワークには流れない
        - ルーティングテーブルを集約する
    - IPの分割処理（フラグメンテーション）と再構築処理
        - データリンクによって最大転送単位(MTU）が違うことを抽象化する
        - 再構築処理は終点の宛先ホストでだけ行われる
            - 分割したIPデータグラムが同じ経路で届く保証はない
            - 途中で断片が失われることもある
        - 経路MTU探索
    - IPv6
        - IPv4アドレスは4オクテット長、IPv６アドレスは4倍の16オクテット長
            - 128ビットを16ビットごとにコロンで区切って16進数で表記する
        - グローバルユニキャストアドレス
            - 全世界で一意に決まるアドレス
    - IPv4ヘッダ
        - バージョン
            - IPv4なら4
        - ヘッダ長（IHL: Internet Header Length）
            - 4ビットで構成され、ヘッダ自体の大きさをここで表す
        - DSCPフィールド、ECNフィールド
            - DSCPはDiffServと呼ばれる品質制御で利用される
            - ECNはネットワークがふくそうしていることを通知する
        - サービスタイプ(TOS: Type Of Service)
            - ここで優先度を表示する予定だったが実装何度や不正可能性などで今はDSCP,ECNフィールドとして利用されている
        - パケット長
            - 全体のオクテット長
        - 識別子（ID: Identification）
            - フラグメントを復元する際の識別子として使われる
        - フラグ(Flags）
            - パケットの分割に関する制御を指示する
        - フラグメントオフセット（FO: Fragment Offset）
            - 分割されたフラグメントがオリジナルデータのどこに位置していたか示す
        - 生存期間（TTL: Time To Live）
            - 実際のインターネットでは何個のルーターを中継してもよいかという意味で使われる
        - プロトコル
            - IPヘッダの次のヘッダのプロトコルが何であるかを示す
        - ヘッダチェックサム
            - IPヘッダが壊れていないことを保証する
        - オプション
            - テストやデバッグなどのときに使う
        - パディング
            - ヘッダ長が32ビットの整数倍にならないときに「0」を詰める
    - IPv6ヘッダ
        - バージョン
            - IPv6なので6
        - トラフィッククラス
            - IPv4のTOSにあたるフィールド
                - 削除予定だったが今後の研究に期待する形で復活した
        - フローラベル
            - 品質制御に利用されることを想定したフィールド
        - ペイロード長
            - IPv6のヘッダを除いたデータ部分の長さ
                - IPv4ではヘッダの長さも含まれている
        - 次のヘッダ（Next Header）
            - IPv4のプロトコルフィールドにあたる
        - ホップリミット（Hop Limit）
            - 通過できるルーターの数を制限するという意味を明確にするために名付けられた
    - ルーティング
        - ホップバイホップルーティングによって1区間ごとに次のルートが決定される
                - この「行き当たりばったり」を英語ではad hoc（アドホック）という
                - ルーティングテーブル
            - IPパケットが荷物でデータリンクがトラック
    - IPパケットの分割処理と再構築処理
        - データリンクごとに最大転送単位であるMTU(Maximum Transmission Unit)が違う
            - IPが分割処理（フラグメンテーション）をして大きなIPパケットを小さなIPパケットに分割する
                - IPの上位層から見ると、途中のデータリンクのMTUにかかわらず、送信要求した長さのままパケットが届く
                    - データリンクが抽象化されている
    - IPは機能の簡略化と高速化のためコネクションレス型
        - 相手を確認せず送るし、実際届いたかどうかの保証はない
            - 信頼性の高いコネクション型ならTCP
        - 通信に必要な機能を階層化することで実装しやすくした
# 第５章 IPに関する技術
- IPだけでは通信はできない
    - 補助したり拡張したりする仕組みが必要
        - DNS, ARP, ICMP, DHCPなど
- DNS（Domain Name System）
    - ローマ字とピリオドを使った名前からIPアドレスに自動的に変換してくれる
    - 人間にとってIPアドレスを覚えるのは大変
        - 昔はコンピュータにホスト名をつけて、それを入力して通信していた
            - IPアドレスに自動変換するため`hosts`というデータベースファイルを利用していた
                - 名前と電話番号の対応が書いてある電話帳のようなもの
                - ARPANETでは当初はhostsファイルを一括管理していた
                    - 定期的にダウンロードして運用していた
        - ホストを管理している組織がデータの設定や変更をできるDNSが考え出された
    - ドメイン名
        - ホストの名前や組織の名前を識別するための階層的な名前
            - 階層的なドメイン名なら各組織単位で自由にホスト名を付けられる
            - 会社組織のような木構造
    - ネームサーバー
        - ドメイン名を管理しているホストやソフトウェア
        - 負荷分散のために1つのドメイン名に複数のIPアドレスを割り当てるのは「ラウンドロビンDNS」と呼ばれる
    - DNSの問い合わせの流れ
        - リゾルバやネームサーバーは新たに知った情報をしばらくキャッシュする
    - DNSはインターネットに広がる分散データベース
        - さまざまな情報を管理している
- ARP（Address Resolution Protocol）
    - ARPは宛先IPアドレスを手がかりにして、次の機器のMACアドレスを見つけるためのプロトコル
        - IPv4のみで利用され、IPv6では代わりにICMPv6のキリン探索メッセージが利用される
    - ARPの仕組み
        - ARP要求パケットとARP応答パケットを使う
            - ARP要求パケットは同一セグメント上のすべてのホストやルーターにブロードキャストされる
            - 目的のIPアドレスが自分のIPアドレスに該当する場合は、MACアドレスを埋めてARP応答パケットを返送する
            - IPアドレスとMACアドレスの関係（ARPテーブル）は数分間キャッシュされる
            - これでTCP/IPで通信するときにMACアドレスを意識する必要がなくなる
            - MACアドレスとIPアドレスの役割の違い
                - MACアドレスとARPの仕組みで、別リンクのホストにパケット配送できるようになる
                - IPアドレスはネットワーク部が位置情報として働き、アドレスの集約ができる
    - RARP（Reverse Address Resolution Protocol）
        - MACアドレスからIPアドレスを知りたい場合に使われる
            - DHCPに対応していなかったり、IPアドレスを入力するインターフェースがない組み込み機器など
- ICMP(Internet Control Message Protocol）
    - IPパケットが何らかの障害によって到達できなかった時に、ICMPを使って障害の通知が行われる
    - 主なICMPメッセージ
        - ICMP到達不可メッセージ（タイプ3)
        - ICMPリダイレクトメッセージ（タイプ5）
        - ICMP時間超過メッセージ（タイプ11）
            - TTLが0になるとIPデータグラムは破棄されて、このメッセージが送られる
            - `traceroute`
        - ICMPエコーメッセージ
            - `ping`で利用される
        - ICMPルーター探索メッセージ（タイプ9、10）
            - 自分がつながっているネットワークのルーターを見つけたいときに利用される
        - ICMP拡張エコーメッセージ（タイプ42、43）
            - `ping`よりも便利な機能を実現するために定義された
    - ICMPv6
        - IPv6はICMPv6がなければ通信できない
            - MACアドレスを調べる方法がARPからICMPの近隣探索メッセージに変更されたから
                - ARPはブロードキャストのためARP対応
- DHCP（Dynamic Host Configuration Protocol）
    - IPアドレスの設定を自動化したり、配布するIPアドレスの一括管理を行う
        - コンピュータをネットワークに接続しただけでTCP/IPによる通信ができる
            - ラップトップ型PCやスマートフォンを持ち歩く時など
    - DHCPの仕組み
        - そのセグメントのルーターがDHCPサーバーになることも多い
            - DHCPクライアントのIPアドレスは決まってないので、DHCP発見パケットの宛先アドレスはブロードキャストアドレスの`255.255.255.255`で、送信元アドレスは「分からない」という意味の`0.0.0.0`を送信する
        - 割り当てるIPアドレスの重複をさける仕組み
            - DHCPサーバーではICMPエコー要求パケットを送信して、返事がこないことを確認する
            - DHCPクライアントはDHCPサーバーから配布されたIPアドレスに対してARP要求パケットを送信し、応答がこないことを確認する
    - DHCPリレーエージェント
        - 複数の異なるセグメントのIPアドレスの割り当てを1つのDHCPサーバーで管理・運用できる
        - それぞれのセグメントにDHCPサーバーを置く代わりに、DHCPリレーエージェントを設置する
            - セグメントごとに配布するIPアドレスの範囲を指定する
        - DHCP要求パケットなどのブロードキャストパケットを受信すると、ユニキャストパケットにしてDHCPサーバーに転送する
- NAT（Network Address Translator）
    - ポート番号も付け替えるNAPT（Network Address Ports translator）で1つのグローバルIPアドレスで複数のホスト間の通信もできるようになった
        - モバイルルーターやスマホのテザリング
        - 変換テーブルはTCPコネクション確立のSYNパケットが流れたときに作られ、FINパケットが流れた時に消去される
    - IPアドレスを含めてチェックサムが作られるため、TCPやUDPのヘッダの変更も必要になる
    - NAT64/DNS64
        - DNSとNATが連携してIPv6環境からIPv4環境への通信を実現する
    - CGN（Carrier Grade NAT）
        - ISPレベルでNATを行い、顧客にプライベートIPv4アドレスを配布する技術
            - CGNを使わない場合は、ISPは顧客に対してグローバルIPv4アドレスを1つずつ割り当てないといけない
# 第６章 TCPとUDP
- TCP(Transmission Control Protocol)とUDP(User Datagram Protocol)
    - TCP
        - コネクション型、信頼性のあるストリーム型のプロトコル
            - 水道の蛇口から出る水
                - 順序制御、再送制御、フロー制御（流量制御）、ネットワーク混雑に合わせたふくそう制御がある
        - 信頼性が必要な通信や、遅れて再生されても問題ない片方向通信にも用いられる
    - UDP
        - コネクションレス型、信頼性のないデータグラム型のプロトコル
        - ふくそう制御や再送制御がない
        - マルチキャストやブロードキャスト、双方向通信に用いられる
            - 一時的に乱れても問題ない、あるいは「聞き直す」という人間レベルの再送制御でIPパケットの喪失を補うことができる
- IPには信頼性がないがTCPは信頼性を提供する
    - 第５層以上は安心して下位層に通信処理を任せられる
- 郵便物にたとえると、郵便配達員(IP)は宛先の住所(宛先IPアドレス)を参照して、目的の家(コンピュータ)に郵便物(IPデータグラム)を配達する。届いたら、家の人(トランスポートプロトコル)が宛名を見て、誰宛(プログラム)かを判断する
    - ポート番号は宛名の氏名にあたる
- ソケット
- ポート番号
    - データリンクにはMACアドレス、IPにはIPアドレス、トランスポートプロトコルにはポート番号というアドレスのようなものがある
        - プログラムのアドレス
        - 「宛先IPアドレス」「送信元IPアドレス」「宛先ポート番号」「送信元ポート番号」「プロトコル番号」　の5つの識別子で通信を区別する
            - データがIP層に到着すると、IPヘッダのプロトコル番号がチェックされ、それぞれのプロトコルのモジュールに渡される
            - TCPとUDPでは同じポート番号を別の目的で利用できる
- UDP(User Datagram Protocol)
    - UDPヘッダのフォーマット
        - 送信元ポート番号、宛先ポート番号、パケット長、チェックサム
        - チェックサム
            - UDP擬似ヘッダをUDPデータプログラムの前に付けて、16ビットの倍数にする。16ビット単位で1の補数の和を求めて、チェックサムフィールドに入れる。
                - TCPは5つの要素で識別し、UDPはその中の「送信元ポート番号」「宛先ポート番号」の2つしかないため、残りの3擬似ヘッダを計算する
    - ふくそう制御がないためアプリケーションで考慮しなくてはならない
    - 使われ方
        - DNSなど総パケット数が少ない通信
        - 電話やテレビ会議など即時性が必要なマルチメディア通信
        - LANなどの特定ネットワークに限定したアプリケーションの通信
        - ブロードキャストやマルチキャストのような同報性が必要な通信など
- TCP(Transmission Control Protocol)
    - 信頼性のある通信を実現する
        - 途中でパケット喪失した場合の再送制御
        - 順序が入れ替わった場合の順序制御
        - コネクション制御で通信相手がいる場合のみデータ送信をする
        - ふくそう状態を起こさないように、ネットワークが混雑している時はパケット送信量を調整する
    - TCPヘッダ
        - シーケンス番号
            - データ送信するたびに、送信したデータのオクテット数だけ値が加算される
        - 確認応答番号(Acknowledgement Number)
            - 次に受信すべきデータのシーケンス番号。実際には確認応答番号から1を引いたシーケンス番号までデータを受信したこととなる
        - データオフセット
            - TCPが運んでいるデータがTCPパケットの先頭のどこから始まるのかを意味する。TCPヘッダの長さを表している
        - 予約(Reserved)
            - 将来の拡張のために用意されているフィールド
        - コントロールフラグ(Control Flag)
            - 制御ビットとも呼ばれ、1が指定されると意味を持つようになる
            - CWR(Congestion Window Reduced)
                - 次のECEフラグとともに、IPヘッダのECNフィールドと一緒に使われる。ふくそうウィンドウを小さくしたことを相手に伝える
            - ECE(ECN-Echo)
                - 通信相手に、相手側からこちら側に向かうネットワークがふくそうしていることを伝える
                - 受け取ったパケットのIPヘッダ中のECNビットが1のときにTCPヘッダのECEフラグを1にする
            - URG(Urgent Flag)
                - 緊急に処理すべきデータが含まれていることを意味する
            - ACK(Acknowledgement Flag)
                - 確認応答番号フィールドが有効であることを意味する。コネクション確立時の最初のSYNセグメント以外は、必ず1になっていないといけない
            - PSH(Push Flag)
                - ここが1のときは、受信したデータをすぐに上位のアプリケーションに渡さないといけない。0であればすぐに渡さずにバッファすることが許される
            - RST(Reset Flag)
                - ここが1のときは、コネクションが強制的に切断される。使われていないTCPポート番号に接続要求が来たなど、何らかの異常を検出した場合に送信される。プログラムの暴走や電源断でコンピューたが再起動しているなど
            - SYN(Synchronize Flag)
                - コネクション確立に使われる。ここが1の時はコネクションを確立したいという意思を表すとともに、シーケンス番号フィールドの番号で初期化が行われる
            - FIN(Fin Flag)
                - ここが1のときは、今後送信するデータがないことを意味し、コネクションを切断したいという意思を示すことになる。これを受信してもすぐにFINを返す必要はない。送信すべきデータがすべてなくなってからFINを返す
            - チェックサム(Checksum)
                - UDPのチェックサムとほぽ同じだが、TCPではチェックサムを無効にすることはできない
                - TCP擬似ヘッダを使う
                    - 受信側は、TCPセグメント受信後、IPヘッダからIPアドレスの情報を得てTCP擬似ヘッダを作成し、チェックサムを計算する。チェックサムフィールドには、チェックサム以外の残りの部分の和の数値が入っているため、チェックサムを含むすべてのデータを足した結果が「16ビットすべてが1」になると正しい値となる
                    - なぜチェックサムを使うのか？
                        - ノイズによる通信途中のビットエラーはデータリンクのFCSで検出できる。チェックサムはノイズによるエラー検出というよりは、途中のルーターのメモリの故障やプログラムのバグなどによってデータが破壊されていないことを保証するためのもの
            - 緊急ポインタ(Urgent Pointer)
                - コントロールフラグのURGが1のときに、このフィールドが有効になる。緊急を要するデータの格納場所を示すポインタとして扱われる。
                    - Webブラウザで中止のボタンを押したときや、TELNETでCTRL+Cを入力したとき
            - オプション(Options)
                - TCPによる通信の性能を向上させるために利用する
                    - MSSで最大セグメント長を決めるなど
                - ブラウザなどは4つ程度のTCPコネクションを同時に確立して通信することで、スループットを高めている
    - 使われ方
        - データの送信があると困る場合
        - ファイル転送などの大量のデータ転送
        - ライブ配信など遅延がそれほど問題にならない動画や音声のストリーミング
        - 利用する回線を想定せず、どのような回線でもそれなりの性能を期待する場合
    - シーケンス番号と確認応答で信頼性を提供する
        - 確認応答（ACK）は会話の相づちに相当する
            - 「えっ？」と伝えるのは否定確認応答（NACK）
                - NACKが途中で遅延しても再送し、受信側は重複を破棄する
        - シーケンス番号は送信データ1オクテットごとに付けられる連続した番号
            - コネクション確立時に乱数で決められる
    - 再送タイムアウトの決定
        - 確認応答をどれだけ待つかは、高速LAN環境なら短い時間になり、長距離通信ならLANより長く、それはネットワーク混雑によっても変わる
        - パケット送信するたびにラウンドトリップ時間（RTT）と、その揺らぎ（ジッタ）を計測する
            - 初期値は6秒程度
            - 計測したRTTと揺らぎの時間を合計した値より少し大きな値を再送タイムアウト時間にする
            - 無駄な再送が行われないように制御している
    - コネクション管理
            - SYNはsynchronize
        - コネクションの確立と切断には最低でも7つ以上のパケットがやり取りされる
            - 確立するときの3つのパケットのやり取りを「スリーウェイハンドシェイク」と呼ぶ
        - コネクション確立時に通信を行うデータ単位を決定する
            - 最大セグメント長（MSS: Maximum Segment Size)
            - スリーウェイハンドシェイク時にMSSオプションを付ける
                - 両者の値のうち、小さいほうの値がMSSとして利用される
            - 理想的な最大セグメント長は、IPで分割処理されない最大データ長
            - 再送処理も基本的にはMSS単位で行われる
    - ウィンドウ制御
            - ウィンドウの外の見えない部分は再送する必要がないので、送信ホストの送信バッファからデータが削除される
        - 高速再送制御
    - フロー制御
        - 受信ホストが送信ホストに受信可能なデータサイズを通知する
    - ふくそう制御
        - ふくそうウィンドウを定義する
# 第７章 ルーティングプロトコル（経路制御プロトコル）
- LANや広域回線が複雑に絡み合っているインターネットの世界で、目的のホストまでパケットを届ける適切な経路を決定するのが経路制御（ルーティング）
    - それを実現するのがルーティングプロトコル
- スタティックルーティングとダイナミックルーティング
    - 組み合わせて利用することもできる
    - ダイナミックルーティング
        - 隣り合うルーター間で自分が知っているネットワークの接続情報をバケツリレー方式で教えあう。ネットワークの隅々まで伝わると経路制御表が完成し、IPパケットを正しく転送できるようになる
- 経路を制御する範囲
    - IPネットワークの発展とともに、ネットワーク全体を一括して管理することは不可能になった
        - 経路を制御する範囲としてIGP(Interior Gateway Protocol)とEGP(Exterior Gateway Protocol)という2つのルーティングプロトコルが利用されるようになった
        - インターネットは言葉も違えば宗教も違う組織が接続されている。考え方や方針の違う組織が管理される側も管理する側もなく、互いの組織が対等な関係で相互に接続されている
    - 自律システムとルーティングプロトコル
        - 自律システム(AS: Autonomous System)や、経路制御ドメイン(Routing Domain)
            - 同一の決まり、ポリシーによって経路制御を管理する単位
                - 地域ネットワークや、大きなISP(インターネットサービスプロバイダ）
                    - 運用管理者や運営者が経路制御の設定をしている
        - EGPとIGPは、IPアドレスのネットワーク部とホスト部の関係に近い
    - 経路制御アルゴリズム
        - 距離ベクトル型
            - 処理が簡単だが、距離と向きの情報しかないため、経路制御情報が安定するまでに時間がかかる、経路にループが生じやすくなる、といった問題がある
        - リンク状態型(Link-State)
            - 利点は各ルーターが経路制御情報を素早く同期させられれば、ネットワークが複雑になっても安定した経路制御ができること
            - ネットワークトポロジー情報の管理や処理をするために高いCPU能力と多くのメモリ資源が必要になる
    - RIP(Routing Information Protocol)
        - 経路制御情報を30秒周期で定期的にブロードキャストする
            - パケットが失われた場合も考慮して、6回(180秒)待っても来ないときは、接続が切れたと判断する
            - ホップ数の距離ベクトルにより経路を決定する
            - 無限カウント問題がある
                - 解決法
                    - 距離16を通信不能とする
                    - 経路情報を教えられたインタフェースには教えられた経路情報を流さないスプリットホライズンと呼ばれる方法
                    - 通信不能ではなく距離16を送り返すポイズンリバースと、情報が変化したとき30秒待たずにすぐに伝えるトリガードアップデートで、ループ時の問題を解決する
        - RIP2
            - RIPのバージョン2のことで、RIPを運用して得られた経験をもとに改良されたプロトコル
            - ブロードキャストではなくマルチキャストを使う
            - サブネットマスクに対応した
            - ルーティングドメイン
                - 1つのネットワーク上で論理的に独立したRIPが使えるようになっている
            - 外部ルートタグ
            - 認証キー
                - 自分が認識できるパスワードを持っているパケットのみ受容する
    - OSPF(Open Shortest Path First)
        - OSIのIS-ISプロトコルを参考にして作られたリンク状態型のルーティングプロトコル
            - ループのあるネットワークでも安定した経路制御を行うことができる
        - リンク状態型
            - 各リンクにコストという名で重みを付け、コスト合計値が小さくなるように経路制御される
                - コストを管理者が自由に設定できるため、柔軟な運用ができる
        - OSPFの基礎知識
            - 指名ルーターが決められ、そのルーターを中心に経路制御情報が交換される
            - 役割ごとに5種類のパケットがある
        - OSPFの動作の概要
            - LANの場合にはHELLOプロトコルを通常10秒に1回送信する
                - 4回(40秒）待っても来なくなったら接続が切れたと判断する
                    - 同一リンクの機器は同じ値にしなければならない
            - 接続が切れたり、回復したり、接続状態に変化があったらリンク状態更新パケットを送信する
                - 送信された2種類の情報でダイクストラ法を使ってリンク状態データベース(Link State Database)を作成する
                    - ネットワークLSA(Network Link State Advertisement)
                        - ネットワークを中心にどのルーターが接続されているか表す
                    - ルーターLSA(Router Link State Advertisement)
                        - ルーターを中心にどのネットワークが接続されているかを表す
        - 階層化されたエリアに分けてきめ細かく管理
            - ネットワークが大きくなるとリンク状態を表すトポロジーが大きくなって計算がたいへんになるため、エリアという概念が取り入れられた
            - ネットワーク同士やホスト同士をまとめてグループ化して、1つのバックボーンエリアに接続されたもの
            - 各エリアのルーターはエリア外の経路に関しては、エリア境界ルーターからの距離しかわからない
    - BGP(Border Gateway Protocol)
        - 各ISP間の接続部分などに利用されている
        - 組織のネットワーク集団を1つの自律システム(AS: Autonomous System)として、それぞれの自律システムに対して16ビットのAS番号が割り当てられる
        - ASは独立国家のようなもの
            - AS1とAS3の間で通信するためにはAS2かAS4とAS5の両方が、パケットを中継してくれる必要がある
            - 中継してくれない場合はAS1とAS3の間に専用回線を用意しなければならない
            - 経路制御はインターネット全体に広がる巨大な分散システム
                - 複数のシステムが協力（強調）して特定の処理を行っている
        - BGPスピーカーは全てのASと対等にコネクションを確立する
        - 目的とするネットワークアドレスにパケットを送った場合に、そこに到達するまでに通過するAS番号のリストであるAS経路リスト(AS Path List)が作られる
    - MPLS(Multi-Protocol Label Switching)
        - IPパケットの転送では、ルーティングだけでなくラベルスイッチングという技術も利用されている
        - MPLS機能に対応したルーターをLSR(Label Switching Router)と呼ぶ
            - 特に外部のネットワークとの接続部分のエッジのLSRをLER(Label Edge Router)と呼ぶ
                - LERでMPLSタグをパケットに付与したり、はがしたりする
            - イーサネットの場合シムヘッダを付けて、その中にラベルを含める
        - MPLSの利点
            - 固定長のラベル、経路制御表と違い必要な数だけラベルを設定する、などの理由により高速に転送処理が行える
            - ラベルを利用して仮想的なパスを張り、その上でIPなどのパケットを使った通信ができる
# 第８章 アプリケーションプロトコル
- ネットワークプロトコルの階層化によって、アプリケーション開発者はアプリケーション特有の通信処理を行うアプリケーションプロトコルとプログラムの開発だけに専念でき、相手のコンピュータまでどのようにしてパケットを送ったらよいかということはまったく考えなくてすむ
    - TCPやIPなどの下位層のプロトコルは汎用性の高いプロトコルだが、アプリケーションプロトコルは実用的なアプリケーションを実現するために作られたプロトコル
        - TELNETプロトコルでは文字ベースのコマンドと応答が決められているなど
    - OSI参照モデルの、通信コネクションの管理などの第５層セッション層、データフォーマットの変換という第６層プレゼンテーション層、相手ホストとのやり取りの第７層アプリケーション層のすべての機能
- 遠隔ログイン(TELNELとSSH)
    - 処理能力が高いコンピュータに複数端末が繋がれているような、TSS(Time Sharing System)のメインフレームと端末の関係をコンピュータネットワークに応用したもの
    - TELNET
        - TCPのコネクションを1つ利用する
    - SSH
        - 暗号化された遠隔ログインシステム
            - TELNETではログイン時のパスワードが暗号化されずに送信される
        - ファイル転送ができる
            - scp, sftp
        - ポートフォワード機能が利用できる
            - 特定のポート番号に届けられたメッセージを、特定のIPアドレス、ポート番号に転送する仕組み
- ファイル転送(FTP)
    - 制御用とデータ転送用の2つのTCPコネクションを使う
        - 制御用コネクションは、ログインのためのユーザー名やパスワード確認や、転送するファイル名や転送方法の指示にASCII文字列で利用される
    - TCPポート番号は21
    - ASCII文字列(American Standard Code for Information Interchange)
        - 1つの行が1つのコマンドや応答を意味する
- 電子メール(E-Mail)
    - SMTP(Simple Mail Transfer Protocol)プロトコル
        - トランスポートプロトコルとしてTCPを利用している
    - 最初は直接TCP接続していた
        - 日本と米国の時差もあり、電源が切れると受信できない
        - 電源を切らないメールサーバーを経由するようになった
            - POP(Post Office Protocol)というプロトコルが標準化された
    - メールアドレス
        - `master@tcpip.kusa.ac.jp`ならmaterが名前でtcpip.kusa.jpが住所で、住所はドメイン名と同じ構造になっている
        - 電子メールの配送先の管理はDNSによって行われる
            - MXレコード
                - `kusa.ac.jp`のMXレコードに、`mailserver.kusa.ac.jp`を指定すると、`kusa.ac.jp`で終わるメールアドレス宛のメールは全て`mailserver.kusa.ac.jp`に転送される
                    - 異なるメールアドレスを特定のメールサーバーで管理できるようになった
    - MIME(Multipurpose Internet Mail Extensions)
        - 昔の電子メールではテキスト形式のみだったが、MIMEによって拡張された
            - OSI参照モデルなら第６層のプレゼンテーション層にあたる
        - ヘッダと本文の2つの部分から構成される
            - ヘッダには空行があってはならず、空行があるとそこから後ろは本文（データ）となる
    - SMTP(Simple Mail Transfer Protocol)
        - TCPのポートは25番が利用される
        - 1つのTCPコネクション上で、制御や応答、データからなるメッセージ転送を行う
        - クライアントはテキストコマンドで要求を出し、サーバーは3桁の数字で表される文字列で応答する
    - POP(Post Office Protocol)
        - SMTPは送信したいメールを持っているコンピュータが、メールを受信するコンピュータへ向けて送信するプロトコルで、POPはメールを受信するためのプロトコル
        - メールは送信者からSMTPによって常時電源が入っているPOPサーバーまで到着し、クライアントはPOPによってPOPサーバーに保存されたメールを取り出す
            - ユーザー認証も行う
- WWW(World Wide Web)
    - URI(Uniform Resource Identifier)
        - 資源を表す識別子
            - URIはあらゆるものを定義できる広い概念で、WWW以外でも使える
                - プロトコル定義ではオクテットが使われ、　日常ではバイトが使われるのに似ている
            - URLは狭い概念
        - URIのhttpスキーム
            - `http://ホスト名:ポート番号/パス?問い合わせ内容#部分情報`
    - HTML(HyperText Markup Language)
        - WWWの共通のデータ表現プロトコル
            - OSI参照モデルならHTMLはWWWのプレゼンテーション層と呼べる
- ネットワーク管理(SNMP: Simple Network Management Protocol)
    - SNMPはUDP/IP上で動作するプロトコル
        - マネージャとエージェント間の通信のやり取りを定めたもの
    - MIB(Management Information Base)
        - SNMPでやり取りされる情報
            - ミブと呼ばれる
        - SNMPのプレゼンテーション層にあたる
        - 衝突回数やトラフィック量などの情報、インタフェースのIPアドレスなどの情報の変更、ルーティングプロトコルの停止・起動、機器の再起動や電源OFFなどの処理を行える
    - RMON(Remote Monitoring MIB)
        - 接続されるネットワーク回線を監視する
            - ネットワークの負荷の中身を詳細に分析できる
# 第９章 セキュリティ
- ファイアウォール
- IDS/IPS(侵入検知システム/侵入防止システム)
    - IDS
        - ログ採取やパケット監視によって、ファイアウォールなどで対応しきれない領域をカバーする
    - IPS
        - 不正アクセスを遮断する　
- 暗号化技術
    - OSI参照モデルの階層ごとに存在する
    - 共通鍵暗号方式と公開鍵暗号方式
        - 共通鍵暗号方式は処理速度が速いが鍵の管理が困難で、公開鍵暗号方式は鍵の管理はしやすいが処理速度が遅い
- 認証技術
    - ある情報を持っていることによる認証
        - パスワードなど
    - あるものを持っていることによる認証
        - IDカード、鍵、電子証明書など
    - ある特徴を持っていることによる認証
        - 生体認証
- セキュリティのためのプロトコル
    - IPsecとVPN
        - VPN(Virtual Private Network)
            - VPNを構築するときIPsecが利用される
            - IPヘッダの後ろに「暗号ヘッダ」や「認証ヘッダ」を付け、そのヘッダ以降のデータを暗号化して解読できないようにする
        - IPsec
            - ネットワーク層のプロトコルで、IPパケット単位での暗号化/認証を提供する
                - ESP（暗号ヘッダ）、AH（認証ヘッダ）、IKE（鍵交換）の3つで構成されている
        - TLS/SSLとHTTPS
            - TLS/SSLで暗号化したHTTP通信をHTTPSと呼ぶ
                - 共通鍵暗号方式で暗号化される
                    - 共通鍵を送信するときは公開鍵暗号方式が利用される
                - 公開鍵が正しいかどうかは認証局（CA）発行の証明書を使う
                    - 主な認証局の情報はあらかじめWebブラウザに組み込まれている
                        - 未知の認証局の場合は画面に警告が出るので利用者が判断する