マスタリングTCP/IP　入門編（第6版）

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/39c6f39f-c9bc-575e-130e-6c83fd487ce9.png">

読書記録

## 読者プロフィール
組込み系エンジニア。
組み込みでもネットワークは必修なんだけど、分業されていたりOSSを活用したりでネットワークの低レベルなところに触れる機会は無い。つまりネットワークの知識は遥か昔に受けた応用情報技術者試験で止まっているしほぼ忘れてる。こりゃあかんと思い評判の良いこの本を読んでみる。

## 雑感
データリンク層とTCP/IPを主軸に、これらを構成する上での必修部分を詳細に、関連部分は触り程度で広く浅く触れている。

恐らく多くの初学者によって一度読んですっきり終わるタイプの本で無い。というのも、この本は「分かり易い言葉で解説したネットワークの辞書」であるため、最初から読めば分かるというモノではない（と感じた）。

まず一度通読し、なんとなく全容を見渡したうえで個別の技術毎に読み直し、調べたり別の本で捕捉しつつ理解を深めるような読み方が適していると思う。

一方で初学者を意識した図解やメタファ、第一章第二章は特に基礎的な内容にフォーカスしており「あ、これは最初から読んでいくタイプの本なんだ」と誤解を与えるような構成であるとも感じ、この点は難しいところ…。

TCP/IPという技術と関連技術を平易な表現で体系立てて説明している本は貴重と思うので読む価値はあると思う。ただし１度読んで終わりとするのはもったいないので２度以上読むことを強くお勧めする。

# あらすじ
本書はOSI参照モデルの低レイヤの説明から始まり、１つ上位のレイヤという順で説明が進む。つまり物理層、データリンク層、ネットワーク層、トランスポート層、アプリケーション層という流れである。各レイヤについて代表的なプロトコルと、そのプロトコルに関連する技術を列挙するような形で進む。

本ページでは各技術の詳細は（本書に書かれているため）触れず、１度の通読で理解できなかった点を中心に自分の理解のためにまとめる。アプリケーション層の説明は本書の本筋ではないと感じたので割愛する。

# データリンク層
OSI参照モデルのデータリンク層とは、同じ通信媒体で直接接続された機器間の通信仕様である。イーサネットやWi-Fiが該当する。

（明記されていないため私の誤解があるかもしれないが、以下のように理解すると分かり易いと思う）データリンクのセグメントとは、同じ通信媒体で直接接続されたホスト群（パソコンなど）を指す。また、単にデータリンクといったときは一つのデータリンクセグメント、またはデータリンクセグメント内の2者間の通信を指す。

データリンク層は幾つかのプロトコルがあり、通信媒体などによりプロトコルは異なる。同一セグメント内では同じプロトコルとなる。本書で触れているメジャーなプロトコルのうちいくつかを以下に抜粋する。

### Ethernet
世界中で最も広く使用されている有線LANの規格。

```:Ethernet ヘッダ構成
| 宛先MACアドレス | 送信元MACアドレス | タイプ | データ               | FCS         |
```
※IEEE 802.3についても述べられているが冗長なのでEthernetのみ記載

### Wi-Fi（IEEE802.11）
無線LANの規格で、家庭やオフィスのネットワークに広く使用されている。
```:Wi-Fi ヘッダ構成
| フレーム制御 | デュレーション | 宛先MACアドレス | 送信元MACアドレス | BSSID      | シーケンス番号 | データ     | FCS  |
```
※ヘッダの詳細は本書に記載なし


### PPP (Point-to-Point Protocol)
ダイヤルアップ接続や専用回線で使用される。
```:PPP ヘッダ構成
| フラグ | アドレス | 制御  | タイプ   | データ     | FCS     | フラグ |
```
PPPはリンクと呼ばれる2者間のコネクションを確立する。そのため通信開始時点で宛先は決定しているためアドレスフィールドは0xFFの固定値となる。イーサネットと異なりMACアドレスは必要ない。

このように各プロトコルによりヘッダは異なる。また、PPPは事前にリンクを確立するがイーサネットは送信相手を探索する。そのためセグメントは同一セグメント、異なるセグメントで繋がる必要がある。セグメントの接続に用いる機器について特に重要なのは以下の２つ。

### ブリッジ（別名レイヤ2スイッチ)
ブリッジとはデータリンク層で動作し、同一プロトコルを接続する装置である。イーサネットプロトコルの接続においては、速度の異なる接続も可能となる。

