【ネットワーク】TCP/IP　インターネット層とIPを理解する

## はじめに
前回の続きで、今回はIPについて理解したことをまとめていきたいと思います。

## IPとは？
IPとはTCP/IPモデルの4つの層のうちのインターネット層のプロトコルです。
インターネット層は、データを宛先のコンピューター(Webサーバー、ルータなど)に届けることを保証する役割を持ちます。
宛先の場所は一意に割り当てられたIPアドレスを使って判断します。

## IPパケットの構成
IPヘッダー+TCPやUDPのヘッダー+データ本体
で構成されています。

**IPヘッダーが持つ情報**
| フィールド                  | 説明                                                             |
|-----------------------------|------------------------------------------------------------------|
| バージョン（Version）        | IPのバージョンを表す。IPv4なら4、IPv6なら6                        |
| ヘッダー長（IHL）            | IPヘッダーの長さを指定する                                        |
| 全長（Total Length）         | IPヘッダーとデータ部分を合わせたパケット全体の長さ                |
| 識別子（Identification）     | フラグメンテーション（パケットの分割）されたデータの再構成に使用される |
| フラグとフラグメントオフセット| パケットが分割された場合の再構成に関する情報を含む                |
| TTL（Time to Live）          | パケットがネットワーク上を転送される最大ホップ数を指定する         |
| プロトコル（Protocol）       | 上位層のプロトコルを指定する。例えば、TCPなら6、UDPなら17         |
| ヘッダーチェックサム         | ヘッダーにエラーがないか確認するためのチェックサム                 |
| 送信元IPアドレス             | パケットを送信したデバイスのIPアドレス                            |
| 宛先IPアドレス               | パケットの送信先となるデバイスのIPアドレス                        |


### 「細い」経路をは分割して通り抜ける
MTU という一度に送信できる最大のデータサイズがあってこれは経路によって異なります
そういったときのためにルーターには MTU に合わせてパケットを分割して送る**IP フラグメンテーション**という機能があります。
ただ、ルーターの負荷が高くなるため基本的には TCP の最大セグメントのすり合わせでサイズを決めて IP フラグメンテーションは避けるようにしているようです

### どのように分割、再構築をするのか？
IPv4 ヘッダーには分割のための３つのフィールドが用意されています
- 識別子・・・同じデータがを識別する 16 ビットの数値
- 分割フラグ・・・分割許可フラグと続きの断片があるかを表すフラグ
- フラグメントオフセット・・・元データ中の位置を伝える 13 ビットの数値
これを使って分割して、再構築します

