> For the complete documentation index, see [llms.txt](https://y-meguro.gitbook.io/reading-record/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://y-meguro.gitbook.io/reading-record/other/mastering_tcp_ip_basic.md).

# マスタリングTCP/IP―入門編

## 概要

### 本

* [マスタリングTCP/IP―入門編 | 井上 直也, 村山 公保, 竹下 隆史, 荒井 透, 苅田 幸雄](https://amzn.to/2VKrRbY)

### かかった時間

* 28.7 時間

### 感想

* わかりやすく全体観つかめてよかった

## 読書メモ

### 1: ネットワーク基礎知識

* コンピュータネットワーク登場の背景
  * スタンドアロンからネットワーク利用へ
    * スタンドアロン
      * コンピュータをネットワークに接続せず、単体で使用する状態
    * ネットワーク利用
      * 複数のコンピュータを互いに接続すると、個々のコンピュータに格納されている情報を複数のコンピュータの間で共有したり、遠くのコンピュータへ瞬時に送ったりできる
  * コンピュータ通信から情報通信環境へ
    * 初期のコンピュータネットワークは、管理者が指定した特定のコンピュータ同士を接続したもの
      * プライベートなネットワーク
    * これらの私的なネットワークを相互に接続することが活発になり、公共ネットワークとしてインターネットが利用されるようになる
* コンピュータとネットワーク発展の 7 つの段階
  * 1: バッチ処理
    * 処理するプログラムやデータをカードやテープに記録しておき、それを順番にコンピュータに読み込ませて一括処理する形式
  * 2: タイムシェアリングシステム(TSS)
    * 1960 年代に登場
    * 1 台のコンピュータに複数の端末を接続し、複数のユーザーが同時にコンピュータを利用できるようにしたシステム
  * 3: コンピュータ間通信
    * それまではコンピュータから別のコンピュータにデータを移したい時は、磁気テープやフロッピーディスクなどの外部記憶媒体にデータを一旦保存して、それを物理的に輸送しなければいけなかった
    * コンピュータ間の通信が可能になったことで、データを瞬時にやり取りできるようになった
  * 4: コンピュータネットワークの登場
    * 1980 年代になると、いろいろな種類のコンピュータを相互に接続できるコンピュータネットワークが登場した
    * ウィンドウシステム
      * コンピュータの画面上で複数の窓(ウィンドウ)を開くことのできるシステム
      * 複数のプログラムなどをウィンドウごとに割り付け、次々と切り替えて実行できる
  * 5: インターネットの普及
    * 1990 年代はじめには、情報処理に力を注ぐ企業や大学にて 1 人に 1 台ずつコンピュータが割り当てられ、ユーザーがコンピュータを専有して使用できる環境になってきた
    * 企業や一般家庭にインターネットが普及し始めた
  * 6: インターネット技術中心の時代へ
    * 電話網の代わりに、インターネットの技術でもある IP 網が用意され、その上で電話やテレビ放送、コンピュータ通信、インターネットが構築されるようになった
  * 7:「単につなぐ」時代から「安全につなぐ」時代へ
    * いまやインターネットは社会のインフラとして必須のものになった
    * 接続後の運用などを検討して十分な自己防衛を行い、安全で健全な通信手段として維持していくことが不可欠な時代
* プロトコルとは
  * ネットワークアーキテクチャ
    * 様々なプロトコルを体系的にまとめたもの
    * TCP/IP もネットワークアーキテクチャの 1 つで IP・TCP・HTTP などのプロトコルの集合体
  * プロトコル
    * コンピュータとコンピュータがネットワークを利用して通信するために決められた「約束ごと」
* プロトコルは誰が決める？
  * コンピュータ通信の登場から標準化へ
    * コンピュータ通信が始まった当初は、体系化や標準化が重要とは考えられていなかった
    * しかし、コンピュータの重要性が増し、多くの企業でコンピュータネットワークが導入されていくと、メーカーが違っても互いに通信できるような互換性が重要であると認識されるようになった
      * これがネットワークのオープン化、マルチベンダ化
  * プロトコルの標準化
    * ISO(International Organization for Standization: 国際標準化機構) は、国際標準として OSI(Open Systems Interconnection) と呼ばれる通信体系を標準化した
    * 現在 OSI の定めるプロトコルは普及していないが、OSI プロトコルを設計する際の指針として提唱された OSI 参照モデルはネットワークプロトコルを考える時によく引き合いに出される
    * TCP/IP は ISO の国際標準ではない。TCP/IP は IETF(Internet Engineering Task Force) で提案や標準化作業が行われているプロトコル
* プロトコルの階層化と OSI 参照モデル
  * プロトコルの階層化
    * OSI 参照モデルでは、通信に必要な機能を 7 つの階層に分け、機能を分割することで複雑になりがちなネットワークプロトコルを単純化する
    * 上位層と下位層の間でサービスのやり取りをする時の約束ごとを「インタフェース」と呼び、通信相手の同じ階層とやり取りをする時の約束ごとを「プロトコル」と呼ぶ
    * 各階層は、階層から特定のサービスを受け、上位層に特定のサービスを提供する
    * 利点
      * 階層化すると、各階層を独立なものとして扱うことができる
      * また、通信の機能分割が行われるため、それぞれの階層のプロトコルの実装が容易になり、それに伴って責任の分界点も明確になる
    * 欠点
      * モジュール化を進めすぎてしまうと、処理が重くなったり、各モジュールで似たような処理が必要になる場合がある
  * OSI 参照モデルの各層の役割
    * 7: アプリケーション層
      * 特定のアプリケーションに特化したプロトコル
    * 6: プレゼンテーション層
      * 機器固有のデータフォーマットと、ネットワーク共通のデータフォーマットの変換
      * データ形式に関する責任を持つ
    * 5: セッション層
      * 通信の管理
      * コネクションの確立・切断
    * 4: トランスポート層
      * 両端ノード間のデータ転送の管理
      * データを確実に相手に届ける役目
    * 3: ネットワーク層
      * アドレスの管理と経路の選択
    * 2: データリンク層
      * 直接接続された機器間でのデータフレームの識別と転送
      * 0 と 1 の数字の列を意味のあるかたまり(フレーム)に分けて、相手に伝える
    * 1: 物理層
      * 0 と 1 を電圧の高低や光の点滅に変換する
* 通信方式の種類
  * コネクション型とコネクションレス型
    * コネクション型
      * データの送信を開始する前に、送信ホストと受信ホストの間で回線の接続をする
      * 通信の前後にコネクションの確立と切断の処理を行う必要があるが、相手が通信不可能な場合には無駄なデータを送らずに済む
    * コネクションレス型
      * コネクションの確立や切断処理がない
      * 送信したいコンピュータはいつでもデータを送信できる。逆に受け取る側は、いつ誰からデータを受信するかわからない
        * そのため、データを受け取っていないかどうかを常に確認しなければならない
      * 通信相手がいるかどうかの確認を行わないため、受信相手がいない場合や、相手に届かない場合にもデータを送信できる
  * 回線交換とパケット交換
    * 現在のネットワークでは、大きく 2 つの通信方法が利用されている。回線交換とパケット交換である
    * 回線交換
      * 従来の電話で利用されてきた方式
      * 交換機がデータの中継処理をする。コンピュータは交換機に接続され、交換機間は複数の通信回線で接続される
      * 通信をしたい場合には目的のコンピュータとの間にコネクションを確立する。コネクションが切断されるまで、その回線は占有利用される
      * 回線を占有してしまうと、他のコンピュータはその回線を利用できないので、ユーザーの数が多くなると通信できなくなってしまう
    * パケット交換
      * 回線に接続しているコンピュータが送信するデータを複数の小包に分け、転送の順番を待つ行列に並べる方法が考え出された
      * データをパケットとして細分化することで、各コンピュータが一斉にデータを送受信できるようになり、回線を効率的に利用できる
  * 通信相手の数による通信方式の分類
    * ユニキャスト
      * 1 対 1 の通信
    * ブロードキャスト
      * 1 台のホストから接続される全てのホストへ向けて情報を発信する
    * マルチキャスト
      * ブロードキャストと同様に複数のホストへの通信を行うが、通信先を特定のグループに限定している
    * エニーキャスト(Anycast)
      * 1 台のホストから特定の複数のホストに向けて情報を発信する通信だが、マルチキャストとは振る舞いが異なる
      * 特定の複数台のうちからネットワーク上で最適な条件を持つ対象が 1 つ選別され、その対象 1 つにだけ送られる
* アドレスとは
  * 通信の主体、すなわち送信元と受信先は、「アドレス」によって特定される
  * アドレスの唯一性
    * 1 つのアドレスとして表される対象は明確に特定される必要があり、同じアドレスで表されるものが複数存在してはならない
  * アドレスの階層性
    * コンピュータ通信で用いる MAC アドレスと IP アドレスは、両方とも唯一性はあるが、階層性は IP アドレスだけにある
    * IP アドレスはネットワーク部とホスト部という 2 つの部分から構成され、ホスト部が異なる IP アドレスでも、同じネットワーク部を持つものは必ず同じ組織やグループに接続されている
    * ネットワークの途中にある通過点では、各パケットの宛先アドレスを見て、どのネットワークインタフェースから送り出すか決める
      * そのためにアドレスごとに送出インタフェースを記したテーブルを参照する
      * これは MAC アドレスでも IP アドレスでも同じ
        * MAC アドレスの場合は、このテーブルを転送表(フォワーディングテーブル)という
        * IP アドレスの場合は、このテーブルを経路制御表(ルーティングテーブル)という
        * 転送表には MAC アドレスがそのまま書かれるのに対し、経路制御表に書かれる IP アドレスは集約されたネットワーク部である
* ネットワークの構成要素
  * 通信媒体とデータリンク
    * データリンク
      * 直接接続された機器間で通信するためのプロトコルやネットワークを指す言葉
    * 例
      * データリンク名: イーサネット
      * 通信媒体
        * 同軸ケーブル: 伝送速度 10Mbps
        * ツイストペアケーブル: 伝送速度 10Mbps - 10Gbps
        * 光ファイバーケーブル: 伝送速度 10Mbps - 100Gbps
  * ネットワークインタフェース
    * コンピュータをネットワークに接続するには、ネットワークに接続するためのネットワークインタフェースが必要になる
    * このインタフェースは NIC(Network Interface Card)、ネットワークアダプタ、ネットワークカード、LAN カードと呼ばれる
  * リピーター
    * リピーターは OSI 参照モデルの第 1 層の物理層でネットワークを延長する機器
    * ケーブル上を流れてきた電気や光の信号を受信し、増幅や波形の整形などをしたのちに別の側へ再生する機器
    * リピーターによるネットワークの延長では、リピーターの接続段数に制限がある場合がある
      * 10Mbps のイーサネットでは最大 4 つのリピーターを多段接続できるが、100Mbps のイーサネットでは最大で 2 つのリピーターしか接続できない
    * 複数の線を収容できるリピーターもあり、リピーターハブと呼ばれる
  * ブリッジ / レイヤ 2 スイッチ
    * ブリッジは OSI 参照モデルの第 2 層、データリンク層でネットワーク同士を接続する装置
    * データリンクのフレームを認識してブリッジ内部のメモリにいったん蓄積し、接続された相手側のセグメントに新たなフレームとして送出する
    * データリンクのフレームには、フレームが正しく届いたかどうかをチェックするための FCS(Frame Check Sequence) と呼ばれるフィールドがある。ブリッジはこのフィールドをチェックして、壊れたフレームを他のセグメントへ送信しないようにする働きがある
    * セグメント
      * 分割、区分といった意味だが「ネットワーク」を指して使われる
  * ルーター / レイヤ 3 スイッチ
    * ルーターは OSI 参照モデルの第 3 層、ネットワーク層の処理を行う
    * ブリッジは物理アドレス(MAC アドレス)で処理を行うが、ルーターはネットワーク層のアドレスで処理を行う
      * TCP/IP でのネットワーク層のアドレスは IP アドレスになる
    * ルーターは異なるデータリンクを相互に接続できる
      * イーサネットとイーサネットを接続したり、イーサネットと FDDI を接続できる
  * レイヤ 4-7 スイッチ
    * レイヤ 4-7 スイッチは、OSI 参照モデルのトランスポート層からアプリケーション層の情報に基づいて配送処理を行う
    * 負荷分散を実現する方法の 1 つとして、Web サーバーの手前にロードバランサーというレイヤ 4-7 スイッチの一種を設置する場合がある
    * また、通信が混雑した場合などは音声通話のような即応性が求められる通信を優先し、メールやデータ転送といった多少遅延しても問題ない通信を後回しに処理することがある。このような処理を帯域制御と呼び、これもレイヤ 4-7 スイッチの機能の一部
  * ゲートウェイ
    * ゲートウェイとは、OSI 参照モデルのトランスポート層からアプリケーション層までの階層で、データを変換して中継する装置のこと
    * レイヤ 4-7 スイッチと同じく、トランスポート層以上の情報を見てパケットを処理しますが、ゲートウェイにはデータを中継するだけでなく、データを変換する役割がある
* 現在のネットワークの姿
  * 実際のネットワークの構成
    * 道路を例に説明する
    * 高速道路に相当するのが「コア(バックボーン)」
    * インターチェンジに相当する部分は「エッジ」
    * コンピュータネットワークでエッジへと接続されている部分を「アクセス(アグリゲーション)」

### 2: TCP/IP 基礎知識

* TCP/IP 登場の背景とその歴史
  * 軍事技術の応用から
    * 1960 年代、通信している途中にネットワークの一部が敵の攻撃によって破壊されても、迂回経路を通してデータが配送され、通信が停止しないようなネットワークが望まれた
    * パケット通信の必要性が唱えられるようになった
  * ARPANET の誕生
    * 1969 年、当初ネットワークは、アメリカ西海岸の大学と研究機関のうちの 4 つのノードを結んだものだった
      * パケット交換技術の実用性を試験するためのネットワーク
    * このネットワークは、一般のユーザーも取り込み大規模なネットワークに発達した
    * これが ARPANET と呼ばれるネットワークで、インターネットの期限と言われている
  * TCP/IP の誕生
    * ARPANET の実験では、信頼性の高い通信手段を提供する総合的な通信プロトコルの実験も行われた。そして 1970 年代前半に TCP/IP が開発された
    * その後、1982 年頃まで仕様が決定され、1983 年には ARPANET で使う唯一のプロトコルになった
  * UNIX の普及とインターネットの拡大
    * 1980 年前後の大学や研究所では、コンピュータの OS として BSD UNIX が広く利用された。この OS の内部に TCP/IP が実装された
    * 1980 年代は LAN が発達するとともに、UNIX ワークステーションの普及が急速に進んだ。同時に TCP/IP によるネットワークの構築が盛んに行われるようになった
    * TCP/IP による世界的なネットワークを「インターネット」と呼ぶようになったのはこの頃から
    * 1980 年代半ばごろからは、企業などを中心に導入が進んでいた各コンピュータメーカー独自のプロトコルも、次第に TCP/IP に対応するようになっていった
  * 商用インターネットサービスの開始
    * 1990 年代になると、企業や一般家庭に対してインターネットへの接続を提供するサービスが普及し、広く利用されるようになった。このようなサービスを提供する会社を ISP と呼ぶ
    * TCP/IP は研究ネットワークとしてインターネットで長い間運用されてきたことで、商用サービスにも耐えうる成熟したプロトコルになっていった
* TCP/IP の標準化
  * TCP/IP という言葉は TCP と IP という 2 つのプロトコルだけでなく、TCP や IP に関係する多くのプロトコルを含む
  * TCP/IP 標準化の精神
    * 他の標準化と比べると 2 つの点が大きく異なる
      * 1 つはオープンであること
      * もう 1 つは標準化するプロトコルが実際に使えるプロトコルであるかどうかを重視すること
        * 開発重視の姿勢でプロトコルが決められてきた
    * TCP/IP に比べて OSI が一般に普及しなかったのは、動作するプロトコルを早く作れなかったこと、急速な技術革新に対応できるようなプロトコルの決定や改良を行える仕組みがなかったこと
  * TCP/IP の仕様書 RFC
    * TCP/IP のプロトコルは、IETF で議論され標準化される。標準化しようとするプロトコルは、RFC(Request For Comments) と呼ばれるドキュメントになり、インターネット上で公開される
    * RFC になったドキュメントには番号が付けられ、IP は RFC791 で TCP は RFC793 で仕様を決められている。主要なプロトコルや標準に対しては、変化しない番号付けも行われている
  * TCP/IP プロトコルの標準化の流れ
    * 次のような段階を経る
      * 仕様を煮詰めるインターネットドラフト(ID: Internet-Draft)の段階
        * インターネットドラフトの有効期間は 6 ヶ月
      * 標準化したほうがよいと認められると RFC となり、提案標準(Proposed Standard)になる
      * そして標準の草案であるドラフト標準(Draft Standard)になる
      * 最後に標準(Standard)になる
    * 標準を決めてから普及させるような標準化団体とは根本的に考え方が違う。TCP/IP の世界では、標準になった時にはすでに十分に普及している
  * RFC の入手方法
    * [RFC Editor](https://www.rfc-editor.org/)
* インターネットの基礎知識
  * インターネットとは
    * 英語の internet はもともとは複数のネットワークを結んで 1 つのネットワークにすることを表していた
    * 現在インターネットというと、ARPANET から発展し、全正解を接続しているコンピュータネットワークのことを指す
  * インターネットと TCP/IP の関係
    * インターネットで通信するためにはプロトコルが必要
    * インターネットのプロトコルといえば TCP/IP で、TCP/IP といえばインターネットのプロトコル
  * ISP と地域ネット
    * インターネットに接続するためには、ISP や地域ネットに接続を依頼することになる
    * 会社や家庭のコンピュータをインターネットに接続する場合、インターネットへの接続契約を ISP との間で交わすことになる
* TCP/IP プロトコルの階層モデル
  * ハードウェア(物理層)
    * TCP/IP の階層モデルでは最下位層に物理的にデータを転送してくれるハードウェアを置いている
      * ハードウェアとは、イーサネットや電話回線などの物理層のこと
  * ネットワークインタフェース層(データリンク層)
    * ネットワークインタフェース層は、イーサネットなどのデータリンクを利用して通信するためのインタフェースとなる階層
      * NIC を動かすための「デバイスドライバ」と考えてよい
  * インターネット層(ネットワーク層)
    * インターネット層では IP プロトコルが使われる。IP プロトコルは IP アドレスをもとにして、パケットを転送する
    * TCP/IP の階層モデルでは、一般にこのインターネット層とトランスポート層がホストの OS に組み込まれることを想定している
    * 特にルーターには、インターネット層を利用してパケットを転送する機能を実装しないといけない
      * ブリッジやリピーター、ハブの場合は必ずしも IP や TCP を実装する必要はない
    * IP(Internet Protocol)
      * ネットワークをまたいでパケットを配送し、インターネット全体にパケットを送り届けるためのプロトコル
      * それぞれのホストを識別するために、IP アドレスと呼ばれる識別子を使う
    * ICMP(Internet Control Message Protocol)
      * IP パケットの配送中に何らかの異常が発生してパケットを転送できなくなった場合に、パケットの送信元に異常を知らせるために使われるプロトコル
    * ARP(Address Resolution Protocol)
      * パケットの送り先の物理的なアドレスを IP アドレスから取得するプロトコル
  * トランスポート層
    * トランスポート層の最も重要な役割はアプリケーションプログラム間の通信を実現すること
    * どのプログラムとどのプログラムが通信しているか識別する必要がある
      * ポート番号と呼ばれる識別子が使われる
    * TCP(Transmission Control Protocol)
      * TCP はコネクション型で信頼性のあるトランスポート層のプロトコル
      * ただし、コネクションの確立・切断をするだけで制御のためのパケットを約 7 回もやり取りするので、転送するデータの総量が少ない場合には無駄が多くなる
      * ネットワークの利用効率を向上させるための複雑な仕組みがいろいろと組み込まれているため、ビデオ会議の音声・映像データなどのように一定間隔で決められた量のデータを転送する通信にはあまり向いていない
    * UDP(User Datagram Protocol)
      * UDP は TCP とは異なり、コネクションレス型で信頼性のないトランスポート層プロトコル
      * UDP は送信したデータが相手に届いているかどうかの確認はしない
      * パケット数が少ない通信や、ブロードキャストやマルチキャストの通信、ビデオや音声などのマルチメディア通信に向いている
  * アプリケーション層(セッション層以上の上位層)
    * TCP/IP 階層モデルでは、OSI 参照モデルのセッション層やプレゼンテーション層、アプリケーション層はすべてアプリケーションプログラムの中で実現されると考えられている
    * TCP/IP のアプリケーションの多くは、クライアント / サーバーモデルで作られている
    * WWW(World Wide Web)
      * ブラウザとサーバーの間の通信で使われるプロトコルが HTTP
      * WWW では、HTTP が OSI 参照モデルのアプリケーション層のプロトコル、HTML がプレゼンテーション層のプロトコルといえる
    * 電子メール
      * 電子メールの配送では SMTP(Simple Mail Transfer Protocol) というプロトコルが利用される
      * 当初、インターネットの電子メールではテキスト形式でしかメッセージを送信できなかった。現在はデータ形式を拡張する MIME の仕様が一般的となり、映像や音声のファイルなど様々な情報を送れる
        * この MIME は OSI 参照モデルの第 6 層、プレゼンテーション層の機能といえる
    * ファイル転送(FTP: File Transfer Protocol)
      * ファイル転送とは、異なるコンピュータのハードディスク上に存在するファイルを自分のコンピュータのハードディスクに転送したり、あるいは自分のコンピュータのファイルを別のコンピュータへ移したりすること
      * ファイル転送のプロトコルとしては、FTP が古くから利用されている
    * 遠隔ログイン(TELNET と SSH)
      * 遠隔ログインとは、遠く離れたコンピュータにログインして、そのコンピュータでプログラムを走らせる機能
      * TCP/IP では、遠隔ログインでは、TELNET プロトコルや SSH プロトコルがよく用いられる
    * ネットワーク管理(SNMP: Simple Network Management Protocol)
      * TCP/IP では、ネットワーク管理に SNMP というプロトコルが利用される
      * SNMP で管理されるルーターやブリッジ、ホストなどはエージェントと呼ばれる。ネットワーク機器を管理するプログラムをマネージャと呼ぶ
      * SNMP はこのエージェントとマネージャの通信に使われるプロトコル

### 3: データリンク

* データリンクの役割
  * 「データリンク」という言葉は、OSI 参照モデルのデータリンク層を指す用語として使われる場合と、具体的な通信手段(イーサネット、無線 LAN など)を指す一般的な用語として使われる場合がある
  * TCP/IP では OSI 参照モデルのデータリンク層以下(データリンク層と物理層)を定義していない。これらが透過的に機能していることを前提にしている
    * しかし、TCP/IP とネットワークの理解を深めるためには、データリンクについての知識が重要になる
  * データリンク層のプロトコルは、通信媒体で直接接続された機器間で通信するための仕様を定めている
    * 通信媒体にはツイストペアケーブル、同軸ケーブル、光ファイバー、電波、赤外線などがある
* データリンクの技術
  * MAC アドレス
    * MAC アドレスはデータリンクに接続しているノードを識別するために利用される
    * イーサネットや FDDI では IEEE802.3 で規格化された MAC アドレスが利用される
    * MAC アドレスは 48 ビットの長さを持つ
      * 3 - 24 ビットはベンダ識別子と呼ばれ、NIC の製造メーカーごとに特定の数字が割り当てられている
      * 25 - 48 ビットはメーカーが製造したカードごとに違う数字を割り当てる
    * このアドレスは一般的なネットワークインタフェースカードの場合には ROM に焼き込まれており、同じ MAC アドレスが付けられているネットワークインタフェースカードは世界中で 1 つしかないことになっている
      * 同じ MAC アドレスが存在しても、それが同じデータリンク内になければ問題ない
  * 媒体共有型のネットワーク
    * 媒体共有型のネットワークとは、通信媒体を複数のノードで共有するネットワーク
    * 媒体共有型のネットワークで優先権を制御する仕組みとしては、コンテンション方式やトークンパッシング方式がある
      * コンテンション方式(Contention)
        * コンテンション方式とは、データの送信権を競争で奪い取る方式。CSMA(Carrier Sense Multiple Acess) 方式とも呼ばれる
        * 各ステーションは、データを送信したくなったら、早いもの勝ちで通信路を使用してデータを送信する
          * データリンクではノードのことをステーションと呼ぶことが多い
        * 複数のステーションからデータが同時に送信された場合には、互いのデータが衝突し壊れてしまう
          * この状態をコリジョンという
        * イーサネットの一部では CSMA 方式を改良した CSMA/CD(Carrier Sense Multiple Access with Collision Detection) 方式が採用されている
          * 衝突(collision)を早期に検出して、素早く通信路を解放する制御が加えられている
      * トークンパッシング方式
        * トークンと呼ばれるパケットを巡回させ、このトークンで送信権を制御する。トークンを持っているステーションだけがデータを送信できる
        * この方式には衝突が発生しないことと、誰にでも平等に送信権が回ってくるという特徴がある
          * このため、ネットワークが混雑しても性能があまり低下しない
        * 一方で、トークンが回ってくるまでデータを送信できないため、混雑していない時に、データリンクの性能を 100% 出しにくくなる
  * 媒体非共有型のネットワーク
    * 通信媒体を共有せずに専有する方式
    * ステーションはスイッチと呼ばれる装置に直接接続され、そのスイッチがフレームを転送する
    * この方式では、送受信の通信媒体が共有されないため、多くの場合、全二重通信となる
      * 半二重通信とは、送信をしている間には受信できず、受信をしている間は送信できないような通信のこと。無線式のトランシーバーと同じで、こちらが話す時には相手からの声を聞けない
      * 全二重通信は送信と受信を同時に行える通信
    * この方式は ATM などで採用されている他、最近のイーサネットでも主流になっている
    * この方式では、スイッチに高度な機能を持たせることにより、仮想的なネットワークの構築やデータ流量の制御なども可能になる。その反面、スイッチが故障するだけで接続されたすべてのコンピュータ間の通信が不可能になってしまう欠点もある
  * MAC アドレスによる転送
    * 媒体非共有型で利用されていたスイッチ技術をイーサネットなどでも利用できるようにする機器が登場した。これがスイッチングハブやイーサネットスイッチと呼ばれるもの
    * イーサネットスイッチは複数のポートを持ったブリッジといえる
    * これらデータリンク層における各フレームの通過点では、そのフレームの宛先 MAC アドレスを見て、どのインタフェースから送り出すかを決める。その決定の時に参照する、送出インタフェースを記したテーブルのことを、転送表(フォワーディングテーブル)という
      * MAC アドレスには階層性はないので、転送表のエントリはそのデータリンク内に存在する機器の数だけ必要
  * ループを検出するための技術
    * ブリッジでネットワークを接続する時に、ループを作った場合
      * 最悪の場合、フレームが次々にコピーされ、それがぐるぐると永久に回り続ける
    * そこでループを解決する方法としてスパニングツリーと呼ばれる方式と、ソースルーティングと呼ばれる方式の 2 つが考えられた
    * スパニングツリー
      * 各ブリッジは 1 - 10 秒の間隔で BPDU(Bridge Protocol Data Unit) と呼ばれるパケットを交換する
      * そして、通信に使用するポートと使用しないポートを決定し、ループを消すように制御する
      * 障害が発生した場合には、通信路が自動的に切り替わり、使用されていないポートを使って通信が行われるようになる
      * スパニングツリーには、コンピュータやルーターの機能には関係なく、ブリッジの機能だけでループを解消できるという特徴がある
    * ソースルーティング
      * この方式では、送信コンピュータがどのブリッジを経由してフレームを流すかを決定し、フレームの RIF(Routing Information Field) に書き込む
      * ブリッジはその RIF 情報をもとに配送処理を行う
      * これにより、ブリッジによるループがあったとしても、フレームはループすることなく目的地に到達する
      * この場合、送信コンピュータ自体がソースルーティング機能を持っていないといけない
  * VLAN(Virtual LAN)
    * ネットワークの負荷を分散させたり、部署や席の入れ替えをしたりするたびに、ネットワークのトポロジーを変更しなければならない場合がある
      * 通常は配線を変更する必要がある
    * VLAN 技術を利用できるブリッジ(スイッチ)を使えば、ネットワークの配線を変えずに、ネットワークの構造を変えることができる
    * 単純な VLAN
      * スイッチのポートごとにセグメントを分けることで、ブロードキャストのトラフィックが流れる範囲を区切ることができ、ネットワークの負荷を軽減したり、セキュリティを向上させることができる
      * 異なるセグメント間で通信するためには、ルーターの機能を備えたスイッチ(レイヤ 3 スイッチ)を利用するか、セグメント間をルーターで結ばなければならない
    * 上記の VLAN を拡張し、異なるスイッチをまたいだセグメントを構築できるようにしたものが IEEE802.1Q で標準化されたタグ VLAN
      * タグ VLAN ではセグメントごとに一意となる VLAN ID を設定する
      * スイッチ間でフレームを転送する時は、イーサネットのヘッダの中に VLAN タグを挿入し、その値をもとにしてどのセグメントにフレームを転送するかを決定する
* イーサネット(Ethernet)
  * データリンクの代表選手は、現在最も普及しているイーサネット
  * 他のデータリンクと比べて制御の仕組みが単純なため、NIC やデバイスドライバが作りやすいという特徴がある
    * そのためイーサネットの NIC は LAN の普及期に他の NIC よりも安い価格で販売されていた
    * 低価格で利用できたことが、イーサネットの普及に大きな影響を与えた
  * イーサネットにはいろいろな種類がある。通信速度が違う場合には、速度変換機能を持つブリッジやスイッチングハブまたはルーターでなければ相互に接続できない
  * イーサネットの歴史
    * イーサネットは、同軸ケーブルを使うバス型接続の 10BASE5 が最初に規格化された
    * 当初のイーサネットでは、アクセス制御方式として CSMA/CD が採用されており、半二重通信が前提とされていた
    * その後、媒体非共有でスイッチと接続されるようになったイーサネットには衝突検知が必要なくなり、高速化への障壁もなくなった
  * イーサネットのフレームフォーマット
    * イーサネットフレームの先頭には、1 と 0 を交互に並べたプリアンブルと呼ばれるフィードが付けられる
      * これは「ここからイーサネットフレームが始まるよ」ということを示し、相手の NIC がフレームとの同期をとれるようにする
      * プリアンブルは末尾が「11」の SFD(Start Frame Delimiter) と呼ばれるフィードで終わり、それ以降がイーサネットフレームの本体になる
    * フレーム本体の先頭に来るイーサネットのヘッダは合計 14 オクテットある
      * 1 オクテットは 8 ビット。バイトとほぼ同じ意味
      * 宛先 MAC アドレスのフィールドが 6 オクテット、送信元 MAC アドレスのフィールドが 6 オクテット、そしてデータ部分で運んでいる上位層のプロトコルの種類を表すフィールドが 2 オクテット
    * また、フレームの末尾には FCS(Frame Check Sequence) という 4 オクテットのフィールドがある
* 無線通信
  * 無線通信では、電波や赤外線、レーザー光線などを利用する
  * 無線通信の中で、オフィス内のような LAN の範囲を比較的高速で接続するものを無線 LAN と呼ぶ
  * 無線通信の種類
    * 無線通信はその通信距離に応じて、分類できる
    * 短距離無線
      * 通信距離: 数 m
    * 無線 PAN(Personal Area Network)
      * 通信距離: 10m 前後
      * 関連団体や技術名称: Bluetooth
    * 無線 LAN(Local Area Network)
      * 通信距離: 100m 前後
      * 規格化団体など: IEEE802.11
      * 関連団体や技術名称: Wi-Fi
    * 無線 MAN(Metropolitan Area Network)
      * 通信距離: 数 km - 100km
      * 関連団体や技術名称: WiMAX
    * 無線 RAN(Regional Area Network)
      * 通信距離: 200km - 700km
    * 無線 WAN(Wide Area Network)
      * 関連団体や技術名称: 3G、LTE、4G
  * IEEE802.11
    * IEEE802.11 は無線 LAN プロトコルの物理層とデータリンク層の一部(MAC 層)を定義した規格
    * IEEE802.11 は IEEE802.11 関連の規格の基礎であり、ここで規定されるデータリンク層の一部(MAC 層)は、IEEE 802.11 のすべての規格で利用されている
    * MAC 層ではイーサネットと同じ MAC アドレスが利用され、CSMA/CD とよく似た CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance) というアクセス制御方式を採用している
  * IEEE802.11b、IEEE802.11g
    * IEEE802.11b と IEEE802.11g は 2.4GHz 帯の電波を利用する無線 LAN
    * データ転送速度は、最大 11Mbps および 54Mbps で通信可能な距離は 30 - 50m 程度
  * IEEE802.11a
    * 無線 LAN の物理層として 5GHz 帯の周波数を利用し、最大 54Mbps までの伝送速度を実現する規格
    * IEEE802.11b/g とは互換性がないが、両方に対応した基地局も製品化されている
  * IEEE802.11n
    * IEEE802.11g および a をベースに、複数のアンテナを同期させて通信する MIMO(Multiple-Input Multiple-Output) という技術を採用することで高速化を実現したのが、IEEE802.11n
    * 物理層としては 2.4GHz 帯または 5GHz 帯を使う
    * 最大 150Mbps の伝送速度が利用できる
  * 無線 LAN を使用する場合の留意点
    * 無線 LAN は利用者の移動性、機器配置の自由性を確保するために、電波の性質を利用して広い範囲で利用できるようになっている
    * これは、通信可能範囲内であれば、許された利用者以外でもこの電波を受信できることを意味する
    * このため、盗聴や改ざんといった危険に常にさらされていることになる
  * Bluetooth
    * Bluetooth は IEEE802.11b/g などと同じ 2.4GHz 帯の電波を使って通信する規格
    * データ転送速度はバージョン 2 で 3Mbps(実際のスループットは 2.1Mbps)
    * 通信可能な距離は、電波強度によって最大 1m、10m、100m の 3 種類がある
    * 通信可能な端末は原則として最大 8 台
  * WiMAX(Worldwide Interoperability for Microwave Access)
    * WiMAX はマイクロ波を使って、企業や自宅への無線接続を行う方式
    * WiMAX は、無線 MAN に属し、大都市圏をエリアとする広範囲なワイヤレスネットワークをサポートする
  * ZigBee
    * 家電などに組み込むことを前提に、低消費電力で短距離の無線通信を実現する規格
    * 最大 65536 個の端末間を無線通信でつなぐ
    * 伝送速度は使用する周波数によって変わるが、日本で利用可能な 2.4GHz 帯を利用するものでは最大 250kbps とされている
* PPP(Point-to-Point Protocol)
  * PPP とは
    * 1 対 1 でコンピュータを接続するためのプロトコル
    * PPP は OSI 参照モデルの第 2 層に相当するデータリンクプロトコルと言える
    * イーサネットや FDDI などは OSI 参照モデルのデータリンク層だけではなく、物理層にも関係する。具体的には、イーサネットは同軸ケーブルやツイストペアケーブルを使い、その中で 0 と 1 をどのような電気信号で表すかを決めている
    * これに対して、PPP は純粋なデータリンク層で、物理層は何でも構わない
    * PPP は電話回線や ISDN、専用回線、ATM 回線などで利用される
    * また PPPoE(PPP over Ethernet) というイーサネットのデータ部に PPP のフレームを格納して転送する方式も登場し、ADSL やケーブルテレビなどを使ったインターネット接続で利用される
  * LCP(Link Control Protocol) と NCP(Network Control Protocol)
    * PPP ではデータ通信を開始する前に PPP レベルでコネクションを確立する
    * コネクションを確立する時には、認証や圧縮、暗号化などの設定を行う
    * PPP の機能のうち、上位層に依存しないプロトコルが LCP、上位層に依存するプロトコルが NCP
      * 上位層が IP の時の NCP が IPCP(IP Control Protocol)
    * LCP はコネクションの確立や切断、パケット長の設定、認証プロトコルの設定、通信品質の監視をするかどうかなどの設定を行う
    * IPCP は IP アドレスの設定や TCP/IP のヘッダ圧縮をするかどうかなどのやり取りをする
    * PPP で接続する時には、通常ユーザー ID やパスワードによる認証が行われる。PPP では通信する双方向で認証を行えるようになっている
      * PPP で利用される認証方式には、PAP(Password Authentication Protocol) と CHAP(Challenge Handshake Authentication Protocol) の 2 種類がある
      * PAP はコネクションの確立時に 1 回だけ ID とパスワードをやり取りする方法。やり取りするパスワードは暗号化されずに平文のまま送信されるため、盗聴や、コネクション確立後に回線を乗っ取られるなどの危険性がある
      * CHAP は毎回パスワードが変更される OTP(One Time Password) を使用して、盗聴の問題を防ぐ。また、コネクション確立後に定期的にパスワードを交換することにより、通信相手が途中から入れ替わっていないかどうかをチェックできる
  * PPP のフレームフォーマット
    * PPP は HDLC(High Level Data Link Control Procedure) と呼ばれるプロトコルを参考に作られている
    * HDLC ではフレームの区切りを「01111110」で表現する。これをフラグシーケンスと呼ぶ
      * フラグシーケンスではさまれたフレーム内部では、「1」が 6 つ以上連続することは許されない
    * コンピュータでダイアルアップ接続をする時、PPP はソフトウェアで実現される。そのため「0」の挿入や削除の処理、FCS の計算をすべてコンピュータの CPU が処理しなければならず、PPP はコンピュータに大きな負荷をかける方式と言える
  * PPPoE
    * インターネット接続サービスによっては、イーサネットを利用して PPP の機能を提供する PPPoE が利用される場合がある
    * そのようなサービスでは、通信回線をイーサネットであるかのようにエミュレートする
      * しかし、イーサネットには認証機能がなく、コネクションの確立や切断の処理もないため、利用時間による課金などもできない
    * PPPoE によりイーサネット上でコネクションを管理すれば、PPP の認証機能などを利用してプロバイダが顧客の管理をしやすくなる
* その他のデータリンク
  * ATM(Asynchronous Transfer Mode)
    * ATM はデータをヘッダ 5 オクテット、データ 48 オクテットのセルと呼ばれる単位で処理するデータリンク
    * 回線の専有時間を短くすることで大容量のデータを効率よく転送できるようにしており、主に広域を結ぶネットワークで利用されてきた
    * 特徴
      * ATM はコネクション指向のデータリンク
        * 通信を開始する前に必ず通信回線の設定をしなければならない
        * ただし、同時に複数の相手と通信回線を接続できる
      * ATM にはイーサネットや FDDI のように送信権の制御はない
    * ATM と上位層
      * イーサネットでは 1 つのフレームで最大 1500 オクテット、FDDI では 4352 オクテットのデータを転送できるが、ATM ではセル 1 つで 48 オクテットのデータしか運べない
      * この 48 オクテットのデータ部に IP ヘッダや TCP ヘッダを入れたのでは、上位層のデータをほとんど送れない
      * このため、ATM は通常単独で利用するのでなく、AAL(ATM Adaptation Layer) と呼ばれる上位層とともに利用する
        * IP の場合は AAL5 と呼ばれる上位層が利用される
      * IP のパケットは最大で 192 個のセルに分割されて送信される
        * 逆に言うと、192 個のセルのうち 1 つでも失われると、IP パケットは破壊されてしまう。この場合最大で 192 個すべてのセルを再送することになる
        * これは ATM の大きな問題と言われる
  * POS(Packet over SDH/SONET)
    * POS はデジタル信号を光ファイバーでやり取りするための物理層の規格である SDH(SONET) 上でパケット通信を行うためのプロトコル
    * SDH は電話回線や専用線などで、信頼性の高い光伝送ネットワークとして広く利用されている
  * FDDI(Fiber Distributed Data Interface)
    * FDDI は光ファイバーやツイストペアケーブルを用いて 100Mbps の伝送速度を実現できるため、ネットワークのバックボーンやコンピュータ間を高速に接続するために利用されていた
    * 現在は、高速 LAN としてはギガビットイーサネットなどに押され、使われなくなってきている
    * FDDI はトークンパッシング方式を採用していて、ネットワークが混雑した時の輻輳に強い
      * 輻輳(ふくそう): ネットワークが非常に混雑して、ルーターやスイッチがパケットやセルを処理しきれなくなった状態のこと
  * Token Ring
    * Token Ring は IBM によって開発されたトークンパッシング形式の LAN で 4Mbps または 16Mbps のデータ伝送速度を実現する
    * FDDI はこの Token Ring を発展させたものといえる
    * IBM の環境以外にはあまり普及していない
  * その他、以下がある
    * 100VG-AnyLAN
    * ファイバーチャネル(Fiber Channel)
    * HIPPI
    * IEEE1394
    * HDMI
    * iSCSI
    * InfiniBand
    * DOCSIS
    * 高速 PLC (高速電力線搬送通信)
* 公衆アクセス網
  * ここでは LAN のような構内の接続ではなく、外部と接続する場合に使用する公衆通信サービスについて解説する
  * 公衆通信サービスとは、電話のように NTT や KDDI、ソフトバンクなどの通信事業者に料金を払って通信回線を借りる形態
  * アナログ電話回線
    * いわゆる固定電話回線を利用して通信を行う
    * コンピュータを電話回線で接続するためには、デジタル信号とアナログ信号を変換するモデムが必要になる
    * モデムによる通信速度は 56kbps 程度と低速、現在はほとんど利用されていない
  * 移動体通信サービス
    * 日本では移動体通信サービスとして、携帯電話と PHS が利用できる
    * 従来、それほど高速での通信はできなかったが、現在では Mobile WiMAX や LTE といった技術により、携帯電話によって数 Mbps - 数十 Mbps 程度のデータ通信を行える
  * ADSL
    * ADSL は既存のアナログ電話回線を拡張利用するサービス
  * FTTH(Fiber To The Home)
    * 高速の光ファイバーを、ユーザーの自宅や会社の建物内に直接引き込む手法
    * 建物の中まで光ファイバーが来るが、それを直接コンピュータに接続するのではなく、ONU という装置で光を電気信号に変換してからコンピュータやルーターに接続するのが普通
    * FTTH を利用すると、常時安定した高速通信が可能になる
  * ケーブルテレビ
    * 本来、電波を使うテレビ放送を、ケーブルを使って放送するサービスがケーブルテレビ
    * 放送局側から加入者宅までの通信はテレビ放送と同じ周波数帯を使用し、加入者宅から放送局側へは放送では利用されていない低周波数帯を使用する
      * このためケーブルテレビでは、下りのデータ転送速度に比べて、上りのデータ転送速度が低い
  * 専用回線(専用線)
    * インターネット利用者の急速な増加により、専用回線サービスの低価格化、広帯域化、多様化が進み、現在様々な「専用線サービス」が提供されている
    * 専用回線の接続形態は必ず 1 対 1 になる
  * VPN(Virtual Private Network)
    * 離れた地域を結ぶ VPN サービスには、IP-VPN、広域イーサネットがある
    * IP-VPN
      * IP ネットワークに VPN を構築する
      * IP ネットワーク上に MPLS(Multiprotocol Label Switching) 技術を用いて VPN を構築するサービスを通信事業者が提供しているものがある
      * MPLS はラベルと呼ばれる情報を IP パケットに付加して通信を制御する
      * 複数の顧客の VPN を 1 つの MPLS 網状で区別し、保護されて閉じた形のプライベートなネットワークとして利用できる
      * 通信事業者が提供している IP-VPN サービスを利用する以外に、企業などが独自にインターネット上に VPN を構築する場合もある
    * 広域イーサネット
      * 通信事業者が提供する、離れた地域を結ぶイーサネット接続のサービス
      * IP-VPN が IP 層での接続サービスであるのに対して、広域イーサネットはデータリンク層であるイーサネットを用いた VLAN を利用する
  * 公衆無線 LAN
    * 公衆無線 LAN とは、Wi-Fi を利用したサービス
    * ホットスポットと呼ばれる電波受信可能エリアを駅、飲食店などの人が集まる場所に設置し、無線 LAN インタフェースを持ったラップトップ型のコンピュータやスマートフォンから接続する
  * その他の公衆通信サービス
    * X.25
      * X.25 は電話網の改良版的なネットワーク
    * フレームリレー
    * ISDN

### 4: IP プロトコル

* IP はインターネット層のプロトコル
  * TCP/IP の心臓部とも言えるのが、インターネット層。これは主に IP と ICMP(Internet Control Message Protocol) という 2 つのプロトコルから構成される
  * この章では IP について説明する
  * IP(IPv4、IPv6) は OSI 参照モデルの第 3 層に相当
    * ネットワーク層の役割を一言で言うと「終点ノード間の通信を実現する」ことにある
    * ネットワーク層の下位に位置するデータリンク層は、同じ種類のデータリンクだけで接続されているノード間のパケット転送を行う。データリンクを超えた通信をするためには、ネットワーク層が必要
  * ネットワーク層とデータリンク層の関係
    * データリンク層は直接接続された機器同士の通信を提供する。それに対し、ネットワーク層である IP は直接接続されていないネットワーク間での転送を実現する
* IP の基礎知識
  * IP には大きく 3 つの役割がある。IP アドレス、終点ホストまでのパケット配送(ルーティング)、IP パケットの分割処理と再構築処理の 3 つ
  * IP アドレスはネットワーク層のアドレス
    * MAC アドレスは、同一のデータリンク内にあるコンピュータを識別するために使われる
    * IP アドレスは、「ネットワークに接続されているすべてのホストの中から、通信を行う宛先を識別する」時に使用される
    * IP アドレスの形式はホストがどのようなデータリンクに接続されていてもまったく同じものが使われる
    * ブリッジやスイッチングハブなど、物理層やデータリンク層でパケットを中継する機器には IP アドレスを設定する必要はない
  * 経路制御(ルーティング)
    * 経路制御は宛先 IP アドレスのホストまでパケットを届けるための機能
    * TCP/IP ではネットワークの 1 区間を IP パケットが跳ぶことをホップといい、この 1 区間のことを 1 ホップという
    * IP の経路制御はホップバイホップルーティングという方式で行われる
      * ホップバイホップルーティングでは、ルーターやホストは IP パケットに次の転送先となるルーターやホストを指示するだけで、最終目的地までの経路を指示するわけではない
    * 経路制御表(ルーティングテーブル)
      * 宛先のホストまでパケットを送るため、すべてのホストやルーターは経路制御表と呼ばれる情報を持っている
      * IP アドレスが付けられた機器のことを「ホスト」と呼ぶ。より正確には「IP アドレスが付けられているが、経路制御を行わない機器」をホスト、「IP アドレスが付けられていて、経路制御を行う機器」を「ルーター」、ホストとルーターをあわせて「ノード」と呼ぶ
  * データリンクの抽象化
    * データリンクには、その種類によって固有の特徴がある。それを抽象化するのも IP の重要な役割
    * データリンクのアドレスは IP アドレスによって抽象化される
    * 最大転送単位(MTU: Maximum Transmission Unit) もデータリンクごとに異なるが、これを抽象化するために、IP では分割処理を行う
  * IP はコネクションレス型
    * パケットを送信する前にコネクションの確立を行わない
    * 上位層に送信すべきデータが発生し IP に送信要求をしたら、すぐに IP パケットにデータを詰めて送信する
    * なぜ IP はコネクションレス型なのか？
      * 機能の簡略化と高速化のため
* IP アドレスの基礎知識
  * IP アドレスとは
    * IP アドレス(IPv4 アドレス)は 32 ビットの正製数値で表される
    * IP アドレスはホストごとではなく、NIC ごとに割り当てる
  * IP アドレスはネットワーク部とホスト部から構成される
    * 「ネットワーク部」はデータリンクのセグメントごとに値が割り当てられる
    * 「ホスト部」は同一セグメント内で重ならない値を割り当てる
  * IP アドレスのクラス
    * IP アドレスはクラス A、クラス B、クラス C、クラス D という 4 つのクラスに分類されていた
    * これらのクラスは IP アドレスの先頭から 4 ビットまでのビット列の組み合わせによって、ネットワーク部とホスト部を決めている
    * クラス A
      * クラス A は IP アドレスの先頭 1 ビットが「0」で始まる場合
      * IP アドレスの先頭から 8 ビットまでがネットワーク部となる
      * 下位 24 ビットはホストアドレスとして割り当てられる
    * クラス B
      * クラス B は IP アドレスの先頭 2 ビットが「10」で始まる場合
      * IP アドレスの先頭から 16 ビットまでがネットワーク部となる
      * 下位 16 ビットはホストアドレスとして割り当てられる
    * クラス C
      * クラス C は IP アドレスの先頭 3 ビットが「110」で始まる場合
      * IP アドレスの先頭から 24 ビットまでがネットワーク部となる
      * 下位 8 ビットはホストアドレスとして割り当てられる
    * クラス D
      * クラス D は IP アドレスの先頭 4 ビットが「1110」で始まる場合
      * IP アドレスの先頭から 32 ビットまでがネットワーク部となる
      * ホストアドレスの部分はなく、クラス D は IP マルチキャスト通信に使われる
    * IP ホストアドレス割り当て上の注意
      * ホスト部をビットで表した時に、全てのビットを 0 にすることや全てのビットを 1 にすることはできない
  * ブロードキャストアドレス
    * ブロードキャストアドレスは、同一リンクに接続されたすべてのホストにパケットを送信するためのアドレス
    * IP アドレスのホスト部のビットをすべて 1 にすると、ブロードキャストアドレスになる
    * ブロードキャストには、ローカルブロードキャストとダイレクトブロードキャストの 2 つがある
      * 自分が属しているリンク内のブロードキャストがローカルブロードキャスト
      * 異なる IP ネットワークへのブロードキャストには、ダイレクトブロードキャストアドレスを指定する
  * IP マルチキャスト
    * マルチキャストは、特定のグループに所属するすべてのホストにパケットを送信するために利用される
    * IP マルチキャストでは、クラス D の IP アドレスを使用する
      * 先頭 4 ビット以外の 28 ビットがマルチキャストの対象となるグループ番号となる
  * サブネットマスク
    * クラスが決まると、ネットワークアドレス部とホストアドレス部が決定する
    * サブネットワークとサブネットマスク
      * 現在、IP アドレスを利用する時は、ネットワーク部とホスト部の切れ目はクラスに縛られない
      * サブネットマスクと呼ばれる識別子が導入され、これがネットワーク部の範囲を定義する
      * サブネットワークの導入により、IP アドレスは 2 つの識別子で表されるようになった
        * 1 つは IP アドレス、もう 1 つはネットワーク部を表すサブネットマスク(サブネットワークマスク、ネットマスク)
      * サブネットマスクは 32 ビットの数値で、IP アドレスのネットワーク部を表すビットと同じ部分が 1 になり、ホスト部を表すビットと同じ部分のビットが 0 になる
  * CIDR(Classless InterDomain Routing) と VLSM(Variable Length Subnet Mask)
    * 1990 年代半ばまでは、各組織への IP アドレスの割り当てはクラス単位で行われた
      * 大規模なネットワークを構築する組織にはクラス A が配布され、小規模なネットワークを構築する組織にはクラス C が配布された
      * クラス C が接続できるホストやルーターの数が最大で 254 台になるため、多くの組織がクラス B を求めるようになった。その結果、クラス B の絶対数が不足し、配布し尽くしてしまう可能性が出てきた
    * そこで IP アドレスのクラス分けを廃止し、任意のビット長で IP アドレスを配布するようにした
      * これを CIDR と呼ぶ
      * CIDR は「クラスに縛られない組織間の経路制御」を意味する
    * CIDR を適用することによって、連続する複数のクラス C アドレスを 1 つの大きなネットワークとして扱うことが可能になる
    * インターネットが CIDR に対応したばかりの時は、仕組み上、組織のネットワーク内ではサブネットマスクの長さを統一しなければならなかった
      * しかし、部署によって必要なホスト数が異なる場合もあるので、その場合効率的なネットワークを構築できない
      * 組織内部のネットワークでも、可変長のサブネットによる効率的な IP アドレスの利用が必要になった
    * 組織内の部署ごとにサブネットマスク長が変えられるようにする仕組みが可変長サブネットマスク VLSM である
      * VLSM により、ホスト数が 500 のネットワークでは /23、50 のネットワークでは /26 と割り振り、理論上では IP アドレスの使用率を 50% まで向上させることができる
  * グローバルアドレスとプライベートアドレス
    * インターネットの急速な普及により、IP アドレスが不足し始めた
    * そこで、すべてのホストやルーターにユニークな IP アドレスを割り当てることをやめて、必要なところに必要な数だけユニークな IP アドレスを割り当てるようになった
    * 例えばインターネットに接続しない独立したネットワークの場合には、そのネットワークの中で IP アドレスがユニークであればよい。しかし、個々のネットワークで好き勝手に IP アドレスを使っては問題を引き起こす可能性がある
    * そこで、私的なネットワークで利用できるプライベート IP アドレスが誕生した
    * プライベート IP アドレスの範囲は指定されており、それ以外はグローバル IP アドレスと呼ばれる
    * プライベート IP アドレスは当初、インターネットとの接続を考えないネットワークで利用されていたが、その後、プライベート IP アドレスとグローバル IP アドレスの間でアドレス変換をする NAT 技術が誕生し、プライベートアドレスを割り当てたネットワーク上のホストから、グローバルアドレスを割り当てたインターネット上のホストと通信できるようになった
    * プライベート IP アドレスと NAT を組み合わせるのが現在の最も一般的な方法だが、全体をグローバル IP アドレスで使うことに比べて様々な制限事項がある
      * これを解決するために IPv6 が作られた
  * グローバル IP アドレスは誰が決める
    * グローバル IP アドレスは ICANN(Internet Corporation for Associated Names and Numbers) で一元管理されている
    * 日本国内では JPNIC(Japan Network Information Center) がグローバル IP アドレスの割り当て機関として活動しており、他の機関がグローバル IP アドレスを割り当てることは禁止されている
* 経路制御(ルーティング)
  * 経路制御表を作成するには、管理者が事前に設定する方法と、ルーターが他のルーターと情報を交換して自動的に作成する方法の 2 つがある
    * 前者をスタティックルーティング(静的経路制御)、後者をダイナミックルーティング(動的経路制御)と呼ぶ
  * IP アドレスと経路制御
    * IP アドレスのネットワーク部を利用して経路制御が行われる
    * 経路制御表に一致するネットワークアドレスが複数ある場合は、一致するビット列が長いほうのネットワークアドレスを選択する
      * 例えば 172.20.100.52 は 172.20/16 と 172.20.100/24 のどちらにもマッチする。この場合、ビット列の長い 172.20.100/24 を選択する
    * デフォルトルート
      * 全てのネットワークやサブネットの情報を経路制御表に持つと無駄が多くなる
        * このためデフォルトルートが利用される
      * このデフォルトルートは経路制御表に登録されているどのアドレスにもマッチしない場合の経路
      * デフォルトルートは 0.0.0.0/0 または default と記述する
    * ホストルート
      * 「IP アドレス/32」はホストルートと呼ばれる
      * IP アドレスのすべてのビットを使って経路制御する
      * このホストルートを利用すると、IP アドレスのネットワーク部ではなく、ネットワークインタフェースに付けた IP アドレスそのものに基づいて経路制御が行われる
    * ループバックアドレス
      * 同じコンピュータ内部のプログラム間で通信したい場合に利用されるのがループバックアドレス
      * ループバックアドレスとして、127.0.0.1 という IP アドレスが使われる
        * 同じ意味で localhost というホスト名も利用される
      * このアドレスを利用した場合、パケットはネットワークには流れない
  * 経路制御表の集約
    * ネットワークアドレスのビットのパターンを考えて階層的に配置すると、内部的には複数のサブネットワークから構成されていたとしても、外部には代表する 1 つのネットワークアドレスで経路制御できる
* IP の分割処理と再構築処理
  * データリンクによって MTU(最大転送単位) は違う
  * IP データグラムの分割処理と再構築処理
    * ホストやルーターは必要に応じて IP データグラムの分割処理をしなければならない
      * データグラム: 通信ネットワークにおける送受信単位となる、宛先アドレスなどの制御情報を付加されたデータの小さなまとまりのこと
    * 分割処理は、ネットワークにデータグラムを送信しようとした時に、そのままの大きさでは転送できない場合に行われる
    * 終点の宛先ホストだけが分割されたパケットの再構築処理を行う
      * 同じ経路を通るかわからないので、途中で待っていても届かない可能性がある
  * 経路 MTU 探索(Path MTU Discovery)
    * 分割処理にはいくつかの欠点がある
      * 1 つ目は、ルーターの処理が重くなる点
        * IP の分割処理もルーターにとって大きな負荷となる
      * 2 つ目は分割処理をすると、分割された断片の 1 つが失われても元の IP データグラムのすべてが失われてしまうこと
        * この弊害を避けるため、初期の TCP では分割されない小さなサイズでパケットを送信していた。しかしこれだとネットワークの利用効率が悪い
        * この弊害を避けるための技術が、経路 MTU 探索
        * 経路 MTU とは、送信先ホストから宛先ホストまで分割処理が必要にならない最大の MTU のこと
          * つまり経路に存在するデータリンクの最小の MTU になる
        * 経路 MTU 探索は、経路 MTU を発見し、送信元のホストで経路 MTU の大きさにデータを分割してから送信する方法
* IPv6(IP version 6)
  * IPv6 が必要な理由
    * IPv6 は IPv4 アドレスの枯渇問題を根本的に解決するために標準化され、利用が始まったインターネットプロトコル
    * それまで利用されてきた IPv4 の IP アドレスは 4 オクテット長、これが IPv6 では 4 倍の 16 オクテット長になる
  * IPv6 の特徴
    * IP アドレスの拡大と経路制御表の集約
    * パフォーマンスの向上
    * プラグ & プレイ機能を必須にする
      * DHCP サーバーがない環境でも IP アドレスを自動的に割り当てる
    * 認証機能や暗号化機能を採用する
      * IP アドレスの偽造に対するセキュリティ機能の提供や、盗聴防止機能を提供する
    * マルチキャスト、Mobile IP の機能を IPv6 の拡張機能として定義
  * IPv6 での IP アドレスの表記方法
    * 128 ビットの IP アドレスを 16 ビットごとに区切り、それをコロンで区切って 16 進数で表記する
    * 0 が続く場合には 0 を省略し、コロンを 2 つ続けて表すことも可能
  * IPv6 アドレスのアーキテクチャ
    * IPv6 では IPv4 のクラスのように、IP アドレスの先頭のビットパターンで IP アドレスの種類を区別する
  * グローバルユニキャストアドレス
    * グローバルユニキャストアドレスとは、全世界で一意に決まるアドレスという意味
    * グローバルユニキャストアドレスのフォーマット
      * 先頭 n ビット
        * 広域ネットワークを表す
      * 次の m ビット
        * サイト内部のサブネット ID を表す
        * ここまでの n + m ビットがネットワーク部
      * 最後の 128 - n - m ビット
        * ホスト部
        * インタフェース ID
  * リンクローカルユニキャストアドレス
    * リンクローカルユニキャストアドレスは、データリンクの同一リンク内で一意に決まるアドレス
  * ユニークローカルアドレス
    * ユニークローカルアドレスは、インターネットとの通信を行わない場合に利用されるアドレス
  * IPv6 での分割処理
    * IPv6 での分割処理は始点ホストのみで行われ、ルーターは分割処理をしない
    * これはルーターの負荷を減らし、高速なインターネットを実現するため
    * そのため IPv6 では経路 MTU 探索がほぼ必須の機能になっている
      * ただし、IPv6 では最小の MTU が 1280 オクテットと定められているので、組込みシステムなど、システムリソースに制限がある機器では、経路 MTU 探索を実装せずに、IP パケットの送信時に 1280 オクテット単位で分割してから送信してもよいことになっている
* IPv4 ヘッダ
  * IP を利用して通信を行う時は、データに IP ヘッダが付けられて送信される
  * この IP ヘッダには、IP プロトコルによってパケットの配送を制御する時に必要になる情報が格納される
  * バージョン
    * 4 ビットで構成される
    * 4 や 6 など
    * [Version Numbers](http://www.iana.org/assignments/version-numbers/version-numbers.xhtml)
  * ヘッダ長(IHL: Internet Header Length)
    * IP ヘッダ自体の大きさをここで表す
    * 単位は 4 オクテット
  * サービスタイプ(TOS: Type Of Service)
    * 8 ビットで構成される
    * 送信している IP のサービス品質を表す
    * 優先度や最低限の遅延、最大限のスループットなどが表される
  * DSCP(Differentiated Services Codepoint) フィールド、ECN(Explicit Congestion Notification) フィールド
    * DSCP フィールドは DiffServ と呼ばれる品質制御で利用される
    * ECN フィールドはネットワークが輻輳していることを通知するためのフィールドで、2 つのビットから構成される
  * パケット長(Total Length)
    * IP ヘッダと IP データを加えたパケット全体のオクテット帳を表す
    * このフィールドは 16 ビット長なので、IP が運べるパケットの最大サイズは 65535(= 2^16) オクテットになる
  * 識別子(ID: Identification)
    * 16 ビットで構成される
    * フラグメントを復元する際の識別子として使われる
    * 同じフラグメントでは同じ値、違うフラグメントでは違う値になるよう処理される
  * フラグ(Flags)
    * 3 ビットで構成される
    * パケットの分割に関する制御を指示する
  * フラグメントオフセット(FO: Fragment Offset)
    * 13 ビットで構成される
    * 分割されたフラグメントがオリジナルデータのどこに位置していたかを示す
  * 生存時間(TTL: Time To Live)
    * 8 ビットで構成される
    * もともとの意味は、このパケットがネットワークに存在してよい時間を秒単位で示したもの
    * しかし、実際のインターネットでは、何個のルーターを中継してもよいかという意味になる
    * ルーターを通過するたびに TTL は 1 つずつ減らされ、0 になったらパケットは破棄される
  * プロトコル(Protocol)
    * 8 ビットで構成される
    * IP ヘッダの次のヘッダのプロトコルが何であるかを示す
  * ヘッダチェックサム(Header Checksum)
    * 16 ビットで構成される
    * IP ヘッダのチェックサムを表す
    * チェックサムは IP ヘッダが壊れていないことを保証するためのもの
  * 送信元 IP アドレス(Source Address)
    * 32 ビットで構成される
    * 送信元の IP アドレスを表す
  * 宛先 IP アドレス(Destination Address)
    * 32 ビットで構成される
    * 宛先の IP アドレスを表す
  * オプション
    * 可変長の長さを持つ
    * 通常はオプションフィールドは使用されないが、テストやデバッグなどを行う時に使用される
  * パディング
    * オプションを付けた場合、ヘッダ長が 32 ビットの整数倍にならないケースがある
    * この場合、パディングで「0」を入れ、32 ビットの整数倍にする
  * データ
    * データが入る
* IPv6 のヘッダフォーマット
  * IPv6 の IP ヘッダフォーマットは、IPv4 に比べて IP アドレスのフィールドが巨大になる
  * IPv6 ではヘッダのチェックサムは省略された
    * ルーターでの処理を軽減することが目的
  * バージョン
    * IPv4 と同じ
  * トラフィッククラス(Traffic Class)
    * IPv4 の TOS にあたるフィールドで、8 ビットの長さがある
  * フローラベル(Flow Label)
    * 品質制御に利用されることを想定したフィールドで、20 ビットの長さがある
  * ペイロードの長さ(Payload Length)
    * ペイロードは、パケットのデータ部を意味する
    * IPv4 の TL(Total Length) ではヘッダの長さも含まれたが、ここではヘッダを除いたデータ部分の長さを表す
  * 次のヘッダ(Next Header)
    * IPv4 におけるプロトコルフィールドにあたる
  * ホップリミット(Hop Limit)
    * 8 ビットで構成される
    * IPv4 の TTL と同じ意味だが、「通過できるルーターの数を制限する」という意味を明確にするために Hop Limit と名付けられた
  * 送信元 IP アドレス
    * 128 ビットで構成される
  * 宛先 IP アドレス
    * 128 ビットで構成される
* IPv6 拡張ヘッダ
  * IPv6 のヘッダは固定長で、オプションをヘッダ内に付け加えることはできない
  * その代わり、拡張ヘッダで機能を拡張できるようになっている
  * 拡張ヘッダは、IPv6 のヘッダと TCP や UDP のヘッダの間に挿入される
  * IPv4 ではオプションの長さは 40 オクテットに制限されたが、IPv6 ではこの制限はなくなった

### 5: IP に関連する技術

* IP だけでは通信できない
  * Web や電子メールを使う時には、IP アドレスではなく、Web サイトのアドレスや電子メールアドレスなど、アプリケーション層で決められているアドレスを使う
    * しかしホストが実際に IP パケットを使って通信するためには、アプリケーションで使用するアドレスから対応する IP アドレスを知る必要がある
    * またデータリンクでは IP アドレスは使われないので、送り先の MAC アドレスもわかる必要がある
  * この章では IP を補助する技術について説明する
* DNS(Domain Name System)
  * 通常、一般ユーザーが TCP/IP で通信する時には IP アドレスを使用しない
  * これは DNS の機能によるもの。DNS がローマ字とピリオドを使った名前から IP アドレスへと自動的に変換を行ってくれる
  * この DNS は IPv4 と IPv6 の両方で使用される
  * IP アドレスを覚えるのは大変
    * IP アドレスは数字の列で表されるため、人間にとってはとても覚えにくい
    * そこで TCP/IP の世界では古くからホスト名と呼ばれる識別子が利用されてきた
      * それぞれのコンピュータに名前を付けて、通信したい場合には IP アドレスではなくホスト名を入力する
      * すると、自動的に IP アドレスに変換されてから通信が行われる
    * この機能を実現するために、ホスト名と IP アドレスの対応を定義する hosts と呼ばれるデータベースファイルが利用される
    * インターネットの起源と言われる ARPANET では、当初は hosts ファイルをネットワークインフォメーションセンター(SRI-NIC)で一括管理していた
    * しかし、ネットワークの規模が大きくなり、接続するコンピュータの数が増えてくると、ホスト名や IP アドレスの登録・変更処理を 1 ヶ所で集中管理するのは不可能になった
  * DNS の登場
    * そこで、ホスト名と IP アドレスの対応関係を効率よく管理するための手段として、DNS が考えられた
    * このシステムではホストを管理している組織が、データの設定や変更を行うことができる
    * DNS では通信をしたいユーザーがホスト名(およびドメイン名)を入力すると、自動的にホスト名や IP アドレスが登録されているデータベースサーバーが検索され、そこから IP アドレスの情報を得るようになっている
  * ドメイン名の構造
    * ドメイン名とは、ホストの名前や組織の名前を識別するための階層的な名前のこと
    * ドメイン名を利用する前は単なるホスト名だけで IP アドレスが管理されていたため、たとえ異なる組織であっても同じホスト名をつけることができなかった
      * 階層的なドメイン名の登場により、各組織単位で自由にホスト名を付けられるようになった
  * ネームサーバー(= DNS サーバー)
    * ネームサーバーとは、ドメイン名を管理しているホストやソフトウェアのこと
    * ネームサーバーは、そのネームサーバーが設置された階層のドメインに関する情報を管理する
    * ルートの部分に設置されているサーバーをルートネームサーバーと言う
      * このルートネームサーバーには、次のレベルのネームサーバーの IP アドレスが登録されている
    * ドメイン名とネームサーバーは階層的に配置される
  * リゾルバ
    * DNS に問い合わせを行うホストやソフトウェアをリゾルバという
    * ユーザーが利用するワークステーションやパーソナルコンピュータはリゾルバにあたる
  * DNS による問い合わせ
    * リゾルバは IP アドレスを調べるためにネームサーバーに問い合わせ処理を行う
    * それを受けたネームサーバーは自分のデータベースに情報があればそれを返すが、情報がない場合にはルートネームサーバーに問い合わせ処理を行う
    * ドメインの木構造の上から順番に辿って目的の情報があるネームサーバーを見つけ、そこから必要な情報を得る
    * リゾルバやネームサーバーは、新たに知った情報をしばらくキャッシュすることで、毎回問い合わせることによるパフォーマンスの低下を防ぐ
  * DNS はインターネットに広がる分散データベース
    * DNS はホスト名と IP アドレス以外にも様々な情報を管理している
    * A レコード: ホストの IP アドレス
    * NS レコード: ネームサーバー
    * MX レコード: メールサーバー
* ARP(Address Resolution Protocol)
  * ARP の概要
    * ARP はアドレス解決のためのプロトコル
    * 宛先 IP アドレスを手がかりにして、次にパケットを受け取るべき機器の MAC アドレスを知りたい時に利用する
    * 宛先のホストが同一リンク上にない場合には、次ホップのルーターの MAC アドレスを ARP で調べることになる
    * この ARP は IPv4 でのみ利用され、IPv6 では利用されない
      * IPv6 では ARP の代わりに ICMPv6 の近隣探索メッセージが利用される
  * ARP の仕組み
    * ARP では ARP 要求パケットと ARP 応答パケットの 2 種類のパケットを使用して MAC アドレスを知る
      * IP アドレスから MAC アドレスを知るために送信するのが ARP 要求パケット
      * 自分の MAC アドレスを教えるために返送するのが ARP 応答パケット
    * ARP によって取得した MAC アドレスはキャッシュされるが、一定の時間が経過すると捨てられる
      * これは MAC アドレスと IP アドレスの対応が変わっても正しくパケットを配送できるようにするため
  * IP アドレスと MAC アドレスは両方とも必要？
    * [IPアドレスとMACアドレスはなぜ両方必要か](http://segakusyu.blog.fc2.com/blog-entry-70.html)
  * RARP(Reverse Address Resolution Protocol)
    * RARP は ARP の逆で、MAC アドレスから IP アドレスを知りたい場合に使われる
    * 普段私たちが使用するパーソナルコンピュータの場合は、キーボードで IP アドレスを入力して設定したり、DHCP を使って自動的に IP アドレスを設定したりする
    * しかし、組み込み機器の場合、IP アドレスを入力するインタフェースが存在しない場合や DHCP を使って動的な IP アドレスが設定されては困る場合がある
    * このような場合に RARP が使われることがある
    * RARP を使う場合には RARP サーバーを用意する必要がある
  * 代理 ARP(Proxy ARP)
    * 通常の ARP パケットはルーターで遮断されるが、代理 ARP を使うとルーターは ARP パケットを隣のセグメントに転送できる
    * これにより、2 つ以上に分かれていたセグメントが 1 つのセグメントであるかのように振る舞う
* ICMP(Internet Control Message Protocol)
  * IP を補助する ICMP
    * IP ネットワークを構築した時に大切になるのが、ネットワークが正常に動作しているかどうかの確認と、異常が発生した時のトラブルシューティング
    * これを実現するのが ICMP
    * ICMP には、IP パケットが目的のホストまで届くかどうかを確認する機能や、何らかの原因で IP パケットが廃棄された時にその原因を通知してくれる機能、不十分な設定をより良い設定に変更してくれる機能などがある
    * IP では IP パケットが何らかの障害によって到達できなかった時に、ICMP により障害の通知が行われる
      * ICMP には大きく分類すると、エラー通知のためのためのエラーメッセージと、診断などを行う問い合わせメッセージの 2 種類がある
  * 主な ICMP メッセージ
    * ICMP 到達不能メッセージ(タイプ 3)
      * IP ルーターが IP データグラムを宛先に配送できない場合、送信ホストに対して ICMP 到達不能メッセージを送信する
      * このメッセージでは配信できなかった理由を示す
        * Network Unreachable や Host Unreachable など
    * ICMP リダイレクトメッセージ(タイプ 5)
      * 送信元ホストが最適ではない経路を使用しているのをルーターが検出した時、ICMP リダイレクトメッセージをそのホストに対して送信する
      * このメッセージの中には、最適経路の情報と元のデータグラムが入っている
    * ICMP 時間超過メッセージ(タイプ 11)
      * IP パケットの生存時間が 0 になると IP データグラムは破棄されるが、この時 IP ルーターは ICMP 時間超過メッセージのコード 0 を送信元に送り返し、パケットが破棄されることを通知する
    * ICMP エコーメッセージ(タイプ 0、8)
      * 通信したいホストやルーターに、IP パケットが到達するかどうかを確認したい時に使われる
      * 相手先ホストに対して ICMP エコー要求メッセージ(ICMP Echo Request Message、タイプ 8)を送信し、相手先ホストから ICMP エコー応答メッセージ(ICMP Echo Reply Message、タイプ 0)が返ってくれば到達可能
      * ping コマンドはこのメッセージを使用している
  * その他の ICMP メッセージ
    * ICMP 始点抑制メッセージ(タイプ 4)
      * 低速の広域回線を使用している場合には、WAN に接続されたルーターで輻輳が発生する可能性がある
      * ICMP 始点抑制メッセージは、この輻輳を緩和するのが目的
      * このメッセージを受信したホストは、回線のどこかが混雑していることを知り、IP パケットの送信間隔を空けたりする
      * しかし、この ICMP は不公平な通信を引き起こす恐れがあるため、ほとんど利用されていない
    * ICMP ルーター探索メッセージ(タイプ 9、10)
      * 自分がつながっているネットワークのルーターを見つけたい時に利用される
      * ホストが ICMP ルーター請願メッセージ(タイプ 10)を送ると、ルーターは ICMP ルーター広告メッセージ(タイプ 9)を返す
    * ICMP アドレスマスクメッセージ(タイプ 17、18)
      * サブネットマスクを調べたいホストやルーターがある場合に利用される
      * 調べたいホストやルーターに向けて、ICMP アドレスマスク要求メッセージ(タイプ 17)を送信すると、ICMP アドレスマスク応答メッセージ(タイプ 18)でサブネットマスクの値が返される
  * ICMPv6
    * ICMPv6 の役割
      * IPv4 の ICMP は IPv4 を補助する役割しか持たず、仮に ICMP がなくても IP で通信できた
      * IPv6 になると ICMP の役割が非常に大きくなり、ICMPv6 がなければ IPv6 による通信ができなくなる
      * IPv6 では、IP アドレスから MAC アドレスを調べるプロトコルが ARP から ICMP の近隣探索メッセージに変更される
        * この近隣探索メッセージは IPv4 の ARP と ICMP リダイレクト、ICMP ルーター選択メッセージなどの機能を組み合わせたものになっていて、さらに IP アドレスの自動設定などの機能も提供する
      * ICMPv6 では ICMP を大きく 2 つに分類している
        * エラーメッセージと情報メッセージ
        * タイプ 0 - 127 までがエラーメッセージで、128 - 255 までが情報メッセージ
      * 近隣探索
        * ICMPv6 ではタイプ 133 - 137 までのメッセージを近隣探索メッセージと呼ぶ
        * IPv6 アドレスと MAC アドレスの対応関係を調べる時には、近隣要請メッセージで MAC アドレスを問い合わせ、近隣告知メッセージで MAC アドレスを通知してもらう
* DHCP(Dynamic Host Configuration Protocol)
  * プラグ & プレイを可能にする DHCP
    * ホストごとに IP アドレスを設定するのは非常に面倒
      * 特にラップトップ型のコンピュータやスマートフォンなど、1 ヶ所に固定せずに使う場合は、移動するたびに IP アドレスの設定を変更しなければならない
    * 面倒な IP アドレスの設定を自動化したり、配布する IP アドレスの一括管理を行ったりするために DHCP が利用される
    * DHCP により、コンピュータをネットワークに接続しただけで TCP/IP による通信ができるようになる
      * つまり DHCP によってプラグ & プレイが実現する
    * DHCP は IPv4 だけではなく IPv6 でも利用される
  * DHCP の仕組み
    * DHCP を利用するには、まず DHCP サーバーを立ち上げなければならない
    * そして DHCP で配布する IP アドレスを DHCP サーバーに設定する必要がある。他にも、サブネットマスクや経路制御の情報、DNS サーバーのアドレスなども必要に応じて設定する
    * DHCP で IP アドレスを取得する時の流れ
      * 1: DHCP 発見パケットで、ネットワークの設定を要求
      * 2: DHCP 提供パケットで、使用してよいネットワークの設定を通知
      * 3: DHCP 要求パケットで、通知された設定を使用したいことを通知
      * 4: DHCP 確認応答パケットで、3 の要求に対する許可を通知
    * ここで DHCP の確認が 2 段階で行われているのは、DHCP サーバーを 2 つ以上設置しても正しく動くようにするため
      * DHCP サーバーに障害が発生すると、IP アドレスが配られなくなるため、そのセグメント内のホストがすべて通信不能になってしまう
      * それを避けるため、複数の DHCP サーバーを起動することが奨励されている
  * DHCP リレーエージェント
    * 一般家庭で構築されるネットワークの場合、イーサネット(無線 LAN)のセグメントは 1 つであることが多く、接続されるホストの台数もそれほど多くないため、DHCP サーバーは 1 台あれば十分
      * そしてこの DHCP サーバーはインターネットの接続に使用するブロードバンドルーターが担うのが普通
    * 企業や学校など、大きな組織で構築されるネットワークの場合、1 つではなく複数イーサネット(無線 LAN)のセグメントで構築されるのが普通
      * このような環境ではセグメント毎に DHCP サーバーを設定するのは大変
      * ルーターが DHCP サーバーの役割をするとしても、例えば 100 台のルーター全てにそれぞれが配布する IP アドレスの範囲を設定したり、構成が変わった時に配布する範囲を変更したりするのは大変
    * そこでこのような環境では DHCP の設定を一元管理する方法が利用される
      * それが DHCP リレーエージェントを使った DHCP の運用方法
      * これにより、複数の異なるセグメントの IP アドレスの割り当てを 1 つの DHCP サーバーで管理・運用できる
    * この方法では、それぞれのセグメントに DHCP サーバーを置く代わりに、DHCP リレーエージェントを設置する
      * DHCP リレーエージェントには、DHCP サーバーの IP アドレスを設定し、DHCP サーバーにはそれぞれのセグメントに配布する IP アドレスの範囲を登録する
    * これにより、DHCP サーバーが同一リンク内になくても、DHCP による IP アドレスの配布・管理ができるようになる
* NAT(Network Address Translator)
  * NAT とは
    * NAT は、ローカルなネットワークでプライベート IP アドレスを使用し、インターネットへ接続する時にグローバル IP アドレスへ変換する技術として開発された
    * さらに NAPT(Network Address Ports Translator) が登場したことで、1 つのグローバル IP アドレスで複数のホスト間の通信が可能になった
    * NAT(NAPT) は基本的にアドレスが枯渇している IPv4 のために生まれた技術
      * ただし IPv6 でもセキュリティ向上のために NAT が利用されたり、IPv4 と IPv6 の間で相互通信をするための技術(NAT-PT)として利用される
  * NAT の仕組み
    * NAT(NAPT) 対応ルーターの内部では、アドレス変換のためのテーブルが自動的に作られる
    * またこの変換テーブルは NAT 対応ルーターによって自動的に更新される
  * NAT-PT(NAPT-PT)
    * 現在多くのインターネットサービスは IPv4 で提供されている。このため、IPv4 で提供されているサービスが IPv6 から利用できないとなると、IPv6 環境を構築するメリットが小さくなってしまう
    * これを解決するために考えられた仕組みの 1 つが NAT-PT(NAPT-RT)
    * NAT-PT は IPv6 ヘッダと IPv4 ヘッダを付け替える技術
    * これにより、IPv6 しか設定されていないホストでも、IPv4 の環境と通信できるようになる
  * NAT の問題点
    * NAT(NAPT) には変換テーブルがあるため、次のような制限が発生する
      * NAT の外側から内側のサーバーに接続することはできない
      * 変換テーブルの作成や変換処理のオーバーヘッドが生じる
      * NAT が異常動作して再起動した時は、すべての TCP コネクションがリセットされる
      * NAT を 2 台用意して故障時に切り替えるようにしても、TCP コネクションは必ず切れる
  * NAT の問題点の解決と NAT 超え
    * NAT の問題点を解決する方法は主に 2 つ
      * 1 つは IPv6 を使う方法
        * これでアドレス不足の問題が解決するため、NAT を使う必要がなくなる
        * しかし、現時点で IPv6 の普及は進んでいない
      * もう 1 つは NAT がある環境を前提にアプリケーションを作成すること
        * これにより、NAT があってもユーザーはそのことを意識することなく通信できるようになる
        * NAT の内側(プライベート IP アドレス側)のホストで動かしているアプリケーションが、NAT の変換テーブルを作成するために、ダミーのパケットを NAT の外側(グローバル IP アドレス側)に向かって送信する
        * NAT はダミーのパケットとはわからずに、変換テーブルを作成する
        * これで別々のネットワークにある NAT の内側のホスト同士の間でも通信できるようになる
        * このように NAT があっても NAT の外側と内側が通信できるようになることを「NAT 超え」という
    * しかし NAT フレンドリーなアプリケーションには問題点もある
      * 仕組みが複雑になるため、作成に手間がかかる
      * アプリケーションを作成した人が想定しない環境では動作しない
      * トラブルが起きた時に原因を特定するのが難しい
* IP トンネリング
  * 通常 IP ヘッダの次には TCP や UDP などの上位層のヘッダが続く
  * しかし「IP ヘッダの次に IP ヘッダ」や「IP ヘッダの次に IPv6 ヘッダ」が続くような利用法が増えている
  * このようにネットワーク層のヘッダの次にまたネットワーク層(や下位層)のヘッダが続く通信方法が「IP トンネリング」
  * IP トンネリングの意義
    * IPv4、IPv6 の 2 つのプロトコルに対応したネットワークを構築しようとすると、ルーティングテーブルの量が 2 倍になるため、管理者の負担はとても大きくなる
    * この場合にトンネリングを使うと運用管理が楽になる
    * バックボーンは IPv6 または IPv4 パケットだけを転送し、対応していないルーターはトンネリングを使って通過できるようにする
    * これにより、IP アドレスを片方しか管理しなくてよくなる
* その他の IP 関連技術
  * IP マルチキャスト関連技術
    * マルチキャストによる通信では、受信者がいるかどうかの確認が重要になる
      * 受信者がいないのに、そのネットワークに対してマルチキャストパケットを送り続けるのは無駄になるため
    * 受信者がいるかどうかの通知には IPv4 では IGMP(Internet Group Management Protocol)、IPv6 では ICMPv6 の機能の 1 つである MLD(Multicast Listener Discovery) が使われる
    * IGMP(MLD) には主に 2 つの役割がある
      * ルーターにマルチキャストを受信したいと伝える
      * スイッチングハブに受信したいマルチキャストアドレスを通知
        * IGMP(MLD) スヌーピングという
        * IGMP(MLD) スヌーピングに対応したスイッチングハブは、マルチキャストフレームのフィルタリングが可能になり、ネットワークの負荷を下げることができる
  * IP エニーキャスト
    * IP エニーキャストは、同じサービスを提供するサーバーに同じ IP アドレスをつけて、日本なら日本のサーバー、米国なら米国のサーバーというように、最寄りのサーバーと通信できるようにする方法
    * IP エニーキャストで運用されている最も有名なサービスは DNS のルートネームサーバー
    * IP エニーキャストは便利な仕組みだが、制限事項もある
      * 例えば 1 つ目のパケットと 2 つ目のパケットが同じホストに届く保証がない
  * 通信品質の制御
    * 通信の品質とは
      * IP プロトコルはもともと「ベストエフォート」のプロトコルとして設計、開発され「通信品質の保証を提供する仕組みがない」ものだった
      * ベストエフォート型の通信には、通信回線が混雑すると通信性能が極端に低下してしまうという問題がある
      * しかし、近年では動画や音声などのリアルタイム性が要求される通信サービスが普及してきたこともあって、IP を使った通信サービスの品質を保証するための技術がこれまで以上に求められている
    * 通信品質を制御する仕組み
      * 通信品質を保証したいパケットについては、ルーターなどで特別扱いをして、保証できる範囲内で優先的に処理する
      * 通信品質を制御する仕組みとして提案されている技術には、RSVP(Resource Reservation Protocol) を用いてエンドツーエンドできめ細かい優先制御を提供する IntServ と、相対的でおおざっぱな優先制御を提供する DiffServ がある
    * IntServ
      * 特定のアプリケーション間の通信に対して通信品質の制御を提供する仕組み
      * 特定のアプリケーションとは、送信元 IP アドレス・宛先 IP アドレス・送信元ポート番号・宛先ポート番号・プロトコル番号の 5 つが同じもの
      * IntServ は必要なときにだけ経路上のルーターに品質制御の設定を行う
        * これを「フローのセットアップ」といい、実現するプロトコルが RSVP
      * ただし、RSVP の仕組みは複雑で大規模なネットワークになると実装や運用が難しいので、もう少し柔軟で実用的な手法が望まれるようになった
        * これが DiffServ
    * DiffServ
      * IntServ がきめ細かく通信品質を制御するのに対して、DiffServ は特定のネットワーク内でおおざっぱに通信品質を制御するのが目的
      * 例えば、特定のプロバイダの中だけで、顧客ごとにランク付けをして、パケットに対する優先制御を行う
      * DiffServ により通信品質を制御するネットワークを DiffServ ドメインという
      * DiffServ ドメインの境界にあるルーターは、DiffServ ドメインの中に入ってくる IP パケットのヘッダの中にある DSCP フィールドを書き換える
        * 優先制御を望む顧客のパケットに対しては優先される値を設定し、そうでない顧客のパケットに対しては優先されない値を設定する
        * DiffServ ドメインの内部にあるルーターは、IP ヘッダの DSCP フィールドの値を見て優先されるパケットを優先的に処理する
        * 優先度が低いパケットほど輻輳発生時に廃棄されやすくなる
  * 明示的な輻輳通知
    * 輻輳が起きた場合、データパケットを送信しているホストは送信量を減らす必要がある
    * IP の上位層である TCP には輻輳制御があるが、輻輳が発生しているかどうかをパケットの喪失の有無で判断している
      * しかし、この方法ではパケットが喪失する前にパケットの送信量を減らすことができない
    * これを解決するために IP パケットを使った明示的な輻輳通知の機能ができた。これが ECN(Explicit Congestion Notification)
    * ECN では輻輳通知機能を実現するため、IP ヘッダの TOS フィールドを置き換えて ECN フィールドを定義し、TCP ヘッダの予約ビットに CWR(Congestion Window Reduced) フラグと ECE(ECN-Echo) フィールドを追加している
    * ECN では行きのパケットの IP ヘッダにルーターが輻輳していたかどうかを記録し、帰りのパケットの TCP ヘッダで輻輳が起きていたかどうかを伝えるメカニズムになっている
  * Mobile IP
    * Mobile IP とは
      * スマートフォンやラップトップ型のコンピュータを持ち歩く場合、違うサブネットに接続するたびに IP アドレスが変わると通信は継続できない
      * アプリケーションが IP アドレスの変更に対応するよう作れば解決できるかもしれないが、利用するアプリケーションのすべてを対応させるのは困難
      * そこで登場したのが Mobile IP
        * Mobile IP とは、ホストが接続しているサブネットが変わっても IP アドレスが変わらないようにする技術
    * IP トンネリングと Mobile IP
      * Mobile IP の仕組み
        * 1: ホームエージェントが移動ホストのふりをして、移動ホスト宛てのパケットを受信する
        * 2: トンネリングを使って、ホームエージェントから移動ホストへパケットを転送
        * 3: 外部エージェントはトンネリングに使用した IP ヘッダを削除し、元のパケットに戻す
        * 4: 移動ホストがパケットを受け取る(移動ホストから通信相手のホストに送る時は通常通り)
    * Mobile IPv6
      * Mobile IP にはいくつか問題点がある
        * 外部エージェントが存在しないネットワークには移動できない
        * IP パケットが三角形のルートを取ることになり、効率が悪い
      * Mobile IPv6 ではこうした問題を解決するように仕様が決められた
        * 外部エージェントの機能は、Mobile IPv6 を実装した移動ホスト自身が担う
        * 経路最適化により、ホームエージェントを経由しないで直接通信できる
        * IPv6 の送信元 IP アドレスには気付けアドレスを付けて、ファイアウォールで廃棄されないようにする
      * これら全ての機能を利用するためには、移動ホストだけでなく、通信相手のホストが Mobile IPv6 に必要となる機能をサポートしている必要がある

### 6: TCP と UDP

* トランスポート層の役割
  * TCP/IP には TCP と UDP という 2 つの代表的なトランスポートプロトコルがある
  * TCP は信頼性のある通信を提供し、UDP は同報通信や細かい制御をアプリケーションに任せたほうがよい通信に用いられる
  * トランスポート層とは
    * IP ヘッダにはプロトコルフィールドが定義されていて、ここでどのトランスポートプロトコルにデータを渡すか(TCP なのか UDP なのか)が示されている
    * 同様にトランスポート層である TCP や UDP でも自分が運ばれているデータを次にどのアプリケーションに渡せばよいかを識別するための番号が定義されている
    * 郵便物に住所だけでなく氏名を明記する必要があるように、TCP/IP による通信でも通信する「プログラム」を指定する必要がある
      * トランスポート層はこのプログラムを指定する役割を持っている
  * 通信の処理
    * 要求がどのサーバーへ向けられたものか判断するために、受信したパケットの宛先ポート番号を調べる
  * 2 つのトランスポートプロトコル TCP と UDP
    * TCP(Transmission Control Protocol)
      * TCP はコネクション指向で、信頼性のあるストリーム型のプロトコル
      * ストリームとは切れ目のないデータ構造のこと
    * UDP(User Datagram Protocol)
      * UDP は信頼性のないデータグラム型のプロトコル
      * 送信した時のメッセージの大きさは保たれるが、パケットが到達する保証がないため、必要に応じてアプリケーションがメッセージの再送処理をしないといけない
  * ソケット
    * TCP や UDP を利用して通信する時は、ソケットと呼ばれる API が広く使われる
    * アプリケーションはソケットを利用して、通信相手の IP アドレスやポート番号を設定したり、データの送信や受信の要求をする
* ポート番号
  * ポート番号とは
    * トランスポートプロトコルにもアドレスのようなものがある。それがポート番号
    * 同一のコンピュータ内で通信を行っているプログラムを識別する時に利用される
  * IP アドレスとポート番号とプロトコル番号による通信の識別
    * TCP/IP や UDP/IP による通信では「宛先 IP アドレス」、「送信元 IP アドレス」、「宛先ポート番号」、「送信元ポート番号」、「プロトコル番号」の 5 つの数字の組み合わせで通信を識別する
  * ポート番号の決め方
    * 2 種類の方法がある
    * 標準で決められている番号
      * 静的に決定する方法
      * アプリケーションごとにどのポート番号を使うかを固定的に決める
        * ただし、どの番号を使ってもよいわけではない。番号ごとに使う目的が決められている
        * Well-known ポート番号には 0 - 1023 までの番号が割り当てられているので、これらの番号は別の用途に使わないほうがよい
    * ダイナミックな割り当て法
      * 動的に割り当てる方法
      * サービスを提供する側(サーバー)はポート番号が決まっている必要があるが、クライアント側のポート番号は必ずしも決まっている必要はない
      * この時にクライアントアプリケーションは、自分のポート番号を決定せずに OS に任せることができる
  * ポート番号とプロトコル
    * ポート番号は使用されるトランスポートプロトコルごとに決定される
      * そのため、異なるトランスポートプロトコルの場合は、同じポート番号を使用することができる
    * ただ、Well-known ポート番号はトランスポートプロトコルに関係なく、同じ番号が同じアプリケーションに割り当てられている
* UDP(User Datagram Protocol)
  * UDP の目的と特徴
    * UDP は複雑な制御は提供せず、IP を用いてコネクションレスの通信サービスを提供する
    * UDP はネットワークが混雑していても送信量を抑制するような輻輳を回避する制御を行うことはない
      * パケットが失われても再送制御は行わない
      * パケットの到着順序が入れ替わっても直す機能はない
    * これらの制御が必要な時には、UDP を利用するアプリケーションプログラムが行わなければならない
    * 次のような用途に向いている
      * 総パケット数が少ない通信(DNS、SNMP など)
      * 動画や音声などのマルチメディア通信(即時性が必要な通信)
      * LAN などの特定のネットワークに限定したアプリケーションの通信
      * 同報性が必要な通信(ブロードキャスト、マルチキャスト)
* TCP(Transmission Control Protocol)
  * TCP は UDP と大きく異なり、データを送信する時の制御機能が充実している
  * TCP の目的と特徴
    * TCP では、チェックサムやシーケンス番号、確認応答、再送制御、コネクション管理、ウィンドウ制御などにより信頼性のある通信を実現している
  * シーケンス番号と確認応答で信頼性を提供
    * TCP では送信したデータが受信ホストに到達した時、受信ホストは送信ホストにデータが到達したことを知らせる
      * これを確認応答(ACK)という
      * 伝わらなかったことを相手に伝えることを否定確認応答(NACK)という
    * TCP の場合、肯定確認応答(ACK)でデータ到達の信頼性を実現する
    * 確認応答処理や再送制御、重複制御などはすべてシーケンス番号を使って行われる
      * シーケンス番号は送信するデータ 1 オクテット毎に付けられる連続した番号
      * 受信側では、受信したデータパケットの TCP ヘッダに書き込まれているシーケンス番号とデータ長を調べ、次に自分が受信すべき番号を確認応答として返答する
  * 再送タイムアウトの決定
    * 再送せずに確認応答の到着を待つ時間を再送タイムアウト時間という
      * この時間を経過しても確認応答が到着しなかった場合にはデータを再送する
    * では、確認応答を待つ時間はどのくらいが適切か？
      * 理想的なのは「この時間が経過したら確認応答が返ってくることはない」といえる最小時間
      * TCP では利用環境を問わずに高性能な通信を実現できるようにするため、パケットを送信するたびにラウンドトリップ時間とその揺らぎを計測する
      * そして計測したラウンドトリップ時間と揺らぎの時間を合計した値よりも少し大きな値を再送タイムアウト時間にする
      * また、データの再送を無限に繰り返すことはせず、特定の回数再送を繰り返しても確認応答がない場合には、強制的にコネクションを切断する
  * コネクション管理
    * TCP はデータ通信前に TCP ヘッダだけからなるコネクション確立要求のパケット(SYN パケット)を送信して確認応答を待つ
    * また通信が終了した時にはコネクションの切断処理を行う(FIN パケット)
  * TCP はセグメント単位でデータを送信
    * TCP ではコネクションの確立時に通信を行うデータ単位を決定する
    * これを最大セグメント長(MSS: Maximum Segment Size)と呼ぶ
      * 理想的な最大セグメント長は IP で分割処理されない最大のデータ長
    * お互いのホストは、コネクション確立要求を送る際に TCP ヘッダに MSS オプションを付け、自分のインタフェースに適した MSS を通知する
      * 両者のうち、小さい方の値が MSS として利用される
  * ウィンドウ制御で速度向上
    * TCP の 1 セグメントごとに確認応答を行った場合、パケットの往復時間が長くなると通信性能が悪くなる
    * そこでウィンドウという概念を取り入れて、パケットの往復時間が長くなっても性能が低下しないように制御している
      * セグメント単位ではなく、もっと大きな単位で確認応答に対処する
      * 確認応答を待たずに送信できるデータの大きさをウィンドウサイズという
  * ウィンドウ制御と再送制御
    * 確認応答が失われた場合
      * ウィンドウ制御をする場合には、ある程度の確認応答が失われても再送する必要はない
    * 送信セグメントが失われた場合
      * 同じ確認応答が続く
      * 1 度受け取った確認応答と同じものをさらに 3 回連続して受け取った場合には、その確認応答が示しているデータを再送する
  * フロー制御(流量制御)
    * 送信側は自分の都合でデータパケットを送信するが、受信側は自分の都合に関係なくデータパケットが送られてくるため、負荷が高い時にはデータを受信しきれなくなる可能性がある
    * これを防ぐため、TCP では送信側は受信側の受信能力にあわせてパケット送信量を制御する
      * これがフロー制御
    * 受信ホストが送信ホストに受信可能なデータサイズを通知するようになっていて、そのサイズを超えないようにデータを送る
      * このサイズが前項で説明したウィンドウサイズとなる
    * ウィンドウサイズが 0 になった後は、通信不能になる可能性があるため、送信ホストはウィンドウローブと呼ばれる 1 オクテットのでーただけを含むセグメントを時々送信して、ウィンドウサイズの最新情報を得るようにする
  * 輻輳制御
    * 通信開始時にいきなり大量のパケットを送信すると問題が発生する可能性がある
    * TCP では、これを防ぐため通信開始時にスロースタートと呼ばれるアルゴリズムに従って、データの送信量の制御が行われる
  * ネットワークの利用効率を高める仕組み
    * Nagle アルゴリズム
      * ネットワークの利用効率を高めるために使うアルゴリズム
      * 送信側に送信すべきデータがあったとしても、そのデータが少ない場合には送信を遅らせる
      * 次の状態のどちらかに当てはまる場合にだけ TCP はデータセグメントを送信する
        * すべての送信済みデータが確認応答されている場合
        * 最大セグメント長(MSS)のデータを送信できる場合
    * 遅延応答確認
      * データを受信したホストがすぐに確認応答すると、小さなウィンドウを返す可能性がある
        * 受信したばかりのデータで受信バッファがいっぱいになるため
      * 小さなウィンドウを通知された送信ホストがその大きさでデータを送ると、ネットワークの利用効率が悪くなる
      * そこでデータを受信してもすぐに確認応答をせずに遅延させる方法が考え出された
    * ピギーバック
      * アプリケーションプロトコルによっては、送信したメッセージに対して相手が処理をして返す場合がある
      * このような通信の場合には、TCP では確認応答と返事のデータパケットを 1 つのパケットで送ることができる
    * TCP を利用するアプリケーションプログラムが行わなければならない
      * アプリケーションが細かい制御をしたほうがよい場合には、UDP を使うのがよい
      * データの転送量が比較的多く、信頼性を必要としているが難しいことをできるだけ考えたくない場合には TCP を使うのがよい
      * TCP や UDP にはそれぞれ長所や短所があるので、アプリケーションを作成する時にはシステムの設計者がきちんと考えてプロトコルを選定する必要があります
  * その他のトランスポートプロトコル
    * UDP-Lite(Lightweight User Datagram Protocol)
      * UDP-Lite は、UDP の機能を拡張したトランスポートプロトコル
      * UDP-Lite は UDP とほぼ同じ機能を提供するが、チェックサムを計算する範囲をアプリケーションが決められる
    * SCTP(Stream Control Transmission Protocol)
      * SCTP は TCP と同様にデータの到達性に関する信頼性を提供するトランスポートプロトコル
      * 主な特徴
        * メッセージ単位の送受信
        * マルチホーミングに対応
          * マルチホーミング: 機器や組織内ネットワークを複数の異なる経路を通じてインターネットに接続すること
        * 複数のストリームの通信
        * メッセージの生存時間を定義できる
  * DCCP(Datagram Congestion Control Protocol)
    * DCCP は UDP を補うプロトコルとして登場した
    * 特徴
      * UDP と同様に、データの到達性に関する信頼性はない
      * コネクション指向で、コネクションの確立と切断処理があり、信頼性がある
      * ネットワークの混雑にあわせ、輻輳制御を行える
      * 輻輳制御を行うため、パケットを受信した側は確認応答(ACK)を返す
* UDP ヘッダのフォーマット
  * 送信元ポート番号
  * 宛先ポート番号
  * パケット長
  * チェックサム
* TCP ヘッダのフォーマット
  * 送信元ポート番号
  * 宛先ポート番号
  * シーケンス番号
  * 確認応答番号
  * データオフセット
    * TCP が運んでいるデータが、TCP パケットの先頭のどこから始まるのかを意味する
  * 予約
    * 将来の拡張のために用意されているフィールド
  * コントロールフラグ
    * 制御ビットととも呼ばれる
    * CWR(Congestion Window Reduced)
      * IP ヘッダの ECN フィールドとともに使われ、輻輳ウィンドウを小さくしたことを相手に伝える
    * ECE(ECN-Echo)
      * 通信相手に、相手側からこちら側に向かうネットワークが輻輳していることを伝える
    * URG(Urgent Flag)
      * 「1」の場合は、緊急に処理すべきデータが含まれていることを示す
    * ACK
      * 「1」の場合は、確認応答番号のフィールドが有効であることを示す
    * PSH(Push Flag)
      * 「1」の場合は、受信したデータをすぐに上位のアプリケーションに渡さなければならない
    * RST(Reset Flag)
      * 「1」の場合は、コネクションが強制的に切断される
    * SYN(Synchronize Flag)
      * コネクションの確立に使われる
    * FIN(Fin Flag)
      * 「1」の場合は、今後送信するデータがないことを意味し、コネクションを切断したいという意志を示す
  * ウィンドウサイズ
  * チェックサム
  * 緊急ポインタ
    * 緊急を要するデータの格納場所を示すポインタとして扱われる
  * オプション

### 7: ルーティングプロトコル(経路制御プロトコル)

* 経路制御(ルーティング)とは
  * IP アドレスと経路制御
    * パケットを正しく宛先ホストへ届けるためには、ルーターが正しい方向へパケットを転送しないといけない
    * この正しい方向へパケットを転送するための処理を経路制御、またはルーティングと呼ぶ
    * ルーターは経路制御表(ルーティングテーブル)を参照してパケットを転送する
  * スタティックルーティングとダイナミックルーティング
    * スタティックルーティング
      * ルーターやホストに固定的に経路情報を設定する方法
    * ダイナミックルーティング
      * ルーティングプロトコルを動作させ、自動的に経路情報を設定する方法
    * 一長一短がある
      * スタティックルーティングの場合、数が多くなると、管理者に大きな負担がかかる
      * また、ネットワーク障害が発生した時に、自動的に障害地点を迂回するような制御ができない
      * ダイナミックルーティングの場合、管理者はルーティングプロトコルの設定をしなければいけない
    * どちらか一方しか利用できないわけではなく、組み合わせて利用することも可能
  * ダイナミックルーティングの基礎
    * ダイナミックルーティングは、隣り合うルーター間で自分が知っているネットワークの接続情報を教え合うことによって行われる
    * 情報がバケツリレー式に伝えられ、ネットワークの隅々まで伝わると、経路制御表が完成し、IP パケットを正しく転送できるようになる
* 経路を制御する範囲
  * 自律システムとルーティングプロトコル
    * 経路制御に関するルールを決めて、それをもとに運用する範囲を自律システムや経路制御ドメインという
    * これは同一の決まり、考え方によって経路制御を管理する単位
    * 自律システムの具体例としては、地域ネットワークや大きな ISP などが挙げられる
    * 自律システムの内部でダイナミックルーティングに利用されるのが、ドメイン内ルーティングプロトコル。つまり IGP(Interior Gateway Protocol)
    * 自律システム間の経路制御に利用されるのが、ドメイン間ルーティングプロトコル。つまり EGP(Exterior Gateway Protocol)
  * EGP と IGP
    * ルーティングプロトコルは大きく EGP と IGP の 2 つに分類される
    * EGP によって地域ネットワークやプロバイダ間の経路制御などが行われ、IGP によって地域ネットワークやプロバイダ内部のどのホストなのかが識別される
* 経路制御アルゴリズム
  * 経路制御のアルゴリズムには代表的なものが 2 つある。距離ベクトル型とリンク状態型
  * 距離ベクトル型(Distance-Vector)
    * 距離と方向によってネットワークやホストの位置を決定する(経路制御表を作成する)
    * 処理が比較的簡単だが、ネットワークの構造が複雑になると、経路制御情報が安定するまでに時間がかかる、また経路にループが生じやすくなるといった問題がある
  * リンク状態型(Link-State)
    * リンク状態型は、ルーターがネットワーク全体の接続状態を理解して経路制御表を作成する方法
    * ネットワークが複雑になっても、各ルーターは正しい経路制御情報を持つことができ、安定した経路制御を行える
    * その代償として、計算はかなり複雑
      * 高い CPU 能力と多くのメモリ資源が必要になる
  * 主なルーティングプロトコル
    * RIP、OSPF、BGP などがある
* RIP(Routing Information Protocol)
  * RIP は距離ベクトル型のルーティングプロトコルで、LAN で広く利用されている
  * 経路制御情報をブロードキャストする
    * RIP は経路制御情報を定期的にネットワーク上にブロードキャストする
    * 経路制御情報の送信間隔は 30 秒周期
      * この経路制御情報が来なくなったら接続が切れたと判断する
      * ただし、パケットが失われた可能性もあるので、5 回まではパケットを待つ
  * 距離ベクトルにより経路を決定
    * 距離の単位はホップ数
      * ホップ数とは通過するルーターの数
    * RIP ではできるだけ少ない数のルーターを通過して、目的の IP アドレスに到達するように制御される
  * サブネットマスクを利用した場合の RIP の処理
    * RIP ではサブネットマスクの情報を交換しないが、サブネットマスクを使っているネットワークでも利用できる
  * RIP で経路が変更される時の処理
    * 過去に伝えた情報を逆に教えられ、それをお互いに伝えあってしまう問題を無限カウントと呼ぶ
    * この問題を解決するために以下の 2 つの方法が取られる
      * 距離 16 を通信不能とする。これにより、無限カウントが発生してもその時間を短くできる
      * 経路情報を教えられたインタフェースには、教えられた経路情報を流さない。これをスプリットホライズン(Split Holizon)と呼ぶ
    * しかし、巡回がある場合に通信障害が発生すると、上記の対応では解決しない
      * これをできるだけ解決するためにポイズンリバース(Poisoned Reverse)とトリガードアップデート(Triggered Update)という 2 つの方法が利用される
    * ポイズンリバース
      * 経路が切れた時、その情報を流さないのではなく、通信不能であることを表す距離 16 として流す
    * トリガードアップデート
      * 情報が変化した時、30 秒待たずにすぐに伝える
    * しかし、ここまでに説明した方法を利用しても、ループが何重にもなる複雑な構造のネットワークの場合には経路情報が安定するまでに時間がかかることがある
  * RIP2
    * RIP2 は RIP のバージョン 2 のこと
    * 以下の機能が付加されている
      * マルチキャスト使用
      * サブネットマスク対応
      * ルーティングドメイン
      * 外部ルートタグ
      * 認証キー
  * OSPF(Open Shortest Path First)
    * OSPF は OSI の IS-IS(Intermediate System to Intermediate System Intra-Domain routing information exchange protocol)プロトコルを参考にして作られたリンク状態型のルーティングプロトコル
    * リンク状態型を採用したため、ループのあるネットワークでも安定した経路制御を行える
    * また、OSPF ではサブネットマスクをサポートしている
    * さらに、トラフィックを軽減させるために、エリアの概念が導入された
      * エリアはネットワークの論理的な領域を意味し、ネットワークをエリアにわけることにより、不必要なルーティングプロトコルのやり取りを減少させる
    * OSPF では各リンクに重みをつけることができ、この重みが小さくなるように経路が選択される
    * OSPF の基礎知識
      * OSPF では、同一リンクに接続されているルーターを隣接ルーターと呼ぶ
      * ルーターが 1 対 1 で接続されるネットワークの場合には、隣接ルーター間で経路情報が交換されるが、イーサネットや FDDI など複数のルーターが同一リンクに接続されている時には、すべての隣接ルーター間で経路情報が交換されるわけではなく、指名ルーターが決められ、そのルーターを中心に経路制御情報が交換される
      * RIP ではパケットの種類は 1 つだったが、OSPF では役割ごとに 5 種類のパケットを用意している
    * OSPF の動作の概要
      * OSPF では接続の確認をするプロトコルを HELLO プロトコルという
      * リンク状態更新パケットで伝える情報には大きく 2 つある
        * ネットワーク LSA(Network Link State Advertisement) と ルーター LSA(Router Link State Advertisement)
        * ネットワーク LSA は、ネットワークを中心にして作成した情報で、そのネットワークにはどのルーターが接続されているかを表す
        * ルーター LSA はルーターを中心にして作成した情報で、そのルーターにはどのネットワークが接続されているかを表す
      * 主にこの 2 種類の情報が OSPF によって送られてくると、それぞれのルーターはネットワークの構造を表すリンク状態データベースを作成する
        * このデータベースをもとにして、経路制御表を作成する
* BGP(Border Gateway Protocol)
  * BGP は組織間を接続する時に利用されるプロトコルで、EGP に分類される
  * BGP と AS 番号
    * BGP では通過する AS の数をもとに経路制御を行う
    * ISP や地域ネットワークなど、組織を束ねるネットワーク集団を 1 つの自律システム(AS: Autonomous System)として取り扱う
      * それぞれの自律システム毎に 16 ビットの AS 番号が割り当てられる
    * BGP では、この AS 番号を使って経路制御が行われる
  * BGP は経路ベクトル
    * BGP により経路制御情報を交換するルーターを BGP スピーカーという
    * BGP では、目的とするネットワークアドレスにパケットを送った場合に、そこに到達するまでに通過する AS 番号のリストが作られる
      * これを AS 経路リストという
      * 同じ宛先への経路が複数ある場合には、通常、短い方のルートが選択される
    * このように通過する経路のリストで経路制御を行うプロトコルを、経路ベクトル型(Path Vector)という
* MPLS(Multi Protocol Label Switching)
  * 現在 IP パケットの転送には、ルーティングだけでなく、ラベルスイッチングという技術も利用される
  * ルーティングでは IP アドレスに基づいて最長一致によりパケットの転送をするが、ラベルスイッチングでは、それぞれの IP パケットに「ラベル」という別の値を設定し、そのラベルに基づいて転送する
  * ラベルスイッチングの代表が MPLS
  * ただし、ラベルに基づいた転送は、通常のルーターでは処理できないため、MPLS はインターネット全体で利用できる技術ではない
  * MPLS ネットワークの動作
    * MPLS 機能に対応したルーターを LSR(Label Switching Router)と呼ぶ
      * 特に外部のネットワークとの接続部分にあたるエッジの LSR を LER(Label Edge Router) と呼ぶ
      * この LER で MPLS タグをパケットに付与したり、はがしたりする
    * MPLS では宛先や扱いの同じパケットは、どれもラベルによって決まる同一の道筋を通ることになる
      * この道筋を LSP(Label Switch Path) と呼ぶ
  * MPLS の利点
    * 転送処理の高速化
      * MPLS では固定長のラベルを使用するため、処理が単純になり転送処理のハードウェア化による高速化が可能
      * また、ラベルは必要な数だけ設定すればよいので、処理するデータ量が少なくて済む
    * ラベルを利用して仮想的なパスを張り、その上で IP などのパケットを使った通信ができる
      * これにより、ベストエフォートサービスと呼ばれる IP ネットワークであっても、MPLS を利用した通信品質の制御や帯域保証、VPN などが提供できる

### 8: アプリケーションプロトコル

* アプリケーションプロトコルの概要
  * この章で扱うアプリケーションプロトコルは、OSI 参照モデルの第 5 層 - 第 7 層に相当する上位層のプロトコル
  * アプリケーションプロトコルとは
    * アプリケーションプロトコル特有の通信処理を行うのがアプリケーションプロトコル
* 遠隔ログイン(TELNET と SSH)
  * 遠隔ログインは TSS(Time Sharing System) のような環境を実現するアプリケーション
  * 遠隔ログインには、TELNET プロトコルや SSH プロトコルが使われる
  * TELNET
    * TELNET は TCP のコネクションを 1 つ利用する
    * この通信路を通して相手のコンピュータにコマンドが文字列として送信され、相手のコンピュータで実行される
    * TELNET のサービスは 2 つの基本サービスに分けられる
      * ネットワーク仮想端末の機能と、オプションのやり取りをする機能
  * SSH
    * SSH は暗号化された遠隔ログインシステム
    * TELNET ではログイン時のパスワードが暗号化されずに送信されるため、通信を盗聴されると不正侵入される危険性があった
    * SSH を使用すると、通信内容が暗号化されるため、盗聴されてもパスワードや入力したコマンド、コマンドの処理結果がわからなくなる
    * SSH の便利な機能
      * より強固な認証機能を利用できる
      * ファイルの転送ができる
      * ポートフォワード機能が利用できる
        * ポートフォワード: 特定のポート番号に届けられたメッセージを、特定の IP アドレス、ポート番号に転送する仕組み
* ファイル転送(FTP)
  * FTP は異なるコンピュータ間でファイルを転送する時に使われるプロトコル
  * FTP の仕組みの概要
    * FTP では 2 つの TCP コネクションが利用される
      * 1 つは制御用、もう 1 つはデータ(ファイル)の転送用
    * 制御用の TCP コネクションは FTP の制御に利用される
      * ログインのためのユーザー名やパスワードの確認
      * 転送するファイル名や転送方法の指示
* 電子メール(E-Mail)
  * 電子メールの仕組み
    * 電子メールサービスを提供するためのプロダクトが SMTP(Simple Mail Transfer Protocol)
    * SMTP ではメールを効率よく確実に相手に届けるために、トランスポートプロトコルとして TCP を利用している
    * 初期の電子メールでは、電子メールの送信者が利用しているコンピュータと宛先のコンピュータの間で、直接 TCP コネクションが張られて電子メールが配送されていた
      * これは信頼性を高める上では良い仕組みだったが、両方の電源が入っていないと到達しない
    * いまでは直接 TCP 接続をするのではなく、電源を切らないメールサーバーを経由するようになった
      * そして、受信者がメールサーバーから電子メールを受け取る POP(Post Office Protocol) というプロトコルが標準化された
    * 電子メールの仕組みは 3 つの要素から構成される
      * メールアドレス、データ形式、転送プロトコル
  * メールアドレス
    * 電子メールの住所はドメイン名と同じ構造
    * 電子メールの配送先の管理は DNS によって行われる
      * DNS にはメールアドレスと、そのメールアドレス宛のメールを送信すべきメールサーバーのドメイン名を登録できる
      * これを MX レコードと呼ぶ
  * MIME(Multipurpose Internet Mail Extensions)
    * 長い間、電子メールはテキスト形式しか扱えなかった
    * しかし現在は、電子メールで転送できるデータ形式を拡張する MIME が一般的になり、静止画や動画、音声、プログラムファイルなど、様々な情報を送れる
    * この MIME は OSI 参照モデルに当てはめるなら第 6 層のプレゼンテーション層に相当する
    * MIME は基本的にヘッダと本文(データ)の 2 つから構成される
      * ヘッダには空行があってはならず、空行があるとそこから後ろは本文になる
    * 「Content-Type」でヘッダに続く情報がどのような種類のデータなのかを示している
  * SMTP(Simple Mail Transfer Protocol)
    * SMTP は電子メールを配送するアプリケーションプロトコル
    * TCP のポート番号は 25 番が利用される
    * SMTP は 1 つの TCP コネクションを確立して、そのコネクション上で制御や応答、データからなるメッセージの転送を行う
  * POP(Post Office Protocol)
    * 電子メールを受信するためのプロトコル
    * メールは送信者から SMTP によって常時電源が入っている POP サーバーまで到着する
    * クライアントは POP によって POP サーバーに保存された相手からのメールを取り出す
      * 他人にメールを盗み取られることを防ぐために、ユーザーの認証も行う
  * IMAP(Internet Message Access Protocol)
    * IMAP は POP と同様に、電子メールなどのメッセージを受信(取得)するためのプロトコル
    * POP の場合は電子メールの管理をクライアント側で行うが、IMAP の場合はサーバー側で管理を行う
    * IMAP を使用すると、サーバー上の電子メールの全てをダウンロードしなくても電子メールを読める
    * 複数のコンピュータでメールを読む環境で便利
* WWW(World Wide Web)
  * インターネットブームの火付け役
    * WWW はインターネット上の情報をハイパーテキスト形式で参照できる情報提供システム
  * WWW の基本概念
    * WWW では大きく 3 つの定義が行われている
      * 情報へのアクセス手段と位置の定義
        * URI(Uniform Resource Identifier)
      * 情報の表現フォーマットの定義
        * HTML(HyperText Markup Language)
      * 情報の転送などの操作の定義
        * HTTP(HyperText Transfer Protocol)
  * URI
    * 資源を表す表記法(識別子)として利用される
    * URI が表す枠組みをスキームという
      * WWW では主に URI スキームのうちの http や https を使って Web ページの位置を表したり、Web ページへのアクセス方法を表したりする
    * この表記法により、インターネット全体で特定のデータを一意に決定できる
  * HTML
    * HTML は Web ページを記述するための言語(データ形式)
    * HTML にはハイパーテキストと呼ばれる機能がある
      * 画面に表示する文字や絵にリンクを張り、そこがクリックされた時に別の情報を表示する機能で、インターネット上のどの WWW サーバーの情報にもリンクを張れる
    * OSI の参照モデルに照らし合わせるなら、HTML は WWW のプレゼンテーション層
  * HTTP
    * ユーザーがブラウザに Web ページの URI を入力すると、HTTP の処理が開始される
    * まず、クライアントからサーバーへポート 80 番で TCP のコネクションの確立が行われる
    * その TCP の通信路を利用して、コマンドや応答、データからなるメッセージの送受信が行われる
  * JavaScript、CGI、Cookie
    * JavaScript
      * Web の基本要素は URI、HTML、HTTP ですが、これだけでは条件に応じて動的に表示する内容を変更できない
      * そこで、Web ブラウザ側やサーバー側でプログラム処理を行うことで、多彩なサービスを実現できるようになった
      * JavaScript は HTML に埋め込めるプログラミング言語で、クライアントサイドアプリケーションとして、多くの種類の Web ブラウザ上で動作する
    * CGI
      * CGI は Web サーバーが外部プログラムを呼び出すサーバーサイドアプリケーションの仕組み
      * CGI を使うとユーザーの操作に応じて様々に変化する情報(動的な情報)を転送できる
    * Cookie
      * Web アプリケーションではユーザーの情報を識別するために、Cookie と呼ばれる仕組みが使われる
      * Cookie は Web サーバーがクライアント側に情報を格納するために使用する
* ネットワーク管理(SNMP)
  * SNMP(Simple Network Management Protocol)
    * TCP/IP のネットワーク管理では SNMP が必要な情報の取得などを行うために利用される
    * 初期の SNMP ではセキュリティ機能が不十分
    * SNMPv3 では、SNMP が持つべきすべての機能を同一のバージョンの SNMP で実現するのではなく、個別の機能として定義し、さまざまなバージョンの組み合わせで通信できるようにした
      * 「メッセージ処理」「セキュリティ」「アクセスコントロール」部分を分けて考え、それぞれに必要な仕組みを選択できるようにしている
    * 通常は、参照要求・応答によって定期的に機器の動作をチェックしたり、設定要求によって機器設定を変更したりする
  * MIB(Management Information Base)
    * SNMP でやり取りされる情報が MIB
    * MIB はツリー型の構造を持ったデータベースで、それぞれの項目に番号が付けられている
  * RMON(Remote Monitoring MIB)
    * 通常の MIB がネットワーク機器のインタフェース(点)を監視するパラメータ群から構成されているのに対し、RMON は接続されるネットワークの回線(線)を監視するパラメータ群から構成されている
* その他のアプリケーションプロトコル
  * マルチメディア通信を実現する技術(H.323、SIP、RTP)
    * H.323
      * H.323 は ITU により策定された、IP ネットワーク上で音声や映像をやり取りするためのプロトコル体系
    * SIP(Session Initiation Protocol)
      * H.323 と比較される TCP/IP のプロトコルが SIP
      * SIP は H.323 より後に開発され、H.323 よりインターネットでの利用に合致するようになっている
      * OSI 参照モデルでいえば、セッション層に相当する
    * RTP(Real-Time Protocol)
      * UDP でリアルタイムなマルチメディア通信を実現するためには、パケットの順番を表すシーケンス番号を付けたり、パケットの送信時刻を管理したりする必要がある
        * これを行うのが RTP
      * RTP はそれぞれのパケットにタイムスタンプとシーケンス番号を付加する
    * デジタル圧縮技術
      * 効率よくデータを圧縮することにより、音声、映像データの総容量が減少する
      * 限られたネットワーク資源でマルチメディアデータを送受信するためには、圧縮技術が必須
      * OSI 参照モデルでいえば、プレゼンテーション層に相当する
  * P2P(Peer To Peer)
    * ネットワーク上に展開する各端末やホストがサーバーなどを介さずに 1 対 1 で直接接続し通信を行う形態が P2P
    * P2P では各ホストがクライアントとサーバーの両方の機能を持ち、対等な関係でサービスを相互に提供しあう
  * LDAP(Lightweight Directory Access Protocol)
    * LDAP はディレクトリサービスにアクセスするためのプロトコル
    * 「ディレクトリサービス」とは、ネットワーク上に存在している様々な資源に関してデータベース的な情報提供を行うサービスといえる

### 9: セキュリティ

* TCP/IP とセキュリティ
  * TCP/IP は当初、閉じた範囲での情報交換や情報共有のツールとして利用されていた
    * この時はあまりセキュリティが重要とは考えられていなかった
    * しかし、インターネットが普及し、セキュリティが重視されるようになっている
* セキュリティの構成要素
  * ファイアウォール
    * 組織内のネットワークとインターネットを接続する時には、組織内部のネットワークを不正アクセスから守るためにファイアウォールを設置する必要がある
    * いくつもの種類や形態があり、例えば規定されたパケットのみを通過させる(もしくは通過させない)パケットフィルタリングタイプ、アプリケーションを介在させ不正な接続を遮断するアプリケーションゲートウェイタイプなどがある
    * 基本的な考え方
      * 危険に晒すのは特定のホストやルーターのみに限定する
  * IDS(侵入検知システム、Intrusion Detection System)
    * 不正アクセスを行う通信を見つけ、セキュリティの管理者などに通知をするのが IDS
  * アンチウイルス / パーソナルファイアウォール
    * ユーザーが利用するコンピュータや、サーバーなどで動作するソフトウェア
    * そのコンピュータを出入りするパケットやデータ、ファイルなどを監視して、不正な処理やウイルスの侵入などを防ぐ
* 暗号化技術の基礎
  * 通常、Web ページへのアクセスや電子メールなどのインターネット上を流れるデータは暗号化されていない
    * そのため、やり取りしている情報が第三者に漏洩している可能性を完全には否定しきれない
  * このような漏洩を防ぎ、機密性の高い情報の送受信を実現するため、様々な暗号化技術が登場している
  * 共通鍵暗号方式と公開鍵暗号方式
    * 暗号化と復号に同じ鍵を使うのが共通鍵暗号方式
    * 暗号化、復号に一対の別々の鍵(公開鍵と秘密鍵)を使うのが公開鍵暗号方式
  * 認証技術
    * 認証技術は次のように分類できる
      * ある情報を持っていることによる認証
        * パスワードや暗証番号など
      * あるものを持っていることによる認証
        * ID カード、鍵、電子証明書などを利用する
      * ある特徴を持っていることによる認証
        * 指紋や目の瞳孔など
* セキュリティのためのプロトコル
  * IPsec と VPN
    * VPN
      * インターネットを利用した仮想的な私的ネットワーク
    * VPN を構築する時に最も一般的に利用されているのが IPsec
      * IPsec では IP ヘッダの後ろに「暗号ヘッダ」「認証ヘッダ」をつける
  * TLS/SSL と HTTPS
    * Web では TLS/SSL という仕組みを使って HTTP 通信の暗号化が行われる
    * TLS/SSL を使った HTTP 通信のことを HTTPS と呼ぶ
      * HTTPS では共通鍵暗号方式を使った暗号化処理が行われる
      * 共通鍵を送信する時は、公開鍵暗号方式が利用される
  * IEEE802.1X
    * IEEE802.1X は認められた機器のみがネットワークにアクセスできるように認証する仕組み
    * 無線アクセスや構内 LAN でよく使われている