### ルータ(別名レイヤ３スイッチ)
ルータとはネットワーク層で動作し、異なるデータリンクプロトコルを接続する装置である。家庭でLANをWi-Fiに変換するな度に用いられる。異なるプロトコルの場合ヘッダは書き換わることになる。

## TCP/IPにおけるデータリンク層の役割
ネットワークとはセグメントが連なっているようなものであるため、セグメントから次のセグメント(宛先MACアドレス)までの通信をデータリンク層が担う。最終的にどこに到達するかはデータリンク層のヘッダには書かれていないため、最終目的地はIP（ネットワーク層のプロトコル）が担う。つまりIPヘッダは基本的に通信中不変だが、データリンクヘッダはセグメントを移動する度に送信元MACアドレスと宛先MACアドレスが書き換わっていくことになる


# ネットワーク層　IP インターネットプロトコル
IPアドレスとはインターネットやローカルネットワーク上でデバイスを一意に識別するために使用される番号を指す。IPv4では以下のように示す。
```:IPv4でのIPアドレス
172.28.5.2
```
本書では様々なIPアドレスが登場する。どうやらホストに割り当てられるIPと、特定用途に用い割り当てられることのないIPがあるようだ。どうにも混乱するのでまずは番号そのものについて整理する。

# グローバルアドレス(IPv4)
グローバルアドレスとはインターネット全体でユニークなIPである。世界中に１つしかない。
## 予約済グローバルアドレスアドレス
予約済であり、一般的なホストに割り当てられることは無いIPアドレスとして以下がある。

#### マルチキャストアドレス
```:マルチキャストアドレス
224.0.0.0 - 239.255.255.255
```
マルチキャスト通信に使用されるアドレス。


#### ループバックアドレス
```:ループバックアドレス
127.0.0.0 - 127.255.255.255
```
自分自身を指す。テストやデバッグに用いる。有名なのはlocalhost 127.0.0.1だが、上記は全てlocalhost同様に動作する。

## 異常時のみ割り当てられる特殊用途アドレス
#### リンクローカルアドレス
```:リンクローカルアドレス
169.254.0.0 - 169.254.255.255
```
DHCPサーバーからIPアドレスを取得できない場合に自動的に割り当てられるアドレス。ローカルネットワーク内では通信できるがルータを超えることはできない。


## プライベートアドレス
グローバルアドレスの対となるものはプライベートアドレスである。プライベートアドレスは直接インターネットに接続されないため、ネットワーク内でユニークであればよく、世界中には多数の同一プライベートアドレスが存在する。
プライベートアドレスは以下であり、これらのアドレスをグローバルアドレスとして使用することはできない。
```:プライベートアドレス
クラスA: 10.0.0.0 - 10.255.255.255
クラスB: 172.16.0.0 - 172.31.255.255
クラスC: 192.168.0.0 - 192.168.255.255
```

## 予約済プライベートアドレス
#### ブロードキャストアドレス
```:ブロードキャストアドレス
192.168.1.0/24であれば192.168.1.255
```
ネットワーク部とホスト部について、ホスト部がすべて１のものはブロードキャストアドレスと呼ばれる。サブネット内のすべてのホストに対する通信に使用される。予約済のため割り当てられることは無い

#### ネットワークアドレス
```:ネットワークアドレス
192.168.1.0/24であれば192.168.1.0
```
ホスト部がすべて0のものはネットワークアドレスと呼び、サブネット全体を指す。主にサブネットの識別としてルーティングに用いたれる。予約済のため割り当てられることは無い

#### （予約済ではないが）ルータのIP
```:ルータのIP
192.168.1.0/24であれば192.168.1.1
```
ブロードキャストアドレスやネットワークアドレスと異なりルータに割り当てているので普通に使用可能なIPアドレス。ただ通常は用途が決まるのであまり一般ユーザに割り当てないかな～？といった位置づけ。
通常、ホスト部の末尾が1となる。一般的には、ルーターやゲートウェイとして使用されるアドレス。ルータのIPの割り当てに明確な決まりは無いようだが、一般的には1始まりがメジャーな様子。本書では１つのデータリンクに複数のルータが存在する場合1,2,3と割り振っている。


## グローバルアドレス(グローバルユニキャストアドレス)(IPv6)
ここからはIPv6について記載する。
グローバルユニキャストアドレスとはグローバルアドレスと同様にインターネットに接続可能なIPアドレスのこと。本書には明確な範囲は書かれていないので検索した内容だが、下記の範囲とのこと。