## IPアドレスとは？
各コンピューター(サーバ、ルーターなど）に与えられた一意な識別子になります
これにより、コンピュータの位置を特定することができます
IPアドレスはネットワーク単位でまとめて割り当てられるのでIPアドレスを見れば、どこのネットワークに所属しているのかを判断することができます
32ビットで構成されるIPv4と128ビットで構成されるIPv6がありますがここではV4に絞って書いていきます

### IPアドレスの構成
IP アドレスは 32 ビットの 2 進数を、8 ビットずつ 4 つに分割して 10 進数で表します。各数値（オクテット）は 0 から 255 までの範囲で構成されます。
IPアドレスはネットワーク部とホスト部に分割されていて、その範囲はアドレスクラスとサブネットマスクにより決まります。

**参考**

https://ja.wikipedia.org/wiki/IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

### アドレスクラスとは？
アドレスクラスは、IP アドレスのどこまでがネットワーク部で、どこからがホスト部かを固定化して決めたものです。アドレスはクラス A からクラス E までに分類されます。A~Cが主要みたいなのでその３つに絞りここには書きます。
- **クラス A**：先頭 8 ビットがネットワーク部
- **クラス B**：先頭 16 ビットがネットワーク部
- **クラス C**：先頭 24 ビットがネットワーク部
ネットワーク部が少ないほど、ホスト部に割り当てられるビットが多くなるので、よりたくさんのホストを 1 つのネットワークに配置することができるようになります。

ただ、一般的なネットワークでは、たくさんのホストを 1 つのネットワークに所属させることは少ないので多くの IP アドレスが無駄になってしまうことがあります
その問題を解決し、ネットワークを細分化するために、**サブネットマスク**という仕組みがあります

### サブネットマスクとは？
`10.1.1.1 /24` というような形式で表す CIDR（Classless Inter-Domain Routing）記法を使用します。  
「/」の後に続く数字は、何ビットをネットワーク部として扱うかを指定しています。このサブネットマスクを使うことで、ネットワークを細分化し、異なるサブネット（サブネットワーク）として分割して管理することが可能になります。
例えば支社や支部などの地域ごとに小さなネットワークに分けることができ、ホスト数に応じた柔軟に決めることができます。

### どのように分割するのか？
例えば、クラス C のネットワーク `10.1.1.0/24` だった場合、サブネットマスクは 24 ビットがネットワーク部となります

ここで、サブネットマスクを `/26` に変更して、26 ビットまでをネットワーク部として指定すると、次のようにネットワーク部が広がります
`[00001010.00000001.00000001.00]000000`  
この `[ ]` 内の 26 ビットがネットワーク部分となり、残りの 6 ビットがホスト部分です
26 ビットを使うと、増やした**2 ビットを使ってネットワークを 4 つに分割**できるようになります

例えば、4 つのサブネットは次のように分かれます
1. `[00001010.00000001.00000001.00]00[0000]`
2. `[00001010.00000001.00000001.00]01[0000]`
3. `[00001010.00000001.00000001.00]10[0000]`
4. `[00001010.00000001.00000001.00]11[0000]`
こんな仕組みでネットワークの分割ができるようになります！

#### 個人的な疑問
ここを勉強してるときにふと疑問に思って調べたことも書いておきます(初歩的すぎますが笑)
##### 疑問① なぜ8 ビットが 255 になるのか？256 じゃないの？
IPアドレスは8ビットを10進数で表現とかいてあったのに
255.255.255.0
と最大値が255なのを不思議に思ってました。

**答え:** 0 も含めて数えるから
なので表記上は最大値が 255 になります。0 から 255 までの 256 通りの値を表現できるけど、実際の最大値は 255になるようです(当たり前か)

##### 疑問② なぜホスト部が 8 ビットの場合、使えるホスト数が 256 台ではなく 254 台なのか？
読んでいる書籍で8ビットなので254台使えると書いてあってまた混乱していました。
**答え:** ホスト部分が全て「1」のアドレスはブロードキャストアドレス、全て「0」はアドレスはネットワークアドレスとして予約されているから。
- **ブロードキャストアドレス**：ホスト部が全て「1」のアドレスで、ネットワーク内の全てのホストにパケットを送信するために使われる
- **ネットワークアドレス**：ホスト部が全て「0」のアドレスで、そのネットワーク自体を指す
この 2 つが予約されているため、実際に使えるホストアドレスは 254 台になるようです！

##### 疑問③ ホスト部はネットワーク内の機器を表すらしいけど具体的に何を指すの？
**答え:**
- ルーター
- Web サーバ  
などが主に該当するようです！
家庭での利用とかでいうと通常、スマホや PC は**グローバル IP アドレスを直接持たず**、グローバル IP はルーターに割り当てられます。
ルーターは LAN（ローカルエリアネットワーク）内に対して**プライベート IP アドレス**を割り振り、各デバイス（PC やスマホなど）はそのプライベート IP で LAN 内で通信するようになってます。
プライベートIPでは外部と通信ができないので、ルーターは**NAT（Network Address Translation）**という仕組みを使って、LAN 内のデバイスが外部のインターネットと通信できるように**アドレス変換**という仕組みを使って通信します

### グローバル IP アドレスの管理
グローバル IP アドレスはネットワーク内で重複してはいけないため、インターネットレジストリと呼ばれる組織(ICANNやJPNICなど）によって管理されています。
グローバル IP が必要な場合は、これらの機関に申請して割り当ててもらう必要があります。

### インターネットレジストリの階層構造
IP アドレスの割り当ては、以下のような階層構造で管理されています
```
ICANN（インターネット全体の管理）
   ↓
地域インターネットレジストリ（RIR: APNIC, ARINなど）
   ↓
国別インターネットレジストリ（NIR: JPNICなど）
   ↓
インターネットサービスプロバイダー（ISP）
   ↓
家庭や企業（最終的なユーザー）
```
- **ICANN**（Internet Corporation for Assigned Names and Numbers）  
   インターネット全体の IP アドレスとドメイン名の管理を行う最上位組織
- **地域インターネットレジストリ（RIR）**  
   地域ごとに、APNIC（アジア太平洋）、ARIN（北米）などの組織が IP アドレスの割り当てを行います
- **国別インターネットレジストリ（NIR）**  
   国ごとに JPNIC（日本）などの組織が存在し、IP アドレスの割り当てを国レベルで管理します
- **インターネットサービスプロバイダー（ISP）**  
   各国のプロバイダー（ISP）は、上位のレジストリから割り当てられた IP アドレスを家庭や企業に提供します
- **家庭や企業**  


## ネットワーク同士の繋がりを知るルーター
ルーターは各ネットワーク同士のつながりの情報を持ち、データがどのルーターやネットワークを通って目的地に到着するのかを調べる役割を持ちます。ルーターが宛先までの経路を探す仕組みを**ルーティング**と呼びます

### ルーティングプロトコル
ルーティングをするときには、ルーティングプロトコルが使用されます
ルーター同士はこのプロトコルを使って、自分がどのネットワークに繋がっているのか情報を交換し合います

### ルーティングテーブル
ルーターは、宛先までの経路情報を記録した**ルーティングテーブル**を持ちます。このテーブルには、「特定のネットワークに属するホストにデータを送るためには、隣接しているどのルーターに転送すべきか」という情報が書かれています

#### ルーティングテーブルの作成方法
1. **静的ルーティング**  
   手動でルーティング情報を設定する
2. **動的ルーティング**  
   ルーティングプロトコルを使い、ルーター同士が自動で経路情報を交換して、ルーティングテーブルを動的に作成します（一般的に使われる方法）

#### デフォルトルート
ルーティングテーブルに宛先がない場合に備え、**デフォルトルート**を設定することがあります
これは、「どこに送ればいいかわからない場合は、このルーターに転送する」というルーターを指します

#### ルーティングプロトコルの種類
ルーティングプロトコルには、様々なアルゴリズムが存在して、大きく分けると3つあります
##### 1. 距離ベクトル型
- 宛先までの**距離（ホップ数：ルーターを通る回数）**を基に経路を選択する
- 一番ホップ数が少ない（最短の）経路を優先する
##### 2. リンク状態型
- ネットワーク全体の**接続状況（リンクの状態）**を把握して、最適な経路を選ぶ
- 高速回線が利用できるかどうかなど、通信速度も考慮して経路を選定する
##### 3. ハイブリッド型
- 距離ベクトル型とリンク状態型の両方の要素を取り入れたプロトコル

## アドレス変換とは
プライベート IP アドレスを持つホストとグローバル IP アドレスを持つホストが通信するときはそのままでは通信できないのでアドレスを変換する必要があります。この仕組みを**NAT（Network Address Translation）**と呼びます

### NAT の動作の流れ
1. **LAN 内のプライベート IP を持つ PC**が、外部のサーバ（例：サーバ B）にデータを送信しようとする
2. データは、**プライベート IP を持つ PC からルーター**に届く
3. ルーターは、プライベート IP を自分の**グローバル IP アドレスに変換**します。この際、どのプライベート IP から来た通信なのかを**記憶**しておく
4. **グローバル IP に変換されたデータ**がサーバ B に送信される
5. サーバ B からのレスポンスが戻ってきたとき、ルーターは**記憶しておいたプライベート IP**に再び変換し、対象の PC にデータを届ける

上記のようにNAT は**プライベート IP アドレスとグローバル IP アドレスを変換**し、内部ネットワーク（LAN）と外部のインターネットをつなげる仕組みになります

### NAT の問題
NAT では、同じネットワーク内で複数のホストが**同じポート番号**を使う場合に、通信の区別ができなくなる可能性があります。どういうことかというとルーターがプライベート IP アドレスをグローバル IP に変換し、**そのグローバル IP にポート番号を付与して通信**を行うからです

#### 例：
例えば、以下の 2 つのプライベート IP を持つホストがあったとする
- **192.168.1.3**
- **192.168.1.4**
これらのホストが同時に、同じポート番号を使って外部に通信を行おうとした場合、ルーターはそれぞれのプライベート IP アドレスをグローバル IP に変換し、同じ**グローバル IP アドレスに同じポート番号**が割り当てられる可能性がでてしまいます
- 192.168.1.3 → `118.0.10.124:61234`
- 192.168.1.4 → `118.0.10.124:61234`
このようにポート番号が同じだと区別がつかなくなってしまうケースがあります

### NAT の対応策
1. **NAPT（Network Address Port Translation）**  
   NAT では、この問題を解決するために**NAPT**という仕組みが導入されています
   NAPT では、IP アドレスだけでなく、**ポート番号も含めて変換**するので同じネットワーク内で複数のホストが同じポート番号を使っていても、グローバル IP 側のポート番号を動的に変更して区別できるようになります
例
- 192.168.1.3 → `118.0.10.124:61234`
- 192.168.1.4 → `118.0.10.124:61235`


### LAN内の機器が外部からの通信を受け付ける方法
LAN 内のプライベート IP アドレスを持つ機器は、直接グローバル IP アドレスを持たないため、外部（インターネット）からの通信を直接受け取ることはできません。
ただ、以下のような方法で届けることができます

### 1. ポートフォワーディング（Port Forwarding）
**ポートフォワーディング**という仕組みを利用すれば、外部から特定のポート番号宛てに来た通信を、あらかじめ設定しておいた LAN 内の特定の機器に転送することができます
#### 例
- 外部の IP アドレス **118.0.10.124** に対してポート **80**（HTTP 通信）でアクセスがあった場合、それを LAN 内のプライベート IP **192.168.1.100** に転送する設定をする

### 2. 内部からの定期チェック（Pull 型通信）
SNS の新着メッセージ確認やメールの新着通知など、内部から定期的に外部のサーバーに接続してデータを取得する「Pull 型通信」を利用する

## ドメインとは？
**ドメイン**は、IP アドレスを人間が理解しやすい形式に変換したものです。ドメイン名と IP アドレスの対応は**DNS サーバ**（Domain Name System サーバ）によって管理されています。
以下のような URLだと
```
http://www.xxxxx.co.jp
```
- **「www」** はホスト名を指します
- **「xxxxx.co.jp」** がドメイン名です
ドメイン名は IP アドレスと対応しており、DNS サーバがこの対応関係を保持しています。ユーザーがドメイン名を入力すると、**DNS サーバに問い合わせを行い、IP アドレスを取得**してアクセスするといった流れになります。
### ドメイン名の構造
ドメイン名は階層構造があって、各部分に異なる役割があります
- **トップレベルドメイン（TLD）**  
  例: `.com`, `.jp`, `.org`など。ドメイン名の最後の部分
- **セカンドレベルドメイン**  
  例: `co`（「xxxxx.co.jp」の「co」部分）。トップレベルドメインの直前にくる部分
- **サードレベルドメイン**  
  例: `xxxxx`（「xxxxx.co.jp」の「xxxxx」部分）。組織や企業名が含まれることが多い

### DNS サーバの階層構造
DNS サーバも階層的に管理されています
1. **ルート DNS サーバ**  
   ドメイン名の最上位に位置するサーバです。トップレベルドメイン（TLD）サーバの情報を保持
2. **トップレベルドメイン（TLD）サーバ**  
   `.com`, `.jp` などのトップレベルドメインを管理する DNS サーバ
3. **セカンドレベルドメインの DNS サーバ**  
   例: `co.jp`など、さらに下位のドメインを管理するサーバ

### DNS サーバへの問い合わせの流れ
DNS サーバは、大きく分けて次の 2 種類に分類されます
- **コンテンツサーバ**  
  ドメイン名と IP アドレスの対応関係を保持しているサーバ。実際のドメイン名の管理を行う
- **キャッシュサーバ**  
  外部からの問い合わせに応じて、IP アドレスを返すサーバ。一度問い合わせた情報をキャッシュとして保持し、同じリクエストに対しては再度問い合わせを行わずに返答できる

#### DNS 問い合わせの流れ
1. ユーザーがウェブサイトにアクセスするとき、まず**キャッシュサーバ**に問い合わせを行う
2. キャッシュサーバにその情報がなければ、**コンテンツサーバ**に問い合わせる
3. コンテンツサーバは、トップレベルドメイン（TLD）サーバやルート DNS サーバに問い合わせ、階層的に調査し、最終的に正しい IP アドレスを取得する
4. IP アドレスが特定されると、その結果をユーザーに返し、キャッシュサーバにも保存されます。次回の同じリクエストは、キャッシュサーバから直接返されるため、問い合わせが迅速に行われる


## DHCP（Dynamic Host Configuration Protocol）とは
**DHCP**は、ネットワーク内のデバイスに対して**プライベート IP アドレスを動的に割り当てる機能**を持つプロトコルです。DHCP サーバは通常はルーターに内蔵されていて、ネットワークに接続されたデバイスに自動で IP アドレスを割り当てる役割を持ちます

### DHCP の主な役割
1. **IP アドレスの自動割り当て**：
   - DHCP サーバは、ネットワーク内に接続されたデバイス（PC、スマホなど）に対して、自動で利用可能な IP アドレスを割り当てる
2. **他の設定情報の提供**：
   - DHCP サーバは、IP アドレスだけでなく、**サブネットマスク、デフォルトゲートウェイ、DNS サーバ**などのネットワーク設定情報も同時に提供する

## DHCP の動作の流れ

1. **DHCP Discover**（ブロードキャスト送信）
- 新しい機器がネットワークに接続されると、DHCP サーバを探すために**DHCP Discover**メッセージをブロードキャストで送信する。
2. **DHCP Offer**（IP アドレスの提案）
- DHCP サーバは、受け取った DHCP Discover メッセージに対して、使用可能な IP アドレスを**DHCP Offer**メッセージとして送ります。
3. **DHCP Request**（IP アドレスのリクエスト）
- 新しい機器は、受け取ったIP アドレスの中から 1 つを選んで、その IP アドレスを使うことを示すメッセージを送ります
4. **DHCP Acknowledge**（承認）
   - DHCP サーバは、その IP アドレスを新しい機器に割り当て、**DHCP Acknowledge**メッセージで確認します。この際に、**サブネットマスク、デフォルトゲートウェイ、DNS サーバ**の情報も一緒に送信されます

個人的に調べたのですが、家でWi-Fi接続するときとかもこの流れで行うみたいです！
**Wi-Fi 接続の時の動き**
1. SSID、パスワードを入力
2. **Wi-Fi 接続の確立**
- 正しいパスワードが入力されると、デバイスは無線ルーターに接続し、ネットワークへのアクセスが確立する
3. **DHCP の動作開始**
- Wi-Fi 接続が確立した後、デバイスが IP アドレスを持っていなかったら、**DHCP Discover メッセージ**を送信し、DHCP サーバ（ルーターとか）が IP アドレスを提供する
4. **IP アドレスの取得**
- DHCP サーバが、デバイスに使用可能なプライベート IP アドレスを割り当てる

身近なところでわかるとイメージしやすかったです！

## まとめ
今回はインターネット層とIPについて学んだことをまとめました！
これまでネットワークについて何度か学ぼうとしましたが、通信の流れや全体像をつかむのが難しく感じていました
今思うと、LAN（Local Area Network）内のプライベートIPとルーターに割り当てられるグローバルIPの違いが、うまく区別できていなかったことが一つの原因だったなと感じます。

- 普段使用しているインターネット環境では、プロバイダーとの契約によってグローバルIPがルーターに割り当てられる
- 一方、自分のPCやスマホなどは、ルーター内のLANに属し、LAN内では別のプライベートIPが使われる
- LAN内ではそのプライベートIPでPCやスマホ等のデバイスが識別され、外部との通信はルーターを介して行われる
- このとき NAT を利用して、プライベートIPとグローバルIPを変換することで実現する

この辺がイメージできた時に
グローバルIPの数は限られていて、世界中でインターネット使われてるのに何で大丈夫なの？？
と思っていた不思議がやっと解消されたように思います！笑
IPアドレスが指し示すホスト部の一つひとつが個人のスマホやPC単位だと思い込んでたからですね笑
この辺は、LAN内のプライベートIPでの管理、サブネットによる分割によって実現できているのだとようやく少し理解できました
改めて圧倒的な基礎知識の不足を感じましたね。

次は引き続き、ネットワークインターフェース層について学んでいきたいです

## 参考書籍

https://www.sbcr.jp/product/4815623333/