マスタリングTCP/IP入門 重要用語について自分の言葉で説明する Part2

# はじめに
ネットワーク知識習得のため、基本に立ち帰り[マスタリングTCP/IP―入門編―(第6版)](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP%E2%80%95%E5%85%A5%E9%96%80%E7%B7%A8%E2%80%95-%E7%AC%AC6%E7%89%88-%E4%BA%95%E4%B8%8A-%E7%9B%B4%E4%B9%9F/dp/4274224473)を読むことにしました。
読んだ中で特に重要かなと思ったor興味を持った用語について、本書籍や他サイトの解説、自分の基礎知識と照らし合わせて超短く要約をしていきます。

この記事は[マスタリングTCP/IP入門 重要用語について自分の言葉で説明する Part1](https://qiita.com/Ryku/items/1f46b47b76ce384e68d6)の続きです。

# 4章 IP（Internet Protocol）
## ネットワーク層の役割
IPはネットワーク層を担当するプロトコルで、通信の終点から終点への通信の決まりごとを規定する。データリンクは一つのケーブルまたは電波で繋がった機器同士の通信の決まりごとであったのに対して、ネットワーク層の方がより大きい範囲での規定を表す。光回線通信を例にとったイメージとしては↓のような感じ。

![スクリーンショット 2022-12-29 9.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965436/4afea360-4703-24cd-ee31-9e8adfeaed0e.png)

## ホスト
IPアドレスを持った機器のうち、細かい経路制御機能を持たないもの。最低限の経路制御表は持っている。

## ルーター
IPアドレスを持った機器のうち、経路制御機能を持つもの。

## IPにおけるコネクションレス通信
IP（IPを用いた通信）では、送信相手とのコネクションを確立する前に送信してしまう。これをコネクションレス型の通信という。通信の安定性等と引き換えに仕組みの簡略化、処理の高速化が最大のメリットとなる。

## IPv4アドレス
32ビットの整数数値のこと。世界中のいずれかの機器に割り当てられる。

:::note info
32ビットなので以下のようなビット列がIPv4アドレス。8ビットごとのかたまりで区切って10進数で表すことも多いです。
```conf
binay: 10101100 00010100 00000001 00000001
decimal: 172. 20. 1. 1
```
IPv4アドレスでは、`2^32=4,294,967,296（約43億）`通りの表現が可能になります。
ただ、現在の地球の人口は70億ほどであり、世界各国に急速にインターネットが広がっていることを踏まえるとこの数でも足りなくなってきているようです。
:::

## ネットワーク部とホスト部
IPアドレスはネットワーク部とホスト部で分けられる。区切り方にはクラスとサブネットマスクの2方式があるが、現在ではサブネットマスク方式が主流。

## ブロードキャストアドレス
ホスト部のビットを全て1にしたもの。そのネットワークの全ての機器に対して通信する際に使用される。

## ネットワークアドレス
ホスト部のビットを全て0にしたもの。

## サブネットマスク
クラス方式では配布されたクラスによって使用できるホスト数に大きな偏りがあった（クラスAでは1600万台のホストを構築できるのに対してその一つ下のクラスBでは約6万台にまで減ってしまう）。
これをもう少し使用する組織の大きさに合わせて使用できるホスト数を調整できるようにしたのがサブネットマスク方式。

:::note info
例：IPv4アドレス
ネットワークアドレス：上位26ビット

```conf
ip_binay: 10101100 00010100 00000001 00000001
```

26ビットなので4つ目のかたまりの2ビット目までがネットワークアドレスです。
**サブネットマスクは、ネットワークアドレスまでを1で埋めて、それ以降のホスト部は0で埋めたものになります。**

```conf
ip_binary: 10101100 00010100 00000001 00000001
subnet: 11111111 11111111 11111111 11000000
broadcast: 10101100 00010100 00000001 00111111
network_adress: 10101100 00010100 00000001 0000000
```

10進数表記に直すと、以下のようになります。

```conf
ip_binary: 10101100 00010100 00000001 00000001
ip_decimal: 172. 20. 1. 1
subnet: 255.255.255.192
broadcast: 172.20.1.63
network_adress: 172.20.1.0
```
:::

:::note warn
これとは別にスラッシュの後ろにサブネットマスクを記述する方式もあります。こちらの方が見やすいですが、上記の方式で記述しているサービスもあるため両方理解できるようになっていた方が良いです。

```conf
ip_decimal_with_subnet: 172. 20. 1. 1 /26
network_adress_with_subnet: 172.20.1.0 /26
```

ネットワークアドレスを記述する際に0は省略でき、`172.20.0 /26`としても良い。
:::

## CIDR
ClasslessInterDomainRouting
IPアドレスのクラス分けを廃止して、任意のビット長でIPアドレスを配布し、それに対応した経路制御をすること。

## プライベートアドレス
IPアドレスの不足により、全てのルーターやホストにユニークなIPアドレスを供給するのが難しくなってきている。そこで、プライベートなネットワークでは自由に使用して良いIPアドレスが設定された。
以下の範囲のアドレスがプライベートアドレスとして自由に使って良いとされれている。

```conf 
classA: 10.0.0.0 ~ 10.255.255.255
classB: 172.16.0.0 ~ 172.31.255.255 
classC: 192.168.0.0 ~ 192.168.255.255
```

:::note info 
あるネットワークに以下のグローバルIPアドレスが割り振られた場合を考えます。このIPアドレスはネットワーク部が31ビットのため、ホスト部が1ビットしかなく外部に接続できるホスト数は2つのみになります。

```conf
ip_decimal_with_subnet: 170.15.11.0 /31
```

このような時にプライベートアドレスとして自由に設定して良いIPアドレスがあると、ネットワーク内には何台ものホストを設置して通信することができます。
ただ、外部に接続する際はNATなどを通してプライベートアドレスをグローバルIPアドレスに変換してから通信する必要があることに注意が必要です。ここでの変換ミスなどが起こってインターネットに接続されてしまったときに混乱がないように一応プライベートアドレスの範囲が設定されています。
:::
## ループバックアドレス
同じコンピュータ内のプログラム間で通信したい場合に使用する。バックエンド開発者であればよく目にする`127.0.0.1`がこのループバックアドレス。ホストがこのアドレスへの通信命令を受けた時は、パケットをネットワークには流さずに同一コンピュータ内で通信する。

## リンクローカルアドレス
コンピュータ内だけとは言わず、ちょっとは外に出したいけど、全世界とは通信したくない...というような際に使用される。`169.254/16`のアドレスが使用される。ルーターの経路制御表にこのアドレスを受け取っても外に転送禁止だよと書かれている。

## IPv6
IPv4の枯渇問題に対応するために標準化されたインターネットプロトコル。
4オクテット（バイト）から16オクテットになった。表現できる数は全部で`2^128`なので、`340282366920938463463374607431768211456`通りです。しばらく枯渇の心配は無さそう。すでに割り当てられているIPを一新するのも一苦労なので、少しずつ適応が進んでいる。
この洗い替えを機に、ルーターの経路制御負担やセキュリティの問題など、IPv4の問題点なども同時に解消しようとしている。

:::note info
**表記方法**
2新数表現は以下のようになります。
16ビットの8かたまりとして見ます。（IPv4と同様に8ビットのかたまりとして見てしまうと、かたまりが16個もできてしまい長いからだと思います。）
```
1110001010000011 1110001011111111 1110001010100011 1010101010101010 0101010101010101 1110001010000011 1110001010000011 1110001010000011
```

1つのかたまりは16進数に直され、以下のように表されることが多いようです。

```
FEDC:BB77:AACD:1234:44BB:7777:B7B7:FF66
```

**雑感**
IPv4と同様に普通に10進数に直して`65536.65536.11200.44322.11022.00000.00000.00000`とかの方がわかりやすかったのでは？と思ったりしました。
16ビットのかたまりは10進数表記では最大で`65536`となり、ひとかたまり5桁になるとちょっと桁が多くて見辛いとかなんですかね。
:::

## 5章 IPに関する技術
## DNS
Domain Name System
アルファベット文字列のドメインをIPアドレスへと変換してくれるシステム。

### hosts
ホスト名とIPアドレスの対応を定義するデータベース。下記のように格納される。ネットワークの規模が大きくなる以前（DNS登場以前）はこのデータベースをネットワークインフォメーションセンターと呼ばれるところで管理していた。

|  ホスト名  |  IP  |
| ---- | ---- |
|  uhouho.com  |  123.0.0.4  |
|  ukiuki.jp  |  213.22.11.11  |

### リゾルバ
DNSお問い合わせを行う機器のこと。ユーザーが使用するパソコンなど。
`リゾルバ -- お得意様ネームサーバー -（なければ）- ルートネームサーバー -- jpやorg階層を管理するネームサーバー -- お問い合わせ先のホスト`というような流れになる。ルートネームサーバーを経由してドメインIP対応を知った場合、しばらくの間お得意様ネームサーバー上にそのドメインIP対応表をキャッシュしておき、素早くそのドメインにアクセスすることができる機能もある。

## DHCP 
Dynamic Host Configuration Protocol
自宅、カフェなど、いろんな場所からネットワークに接続したい時、毎回その場所のネットワークのIPアドレスやお得意様DNSサーバーを設定するのはとても大変。そこで、接続したい機器をインターネットに接続する前に、物理的にDHCPサーバーと接続することで、そういった面倒な設定を一括でしてくれるというもの。

## NAT
Network Address Transrator
ネットワーク通信時にプライベートIPアドレスとパブリックIPアドレスを変換してくれる機器のこと。パブリックIPアドレスは全世界でユニークでなければならないのに対して、プライベートアドレスであれば重複しても良いので、IPアドレスの節約につながる。内部的にはポート番号をうまく使うなどをして宛先の割り振りを決定している。

## IntServとDiffServ
IPはコネクションレス型の通信規格なので、ネットワークが輻輳状態（ふくそう：=混雑）になると通信が不安定になってしまう。そこで、特定の通信では通信品質を保証するための仕組みがいくつか登場した。IntServはポート番号などまで指定してアプリケーションごとの通信品質を担保する仕組み。DiffServはもっと大きい枠組みで特定顧客（ホスト、またはネットワーク）の通信の品質を担保する仕組み。

## Mobile IP
ネットワークを移動した後にも移動前と同様のIPアドレスを使用できるようにする仕組み。
自宅のネットワークから特定のホストと通信をした後、カフェに行ってカフェの公共ネットワークからも同じホストと通信ができる。

# 6章 TCPとUDP 

## TCP
Transmission Control Protocol
IPの上に構築される、トランスポート層の通信規格。コネクション型で、信頼性が高い。送受信されるパケットのIPヘッダのプロトコルフィールドにTCPかUDPかが定義されている。

### ACK
確認応答。送信先に正常に送信できた際に送信先から返ってくる応答。

### NACK
否定確認応答。送信先が正常にメッセージを受信できなかった場合に返す。

### ウィンドウサイズ
送信元は送信するデータをいくつかのパケットに分割して送信する。パケット1つを送信するごとに確認応答を待って、確認応答があったら次のパケットを送信するのでは効率が悪い。そのため、特定のパケット分は確認応答がなかったとしても送信先に対して送ってしまって、その後に応答を待つ。この特定のパケット分の大きさをウィンドウサイズと呼ぶ。

## UDP 
User Datagram Protocol
トランスポート層の通信規格。コネクションレス型で、信頼性が低い。高速性やリアルタイム性を必要とするビデオ通話やテレビ放送などに使われる。

## ソケット
BSD UNIXで開発されたAPI。OSが持っているTCP/IPの機能を提供する。

## ポート番号
IPでは通信先の判別にIPアドレスを使用していたが、TCP/UDPではポート番号を通信先の判別に用いる。

### Well Known Port Number
HTTP、DNSなど代表的なアプリケーションで使用されているポート番号のこと。0〜1023までがウェルノウンポート番号と言われている。

## QUIC
Quick UDP Internet Connections
Googleが提案している、TCPに代わる通信規格。
暗号化を標準で備えていたり、ウィンドウサイズもTCPよりも柔軟に設定できたりする。

# まとめ
4章〜6章までの内容をまとめました。
次回7章（ルーティングプロトコル）からの内容も書いていく予定です。