```:グローバルユニキャストアドレス
2000:: から 3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF までのアドレス範囲。
```
## 予約済グローバルユニキャストアドレス
予約済であり、一般的なホストに割り当てられることは無いIPアドレスとして以下がある。IPv4と比べると格段に少ない。

#### 未定義
```:未定義
::/128　( 0000 ... 0000）
```
特定のアドレスを指定しない場合に使用される。このアドレスは送信元アドレスとしてのみ使用され、デバイスに割り当てられることは無い。

```:未定義
::1/128　（0000 ... 0001）
```
自分自身を指すために使用される。このアドレスはネットワーク上の他のデバイスとの通信には使用されず、デバイスに割り当てられることは無い。

## プライベートアドレス
IPv4同等に組織内で使用可能なIPアドレス
#### リンクローカルユニキャストアドレス

```:リンクローカルユニキャストアドレス
fe80::/10　
```
同じネットワークセグメント内でのデバイス間通信に使用される。ルータを経由せず、ローカルネットワーク内でデータを送受信するためのアドレスである。

#### ユニークローカルアドレス
```:ユニークローカルアドレス
fc00::/7
```
組織内部でのプライベートな通信に使用される。インターネット上でルーティングされることはないが、組織内の異なるネットワークセグメント間で使用できる。

#### マルチキャストアドレス
```:マルチキャストアドレス
ff00::/8
```
特定のグループに対してデータを送信するために使用される。ビデオストリーミングやオンライン会議など、多数の受信者が同時にデータを受信する際に利用される。

## IPv4とIPv6に共通する関連技術
### DNS
DNS (Domain Name System) は、インターネット上のドメイン名とIPアドレスを対応付けるためのシステムを指す。DNSプロトコル自体はIPv4とIPv6の両方で同じで、異なるのは解決するアドレスの形式のみ。

### ICPMとICPMv6
ICMP (Internet Control Message Protocol) は、IPネットワーク上でエラーメッセージや診断情報を通信するために使用されるプロトコルを指す。ICPMはIPv4の補助のみ、ICPMv6はIPv6の補助に加え通信実現の一端を担うよう拡張されている。これらは別のプロトコルであるため互換関係にはない。古い機器の場合ICPMのみサポートしていることはあるが、通常は両方サポートされている。

### DHCP
DHCP (Dynamic Host Configuration Protocol) は、ネットワーク内のデバイスに自動的にIPアドレスやその他のネットワーク設定を割り当てるためのプロトコルを指す。DHCPは、IPv4とIPv6の両方で使用できる。IPv6ネットワークでは、DHCPv6という拡張バージョンが使用され、同様の機能を提供する。

### NAT
NAT (Network Address Translation) は、ネットワーク内のプライベートIPアドレスをパブリックIPアドレスに変換する技術を指す。IPv4のアドレス枯渇問題を解決するために使用するため、同様の目的でIPv6で使用する必要はないが、セキュリティ向上のために使うことはある。

### VRRP
VRRP（Virtual Router Redundancy Protocol）は、ネットワークの冗長化により耐障害性を高めるプロトコル。IPv4とIPv6の両方で使用できる。

### 通信品質制御 （IntServ,DiffServ）
何等かの手段でパケットに優先順位を与え、特定の通信の通信品質を向上させるための制御を指す。IPv4とIPv6の両方で使用できる。

## IPv4とIPv6に差のある技術
## MACアドレスを調べる
宛先IPから次にパケットを受け取るべき機器のMACアドレスを調べる方法はIPv4とIPv6で以下のように異なる。
### IPv4 ARP
ARP (Address Resolution Protocol) は、IPv4ネットワーク上でIPアドレスをMACアドレスに変換するためのプロトコルを指す。

### IPv6 ICMPv6 近隣探索メッセージ
IPv6ネットワークにおけるノード間のアドレス解決と近隣ノードとの通信のために使用され、IPv4のARPと同じ役割を果たす。

## Mobile IPv4,Mobile IPv6
モバイルIPとはモバイルデバイスが異なるネットワークに移動しても同じIPアドレスを保持し続けることができる技術を指す。この目的はIPv4とIPv6で同じである。

IPv4では外部エージェントと呼ばれるホストが存在するネットワークにしか移動できないという点や、パケットのルートの効率が悪いという課題があった。これを解決したものがMobile IPv6である。IPv4はMobile IPv6を使用できない。

## NAT64,DNS64
NAT64とDNS64は、IPv6ネットワークがIPv4リソースと通信するための技術を指す。DNS64は、DNSリクエストを変換（IPv4アドレスを埋め込む）することで、NAT64がIPヘッダを付け替えられるようにしている。

# トランスポート層 TCP

## コネクション管理
TCPではデータ通信の開始前にコネクションを確立する。コネクションとは特別なパケットを用いたハンドシェイク処理で、開始パケット（SYN）と応答パケット（ACK）、終了パケット（FIN）が用いられる。なお、コネクションレスなプロトコルとしてUDPがあり、TCP同様に重要な技術ではあるが、技術読書まとめとしては特記事項が少ないため割愛する。

## 信頼性
送信データの欠落を防ぐために送信データに対するACK応答が行われる。単に1送信（セグメント）に対して１応答とするとスループットが悪いため、TCPヘッダに埋め込まれているセグメント数（ウィンドウサイズ）に従い、そのセグメント数の通信を一気に行う。これにより送信者視点で応答待ちが改善され、スループットが向上する。

データ欠落時の制御は多少複雑になる。
ACK応答の欠落に関しては、ACK応答はそもそも「次のデータ開始位置（番号）」を含むため、一部欠落したとしても帳尻は合うため再送不要となる場合が多い。
送信データ(1000番)が欠落した場合、受信者は複数受信した全て通信ACKで「1000番がない」と応答する。複数回のエラー応答を受け再送を行う。これは送信と受信が１対１の場合の再送タイムアウト（初期値6秒）と比較すると短いため、素早い復旧が可能となる。

## フロー制御
フロー制御とは、受信者側が受け取れなくならないようにデータ流量を制御することを指す。受信者はTCPヘッダのセグメント数（ウィンドウサイズ）を書き換えることができ、送信者はそれに従うことで流量を調整する。
受信者がコントロール権を持つ。これを実現するにはTCPヘッダにウィンドウサイズが組み込まれている必要がある。（そして組み込まれている）

## 輻輳制御
輻輳制御は検知者、仲介者、送信者によるデータ量調整により成立するが、これらはレイヤが異なっている点に注意。輻輳の検知はIPレイヤでルータにより検知され、IPヘッダのCEビットを立てることで検知される。そのパケットの受信者はCEビットが立っていることに気づき、TCPヘッダのECEフラグを立てる。このパケットの応答により、送信者はECEビットが立っているため輻輳制御を開始する。

なおルータでの輻輳検知は内部バッファの使用量やCPU負荷の監視により実現される。

### 輻輳ウィンドウ
送信者が回線状況に気を遣い送信データを送る制御がある。その際の送信データ幅を輻輳ウィンドウと呼ぶ。この輻輳ウィンドウは動的に変化するものである。フロー制御とは異なり、送信者により完結するため「輻輳ウィンドウ」というものをTCPヘッダに組み込む必要はない（そして組み込まれていない）

# 経路制御　ルーティング(IP)
データリンクとデータリンクを繋ぐものはルータであり、ルータからルータへというバケツリレー方式でパケットを転送し、目的地まで届ける制御を経路制御と呼ぶ。代表的な経路制御プロトコルとしてRIP2,OSPF,EGPがある。
インターネットは階層構造になっており、頂点間（大規模ネットワーク）のルーティングはEGPで行い、中規模ネットワークのルーティングはOSPFで行い、末端の小規模ネットワークのルーティングはRIP2で行う。

## RIP2（Routing Information Protocol）距離ベクトル方式
距離ベクトル方式とは目的地までいくつのルータを仲介するか（ホップ数）について、少ないホップ数で到達する経路を選択するプロトコルである。ルータは隣接するルータと30秒周期で通信を行い、ホップ数を更新する。

## OSPF（Open Shortest Path First）リンク状態方式
リンクとは、ルータとルータの間の接続を指す。リンクはイーサネットであったりVPNであったりするため通信帯域が異なる。リンク状態方式では、帯域幅などによりリンクのコストを算出し、エリア（後述）内の最小コスト経路を決定する。
エリアとはネットワークを階層毎に区切る概念である。リンク状態方式ではエリア内の最小コスト経路を導出するため、現実的に演算可能な範囲において適用する必要がある。その範囲の単位がエリアであり、バックボーンエリアという最上位階層のエリアと、それに隣接する下位層のエリアといった構成となる。

## BGP（Border Gateway Protocol）経路ベクトル方式
インターネットサービスプロバイダー（ISP）などの大規模なネットワーク間を接続するプロトコル。
ISPなどの大規模ネットワークはAS（Autonomous System）番号を持つ。BGPでは基本的にはルータ間のAS数が最小となる経路を決定するが、AS間の接続契約によて経路を決定することもできる。