ネットワーク（TCP/IP）入門

# コンピュータネットワーク

かつては、コンピュータは単体で使われており、データは個々のコンピュータが持っていたため、それぞれで修正を行う必要があった。

コンピュータネットワークが考え出されたことにより、複数のコンピュータを互いに接続し、個々のコンピュータが持つ情報を共有したり、送ったりすることができるようになった。

コンピュータネットワークは、LANやWANなどに分類される。

- **LAN（ラン / Local Area Network）**: フロア内や、1つの建物や大学のキャンパスなど、限られた狭い地域の中でのネットワーク。
- **WAN（ワン / Wide Area Network）**: 離れた地域のコンピュータやLAN同士を接続した、広範囲に及ぶネットワーク。

# OSI参照モデル

- **OSI（Open Systems Interconnection / 開放型システム間相互接続）**
    - ISO（国際標準化機構）により標準化された通信体系のこと。
    - 通信プロトコルの標準化により、コンピュータのハードウェアやOSの違いを意識することなく、ネットワークに接続されたコンピュータと通信できるようになった。
- **OSI参照モデル**
    - 通信に必要な機能を7つの階層に分け、ネットワークプロトコルを単純化するためのモデル。
    - 各階層は特定の「サービス」を提供する。

| レイヤー | 機能とデータ | 代表的なインターネットプロトコルスイート |
|:-:|:-:|:-:|
| 7. **アプリケーション層** | 名前解決、テキスト転送、ファイル転送、メール転送、遠隔ログイン（仮想端末）など、アプリケーションを実現するためのサービスを提供する。<br>HTTPリクエストヘッダ、HTTPレスポンスヘッダと、Webページ、メールの内容などをデータとして含む。 | DNS、HTTP、FTP、SMTP、URI、SSH、Telnet |
| 6. **プレゼンテーション層** | アプリケーション層が文字列、画像、音声などのデータを扱うために、データ形式を変換する。<br>文字コードの変換やデータの圧縮、SSL/TLSによる暗号化情報を含む。 | MIME、HTML、FTP、DSMTP、Telnet |
| 5. **セッション層** | コネクションの確立や切断（ハンドシェイク）、暗号化アルゴリズムの選択など、通信のセッションに関する管理を行う。 | TLS/SSL | 
| 4. **トランスポート層**  | 再送制御、フロー制御など、ホストコンピュータ間の通信の信頼性を管理し、制御する。<br>通信を行う両端のノードだけで処理され、途中のルーターでは処理されない。 | TCP、UDP、SCTP  |
| 3. **ネットワーク層** | 通信経路の選択（ルーティング）を行う。<br>通信の宛先はルーターを経由した先にある場合もあるため、アドレス体型決めや、どの経路を使うかなどを選択する。 | IP、ICMP、ARP |
| 2. **データリンク層** |  物理層で（場合によっては仮想的に）接続されている、隣接した2つのノード間の通信を可能にする。<br>ビット列（0と1の数字の列）をフレーム（意味のある単位のかたまり）として、伝送・受信する。| Ethernet、Wi-Fi、PPP |
| 1. **物理層** | 機器間がケーブル、コネクタ、アンテナ、電磁波などの上で通信できるように、それらの形状に応じて、ビット列を、電気信号、光信号に変換する。 | 電話線、リピータ、ハブ、無線（Wi-Fi、Bluetooth）、光ケーブル |

データを表す単位のことを **パケット** と呼ぶ。
パケットは、「ヘッダ」と「データ」から構成されている。

* **ヘッダ**
    * パケットの送信元と送信先のアドレス ... IPアドレス（ネットワーク層）、MACアドレス（データリンク層）など、階層に応じたアドレス
    * プロトコル情報 ... 次にどのプロトコルで処理するかを示す情報（例: IPヘッダ内のプロトコルフィールドでTCP: 6, UDP: 17）
    * パケットの順序
    * エラーチェック
* **データ**
    * 各階層間で転送されるデータ本体。

インターネットプロトコルにおいて、各階層は異なるデータを持つ。

パケットには以下のようなものがある。

* **IPパケット**: TCPセグメント または UDPデータグラムにIPヘッダを追加したデータ。IPヘッダは、送信元と受信先のIPアドレスを含む。一般的にパケットといった時、IPパケットのことを指すことが多い。
* **TCPセグメント**: 上位層のデータにTCPヘッダを追加したデータ。TCPヘッダは、送信元の受信先のポート番号やデータの順序情報などを含む。
* **UDPデータグラム**: 上位層のデータにUDPヘッダを追加したデータ。コネクションレスで送信される。

上位の階層では、以下のようなデータの単位が扱われる。

- HTTPリクエスト、レスポンス

下位の階層では、以下のようなデータの単位が扱われる。

* **フレーム**: IPパケットにMACヘッダとトレーラーを追加したデータ単位。MACヘッダは、送信元と受信先のMACアドレスを含む。
* **ビット**: 「0」「1」で表される情報量の単位。 例: 「10010111」は「8bit（1Byte）」。

# TCP/IPプロトコルスイート

TCPやIP、およびその周辺の主要なコンピュータネットワークで最もよく使われるプロトコル群をまとめて、TCP/IPプロトコルスイートと呼ぶ。

TCP/IPプロトコルスイートといった場合、TCP、IPだけでなく、インターネット通信に必要な多くのプロトコルが含まれる。

| レイヤー | 代表的なプロトコル | 説明 |
|:-:|:-:|:-:|
| 4. **アプリケーション層** |  DNS、HTTP、URI、MIME、HTML、FTP、DSMTP、Telnet、SSH、Telnet、FTP、SMTP | アプリケーションプログラムが通信できるようにする|
| 3. **トランスポート層** | TCP、UDP、SCTP | ホスト間通信の信頼性を提供する |
| 2. **インターネット層** | IP、ICMP、ARP | データをネットワーク間で転送する |
| 1. **リンク層** | Ethernet、Wi-Fi、PPP | ノード間の通信を制御する |

OSI参照モデルとよく似ているが、IETFによって、インターネット・プロトコルと構造の開発はOSIに準拠する事は意図しない、という事が述べてられている模様。

次の図のように、矢印の方向に各層をわたって、ホスト間でデータの通信が行われる。

![internet_connection_image.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/da6862ea-9320-73ce-cfd9-3038b7783414.png)

https://youtu.be/0y6FtKsg6J4

https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%83%BB%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%83%BB%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%88

# ネットワークを構成する機器とその役割

実際にネットワークを構築するときに必要になる、さまざまなケーブルや機器。
とくに、コンピュータ同士を接続するためのハードウェア。

| 機器 | 例 | 役割 |
|:-:|:-:|:-:|
| **ネットワークインタフェース** | 有線LAN（NIC）、無線LAN（Wi-Fi）、USBポート | コンピュータをネットワークに接続するための装置|
| **リピーター** | リピーターハブ | ネットワークを物理層で延長する装置 |
| **ブリッジ** / <br>**レイヤ2スイッチ** | スイッチングハブ | ネットワークをデータリンク層で延長する装置 |
|　**ルーター** / <br>**レイヤ3スイッチ** | ルーター（ブロードバンドルーター、CPE） | ネットワーク層によってパケットを転送する装置 |
| **レイヤ4-7スイッチ** | ロードバランサー |　トランスポート層より上の情報でトラフィックを処理する装置 |


# OSI参照モデルの各層の代表的なプロトコル
## 7. アプリケーション層

### DNS（Domain Name System）

ドメイン名とIPアドレスの対応関係を管理し、名前解決を行うためのシステム。

インターネットの電話帳（名前:電話番号 = ドメイン名:IPアドレス）に相当する。
DNSの通信では、トランスポート層のプロトコルとしてTCP/UDPのいずれも使用できる（TCP53番ポート/UDP53番ポート）。

DNSの通信では、ユーザーがブラウザにウェブサイトのドメイン名を入力した時に、ブラウザによって問い合わせが行われる。

#### ドメイン名

IPアドレスを人にとって理解しやすくした文字列。

インターネット上の住所表示。

インターネット上のコンピューターにはすべてIPアドレスが割り振られており、コンピューター同士の場所の特定はIPアドレスで行われるが、
IPアドレスでは人にとってわかりにくいため、理解しやすい文字列であるドメイン名をIPアドレスに対応付けて使われる。

![img1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/5d5fd7b0-7342-3638-8b5c-328a5722a030.gif)

![img2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/377ecc65-a74f-027a-be9d-a03ba03acd78.gif)

ドメイン名は、左側のラベルほど階層が深くなるよう（3LD ← 2LD ← TLD）に設計されている。

![domain_name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/93f02f44-5724-04be-f614-c787e5b22d27.png)

https://jprs.jp/related-info/about/address/

https://jprs.jp/glossary/index.php?ID=0083

#### ドメインレジストリ（domain name registries）

特定のトップレベルドメイン (TLD) を管理・運営する事業者のこと。
**ICANN（Internet Corporation for Assigned Names and Numbers）** という非営利組織の認可を受けて運営されている。

各ドメイン名とその対応するネームサーバーの情報、ドメイン所有者の情報を管理・保存したり、
ユーザーが直接レジストリとやり取りするのではなく、レジストラを通じてドメインを登録・更新するための仕組みを提供する。

TLDとそれを管理するレジストリの例:

| TLD | ドメインレジストリ |
|:-:|:-:|
| .com, .net  | Verisign  |
| .org  | PIR (Public Interest Registry)  |
| .app, .dev, .page  | Google Registry |
| .jp | JPRS（Japan Registry Service） |

https://jprs.jp/glossary/index.php?ID=0102

#### ドメインレジストラ（domain name registrar）

レジストリと連携し、ユーザーがドメイン名を登録・管理できるようにするための事業者のこと。
レジストリにドメインを登録するための **仲介業者**。
**ICANN（Internet Corporation for Assigned Names and Numbers）** という非営利組織の認可を受ける必要がある。

TLDのゾーン情報はドメインレジストリによって管理されているが、一般ユーザーが直接レジストリにアクセスして親ゾーン情報を更新することはできないため、認可されたドメインレジストラを通じて更新を行う。

レジストラの例:
- お名前.com
- バリュードメイン
- ムームードメイン
- GoDaddy
- Namecheap
- Squarespace
- Amazon Route 53

https://jprs.jp/glossary/index.php?ID=0101

#### 名前解決

ドメイン名に対応するIPアドレスを探し出す仕組みのこと。

「**問い合わせ**」と「**応答**」によるやりとり。
問い合わせには、 「**ドメイン名**」と「**種類（タイプ）**」が指定される。

例: 「example.jp」の「IPアドレス」

#### ゾーン

DNSは、**委任**によって、ドメイン名に対応する形で管理範囲を階層化している。
- **ゾーン**
    - 委任によって管理を任された範囲のこと。
    - ゾーンの例
        - ルートゾーン
        - jpゾーン
        - example.jpゾーン
        - abc.example.jpゾーン
- **ネームサーバー（DNSサーバー）**
    - 自身が管理するゾーンおよび委任情報（委任先の権威サーバーに関する情報）を保持し、問い合わせに対して自身が管理している情報のみを答えるサーバー。
    - NSリソースレコードにより指定される権威サーバー。

![zone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/80ec4708-eb57-7fe6-db2e-48f0365517a4.png)

https://jprs.jp/glossary/index.php?ID=0142

https://jprs.jp/glossary/index.php?ID=0157

https://jprs.jp/glossary/index.php?ID=0145

#### DNSの3つの構成要素

##### 1. **スタブリゾルバ（DNSクライアント）**
- クライアントサイドのホストやソフトウェア。
- **名前解決の要求**
    - フルリゾルバに名前解決を要求する。
    - Webブラウザは、スタブリゾルバのAPIを使用して、ドメイン名に対応するIPアドレスを調べる。
    - Webブラウザは、スタブリゾルバからIPアドレスを受け取ると、そのIPアドレスを使用してWebサーバーにアクセスする。
##### 2. **フルサービスリゾルバ（キャッシュDNSサーバー）**
- **名前解決**の実行
    - スタブリゾルバから送られる名前解決の要求を受けて、権威サーバーに対して問い合わせを行い、結果をスタブリゾルバに返す。
- **DNSキャッシュ**
    - 以前に名前解決されたDNS問い合わせの結果を一時的に保存しておくことで、同じドメイン名に対する繰り返しのクエリを高速に解決でき、インターネットのトラフィックを軽減する。
    - キャッシュされたデータの有効期限（**TTL / Time To Live**）が切れた場合、新たなDNS問い合わせを行う。
##### 3. **権威サーバー（ネームサーバー）**
- フルサービスリゾルバに、必要な情報を提供する。
    - ドメイン名に関連するIPアドレスやサブドメイン、メールサーバーの情報など、さまざまなDNSレコードを管理している。
- 以下の2つは、特別な役割を担う権威サーバー。
    1. **ルートネームサーバー（Root nameserver）**
        - ルートゾーンを管理する権威サーバー。
    - フルサービスリゾルバに、「トップレベルドメイン（TLD）のネームサーバー」への委任情報を返す。
        - インターネット上のドメイン名階層の最上位（`.`）に位置する。
        - 世界中に分散して存在し、13個のIPアドレスで表現される。
    2. **TLDネームサーバー（Top Level Domain nameserver）**
        - トップレベルドメイン（例： `.com` 、 `.org` 、 `.jp` など）のゾーンを管理する権威サーバー。
        - フルサービスリゾルバに、「特定のドメイン名のネームサーバー」への委任情報を返す。

![stub-resolver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/ec897205-6f03-0e3e-a7f0-1ce03462c606.png)

https://jprs.jp/glossary/index.php?ID=0197

![Everything You Need to Know About DNS_ Crash Course System Design #4 5-25 screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/54edaee5-9ef8-394f-64a5-a73fb9c852b4.png)

https://youtu.be/27r4Bzuj5NQ

#### DNSレコード（リソースレコード）

DNSレコードは、DNSがドメインのIPアドレスを名前解決したときに、権威サーバーが返す応答の一部。

##### DNSレコードの構成要素

```
$ dig yokoto.net. ns @1.1.1.1
...
;; QUESTION SECTION:
;yokoto.net.			IN	NS
;; ANSWER SECTION:
yokoto.net.		3600	IN	CAA	0 issue "amazon.com"
```

| タイプ | 内容 |
|:-:|:-:|
| ドメイン名  | DNSクエリ（問い合わせ）で指定したドメイン名 | 
| TTL<br>（Time to live） | 名前解決の応答のキャッシュの有効期限（秒単位） |
| クラス | ネットワークの種類で、インターネットを意味する「IN」が入る  |
|　タイプ | DNSレコードのタイプ参照 |
| データ | タイプによって異なる、リソースレコードのデータが入る | 

##### DNSレコードのタイプ

| タイプ | 内容 | 例 |
|:-:|:-:|:-:|
| SOA（Start Of Authority）  | 1つのゾーンに1つだけ記述され、**ゾーンの起点** を示し、ゾーンの管理情報を指定する | example.com -> ns1.example.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400|
| CAA（Certification Authority Authorization）  | ドメインの証明書を発行することができる **認証局** を指定する | example.com -> 0 issue "amazon.com" |
| A（Address）  |  ドメインの **IPv4アドレス** を指定する | example.com -> 192.0.2.1 |
| AAAA（Quad-A）  | ドメインの **IPv6アドレス** を指定する | example.com -> 2001:0db8:85a3:0000:0000:8a2e:0370:7334 |
| NS（Name Server）  | ゾーンのDNSクエリを実際に処理する **権威サーバー（ネームサーバー）** のホスト名を指定する | example.com -> <br>ns1.example.com.,<br>ns1.example.org.,<br>ns1.example.net.,<br>ns1.example.uk. |
| CNAME（Canonical Name） | 別名（エイリアス）となるドメインの **正規のドメイン** を指定する<br>（例: サブドメインをエイリアスとして指定する、CDNのドメインを正規のドメインとして指定する、など）  | blog.example.com -> example.com<br>www.example.com -> cdn.example.com  |
| MX（Mail Exchanger）  | ドメイン宛のメールの受信元となる **メールサーバー** のホスト名を指定する | example.com -> mail.example.com |
| TXT（Text）  | ドメインから送信されたメールを認証するための **SPF**、**DKIM**、**DMARCレコード**や、任意のテキスト情報を指定する | example.com -> "v=spf1 include:_spf.google.com ~all" |

https://www.cloudflare.com/ja-jp/learning/dns/dns-records/

https://jprs.jp/glossary/index.php?ID=0165

### HTTP（HyperText Transfer Protocol）

Webシステムにとって最も重要なアプリケーション層のプロトコル。
HTML、CSS、JavaScript、画像、音声、動画などの送受信を、WebブラウザとWebサーバー間で行うためのプロトコル。

以下のような特徴を持つ。

- クライアント/サーバーモデル
    - クライアントがサーバーに情報を要求し、サーバーがクライアントに情報を送信する。
- ステートレス
    - HTTPサーバーは、HTTPクライアントの状態を保持しない。
- リクエストメソッド
    - GET、POST、PUT、DELETE等
- ステータスコード
    - 成功 2xx、リダイレクト 3xx、クライアントエラー 4xx、サーバーエラー5xx
- HTTPヘッダ
    - Content-Type、認証、キャッシュなどのメタデータ

HTTPリクエストヘッダの例:

```
POST /api/v1/resource HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Content-Length: 85
```

HTTPレスポンスヘッダの例:

```
HTTP/1.1 200 OK
Date: Sat, 08 Jun 2024 12:00:00 GMT
Server: Apache/2.4.41 (Unix)
Content-Type: application/json
Content-Length: 75
Connection: close
```

Google Chrome Developer toolsのNetworkタブを開いた状態でリクエストを送ってみることで確認することもできる。


#### HTTP/1.1
* 1つのHTTPリクエストとレスポンスが1つのTCP接続上で送受信される。
* ホストヘッダーが使えるようになったバージョン。

#### HTTP/2

* HTTP/1.1 の問題を解決することで、高速かつ効率化されたバージョン。
* 以下の特徴を持つ。
    1. **多重化**
        * 複数のHTTPリクエストとレスポンスが1つのTCP接続上で送受信できるようになった。
    2. **サーバープッシュ**
        * クライアントがリクエストしていないファイルをWebサーバー側が自動的に判断してクライアントに送信できるようになった。
    3. **ヘッダ圧縮**:
        * HTTPヘッダの圧縮に、HPACKと呼ばれる高度な圧縮方法を使用するため、読み込みのスピードがアップした。。
* h2
    * HTTP/2 over TLS。
    * TLSで保護されたコネクション上（いわゆるhttps）でHTTP/2を利用することを示す。
* h2c
    *  暗号化されていないTCPコネクション上（いわゆるhttp）でHTTP/2を利用して通信を行うことを示す。
    *  **一般的なWebブラウザはh2cに未対応となっているため、HTTP/2を利用するためには事実上TLSが必須** となる。

#### HTTP/3
* より多数のクライアント接続をサポートし、（HTTP/1.1、HTTP/2で使用していた）TCPの代わりに **UDP** を使用する。

https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol

https://knowledge.sakura.ad.jp/7734/

https://knowledge.sakura.ad.jp/7735/

https://www.cloudflare.com/ja-jp/learning/performance/http2-vs-http1.1/


### SMTP（Simple Mail Transfer Protocol）

電子メールを配送するアプリケーションプロトコル。

#### MTA（Mail Transfer Agent） / SMTPサーバー

MTAは、SMTPを利用してメールを送受信するソフトウェアのこと。
SMTPサーバーは、MTAの一種であり、SMTPを利用してメールを送受信するサーバーのこと。

SMTPサーバーは、メールの送信に特化した **送信用メールサーバー** と、受信を行う **受信メールサーバー** に分けられる。

以下のような種類がある。

* **Postfix**
    * 最もポピュラーなオープンソースのMTA。
    * 送信元メールサーバー、受信メールサーバーの両方の役割を持つ。
* **smtp.gmail.com**
    * Gmailの送信用SMTPサーバー。
    * 個人ユーザーまたは小規模なビジネスが一般的なメール送信のために使用する。
    * Gmail自体は、受信メールサーバーの役割を持つ。
* **Amazon SES**
    * AWSが提供する送信用SMTPサーバー。
* **SendGrid**
    * 企業や開発者が大量のメールを送信するために使用される送信用SMTPサーバー。
    * カスタマイズ性やスケーラビリティに優れる。
    * 開発初期は、Postfixをカスタマイズして使っていた。

https://aws.amazon.com/jp/what-is/smtp/

https://sendgrid.kke.co.jp/blog/?p=3018

#### 迷惑メール対策

SMTPには送信者を認証するための機能がなく、迷惑メールの送信に自分の送信用メールサーバーが使われてしまうことを防ぐためには、以下のような対策が取られる。

* **SMTP認証（SMTP Authentication）**
    * メール送信時にSMTPサーバーで、 **メールの送信元ユーザーの認証** を行うようにしたSMTPの拡張仕様。
* **SPF（Sender Policy Framework）**
    * 受信側メールサーバーが、以下を比較することによって **送信元のドメイン認証** をする仕組み。
1. 受信したメールのヘッダに記載された送信元メールサーバーのIPアドレス
2. メールの送信ドメイン（ `gmail.com` , `amazon.com`, `qiita.com` など）にDNS問い合わせを行うことで取得できる、SPFレコードに登録された送信元メールサーバーのIPアドレス

* **DKIM（DomainKeys Identified Mail）**
    * 送信元メールサーバーで電子署名を付与し、受信側メールサーバーで電子署名を認証することで、**送信元のドメイン認証** をする仕組み。
    * 送信元メールサーバーで署名に使用する公開鍵をDNSサーバーに登録しておき、受信側メールサーバーが公開鍵を取得し署名を認証できるようにする。
* **DMARC（Domain-based Message Authentication, Reporting and Conformance）**
    * SPFやDKIMなど送信元ドメインを認証する仕組みにおいて、認証が失敗したときのメールの取り扱いポリシーを送信者がDNSサーバーに登録して公開する仕組み。
    * 受信側メールサーバーは、認証に失敗した場合に送信者のポリシーによって取り扱いを決定したり、送信者へ認証に失敗したことを通知したりすることができる。

## 5. セッション層

### SSL（Secure Sockets Layer）/ TLS（Transport Layer Security）

TLSおよびその前身であるSSLは、通信を **暗号化** するためのプロトコル。

- 通信の暗号化が行われない場合のリスク
    - 悪意のある人が通信の内容を覗き見することができてしまう。

#### SSL/TLS証明書（Secure Socket Layer / Transport Layer Security Certificate）

- 以下の2つの目的を持つ、通常**サーバーに設定される**証明書のこと。

1. **クライアントが接続を試みるドメインの認証**
     - Webブラウザの例:
         - 「アドレスバーに入力されたURLのドメイン名」が、接続先のサーバーに設定されている「SSL証明書に含まれるドメイン名」と一致しており、正当なサーバーにHTTP接続しようとしていることを証明する。
         - TCP接続時に一致しないことが判明した場合、「この接続は安全ではありません」という警告が表示される。
     - cURLの例:
         - 「curlコマンドの引数として渡されたURLのドメイン名」が、接続先のサーバーに設定されている「SSL証明書に含まれるドメイン名」と一致しており、正当なサーバーにHTTP接続しようとしていることを証明する。
         - TCP接続時に一致しないことが判明した場合、「 `curl: (60) SSL certificate problem: certificate does not match requested host name` 」というエラーが表示される。
     - 偽物のサーバーに接続してしまうリスクを減らすことができる。
     - Webブラウザの例では、ドメインの認証は具体的には以下の流れで行われる。
        1. ユーザーがWebブラウザでドメイン（例: https://example.com ）を入力すると、Webブラウザから、そのドメインに対応するサーバーにリクエストが送信される。
        2. サーバーは、リクエストを受け取ると自身のSSL証明書をWebブラウザに返す。
SSL証明書は、認証局（CA）によって署名、発行されており、サーバーのドメイン名とサーバーの公開鍵を含む。
        3. Webブラウザは、
a. SSL証明書に含まれているドメイン名が、Webブラウザに入力されたドメイン名と一致しているか
b. SSL証明書が認証局（CA）によって署名されているか
c. SSL証明書が有効期限内であるか
を確認する。
2. **通信の暗号化**
    - SSL証明書に含まれる公開鍵を使用し、SSL/TLSプロトコルによる通信データの暗号化を行ない、HTTPSのWebアドレスを使用できるようになる。
    - 通信内容に含まれる個人情報の盗聴を防ぐことができる。

#### **認証局（CA / Certificate Authority）**

- 申請者のドメインを検証し、SSL証明書の署名と発行を行うところ。
- 認証局によって、SSL証明書は以下のように発行される。
1. 申請者による、**CAA（Certificate Authority Authorization）レコードの追加 ※ オプション**
    - SSL証明書の発行プロセスを開始する前に、ドメインの所有者（SSL証明書発行の申請者）は **どの認証局（CA）からSSL証明書を発行してもらうことを許可するか** を制御するために、自身が管理するドメインのホストゾーンにCAAレコードを追加する。
        - `example.com. CAA 0 issue "letsencrypt.org"`
    - もし認証局（CA）がCAAレコードで追加されなければ、任意のCAが証明書を発行できる。
1. 申請者による、**SSL証明書発行の申請**
    - 申請者は、**証明書署名要求（CSR / Certificate Signing Request）** を生成し、認証局に送信する。
    - CSRには以下が含まれる。
        - サーバーの公開鍵
        - サーバーのドメイン名
        - 申請者の組織名や所在地（OVやEVの場合）
        - 申請者の連絡先
1. CAによる、**申請者の検証**
    - 以下のように異なる検証のレベルがある。
        1. **DV（Domain Validation / ドメイン検証）**
            - 申請者が実際にドメインの所有者であることを確認する。
            - 申請者は、自身が管理するドメインのホストゾーンに、認証局が指定したサブドメインを、認証局が所有するランダムな文字列を含む正規のドメインにCNAMEレコード（あるいはTXTレコード）を使ってマッピングする。認証局は、DNSクエリを通じてそのレコードを確認、検証する。
                - `_acme-challenge.example.com. IN CNAME _random-string.acme-validation-ca.com.`
            - メールやファイルの配置などによる検証方法もある。
        2. **OV（Organization Validation / 組織検証）**
            - 申請者の組織情報を確認する。
            - 登記情報や物理的な住所などによって情報を検証される。
        3.  **EV（Extended Validation / 拡張検証）**
            - 申請者の組織に対する詳細な検証が行われる。
            - 金融機関など向け。
    - この時の検証のレベルに応じて、SSL証明書の種類が定まる。
        - e.g. **DV証明書**、**OV証明書**、**EV証明書**
2. CAによる、**SSL証明書の署名**
    - SSL証明書は、**証明書チェーン（Certificate Chain）** という複数の階層の証明書チェーンによって信頼性を証明する。
        1. **ルート証明書**
            - ルート証明書は認証局（CA）によって自己署名されており、これが信頼の起点となる。
            - ルート証明書は多くのブラウザで、OSに事前にインストールされている。
                - Firefoxはブラウザ自体が持つ証明書を使用する。
            - **公開鍵** を含んでおり、中間CA証明書やSSL証明書を検証するために使用される。
        2. **中間CA証明書**
            - ルート証明書によって署名されている。
        3. **SSL証明書（サーバー証明書）**
            - 中間CA証明書によって署名されている。
            - サーバー内にインストールされる。
            - Webブラウザは、このサーバーにインストールされた証明書を検証することで、アクセスしようとしたドメインが正当な所有者によって管理されているかを確認することができるようになる。
3. CAによる、**SSL証明書の発行**
    - 認証局による、申請者のドメイン所有権の検証を終えると、SSL証明書が発行される。
    - 発行されるSSL証明書には、以下の情報が含まれる。
        - サーバーの公開鍵
        - サーバーのドメイン名
        - 認証局による署名
        - 証明書の有効期限
- 認証局の例
    - Let's Encrypt
    - GlobalSign
    - GeoTrust
    - Amazon Trust Services
    - Google Trust Services

https://laboradian.com/issuing-ssl-certificate/

https://www.cloudflare.com/ja-jp/learning/ssl/what-is-an-ssl-certificate/

https://qiita.com/hisato_imanishi/items/0aed2c3f5f87c1848d34

https://qiita.com/yasushi-jp/items/ff848bd1bd4193003b2f

#### mTLS（Mutual TLS authentication）

- SSL/TLS証明書では、サーバーに証明書を設定することでサーバーへの安全な通信を確立したが、それに加え、SSL/TLS証明書をクライアントにも設定することで、正しいクライアントのみがサーバーへ通信することができるようにするための機能のこと。
- オンラインバンキング、自動車、ゲームデバイスなどの企業間 (B2B) アプリケーションで、デジタル証明書を使用してデバイスを認証するためによく使用される。

![2023-mTLS-on-ALB-1-diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/e2568599-1ea6-cdce-4b72-3168b336cd83.png)


https://aws.amazon.com/jp/blogs/news/mutual-authentication-for-application-load-balancer-to-reliably-verify-certificate-based-client-identities/

#### HTTPS（Hypertext Transfer Protocol over TLS/SSL）
- TLS/SSLを使って、HTTP通信が暗号化されたプロトコル。
- デフォルトではポート番号 **443** が使用される。
1. 最初に、公開鍵暗号方式を使用して、送信者と受信者が安全に共通鍵を共有できるようにし、
2. その後、データの送受信は共通鍵暗号方式を用いて暗号化処理が行われる。

#### 公開鍵暗号方式（非対称暗号化）

- HTTPSでは、公開鍵暗号方式で、**共通鍵の暗号化**を行う。
- サーバーは、**公開鍵**とそれに対応する**秘密鍵**という、ペアになる2つの鍵を生成する。
    - クライアントは、サーバーから提供された **公開鍵でデータを暗号化** する。
    - サーバーは、その公開鍵に対応する自身の **秘密鍵でデータを復号化** できる。
- メリット: 暗号化の鍵の配布が容易であり、認証も可能。
- デメリット: 計算量が多く、通信速度が遅い。

#### 共通鍵暗号方式(対称暗号化)

- HTTPSでは、共通鍵暗号方式で、**通信データの暗号化**を行う。
- クライアントは**共通鍵**を使用してデータを暗号化し、サーバーは同じ共通鍵を使用してデータを復号化する。
- クライアントとサーバーは、共通鍵を事前に安全に共有する必要がある。
- メリット: 暗号化の計算量が少なく、高速。
- デメリット: 鍵の安全な配布が難しい。

#### TLSハンドシェイク

1. （**ClientHello** / クライアントハロー）クライアントから、HTTPSでサーバーにアクセスする。
1. （**ServerHello** / サーバーハロー）サーバーから、クライアントに応答する。
1. （**Certificate** / 証明）サーバーは、認証局（CA）によって署名されたされた自身の「デジタル証明書」をクライアントに送信する。
証明書には、「公開鍵」が含まれる。
クライアントは、証明書の公開鍵を使用して、サーバーの身元を検証（認証）する。
1. （**Client Key Exchange** / 鍵交換）クライアントは、プリマスターシークレットを生成し、公開鍵で暗号化してサーバーに送信する。
プリマスターシークレットは乱数情報で、マスターシークレットおよび共通のセッションキー（「共通鍵」）を生成するために使用される。
1. （**Change Cipher Spec**）クライアントは、プリマスターシークレットを使用して、マスターシークレットを生成し、マスターシークレットから共通のセッションキー（共通鍵）を生成する。
クライアントは、サーバーへ暗号化通信の準備ができたことを知らせる。
1. （**Finished**）クライアントは、ハンドシェイクが正しく完了したことと、通信が改ざんされていないことを確認する。
1. （**Change Cipher Spec**）サーバーは、プリマスターシークレットを使用して、マスターシークレットを生成し、マスターシークレットから共通のセッションキー（共通鍵）を生成する。
サーバーは、クライアントへ暗号化通信の準備ができたことを知らせる。
1. （**Finished**）サーバーは、ハンドシェイクが正しく完了したことと、通信が改ざんされていないことを確認する。
1. 共通鍵暗号方式によって暗号化通信（TLS/SSLによるHTTPS通信）を行うことができる。

![SSL, TLS, HTTPS Explained 5-31 screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/40f6ca55-9251-017f-b2f2-7dbab6a073fc.png)

https://www.youtube.com/watch?v=j9QmMEWmcfo

https://www.cloudflare.com/ja-jp/learning/ssl/what-happens-in-a-tls-handshake/

## 4. トランスポート層

### 基本用語

#### ポート番号

ネットワークアプリケーションやサービスを識別するために使用される、数値の識別子。

IPアドレスがネットワーク上のデバイスを一意に識別するのに対して、ポート番号はそのデバイス内で実行されている特定のアプリケーションやサービスを識別する。
これにより、複数のアプリケーションが同時に通信を行うことが可能になる。

ポート番号は、0から65535までの範囲で割り当てられており、以下の3つのカテゴリに分類される。

- ウェルノウンポート（0-1023）
    - よく知られたサービスやプロトコルに割り当てられたポート番号。
        - 例: HTTP（80番）、HTTPS（443番）、FTP（21番）、SSH（22番）など。
- 登録済みポート（1024-49151）
    - 一般的なアプリケーションやサービスに割り当てられるポート番号。
    - IANA（Internet Assigned Numbers Authority）によって管理される。
- ダイナミックポート（49152-65535）またはプライベートポート
    - 通常、クライアントアプリケーションによって一時的に使用されるポート番号。
    - アプリケーションが通信を開始する際に、利用可能なポート番号が動的に割り当てられる。

#### ソケット

アプリケーションが **ネットワークにアクセスするためのインターフェイス**、エンドポイント。
アプリケーションがソケットを利用して通信相手の接続情報（IPアドレス、ポート番号、トランスポート層のプロトコル）を要求すると、OSによってTCP/IPによる通信が行われる。

以下の2種類に分けられる。

- **ストリームソケット（TCPソケット）**
    - **コネクション型**で**信頼性のある**通信を提供する。
    - データの**到達と順序が保証**され、**エラー検出**と**再送制御**が行われる。
- **データグラムソケット（UDPソケット）**
    - **コネクションレス型**で**信頼性の低い**通信を提供する。
    - データの損失や順序の入れ替わりが許容されるアプリケーションに適している。

ソケットAPIには以下のようなものがある。

- クライアント側のソケットAPI
    - socket(): ソケットを作成し、それに対応するファイルディスクリプタを返す
    - connect(): アドレスが示すサーバーにソケットを接続する
- サーバー側のソケットAPI
    - socket(): ソケットを作成し、それに対応するファイルディスクリプタを返す
    - bind(): 接続を待つアドレス（IPアドレスとポート番号）をソケットに割り当てる
    - listen(): ソケットが、サーバー用の、接続を待つためのソケットであることをカーネルに伝える
    - accept(): ソケットにクライアントが接続したら、ファイルディスクリプたを返す

https://xtech.nikkei.com/it/pc/article/NPC/20070130/260044/

https://www.tohoho-web.com/lng/199912/99120420.htm

#### 3ウェイハンドシェイク

クライアントとサーバーの双方が通信準備ができていることを確認し、TCPのコネクションを確立するためのプロセス。
以下のように3回のやり取りが行われる。

![スクリーンショット 2024-12-23 9.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/886104e4-2a20-60e5-d7b5-53d8ee6921ed.png)

1. TCPは、クライアントからサーバーへのデータ通信前に、TCPヘッダだけからなる コネクション確立要求のパケット（**SYN**パケット）を送信 して、サーバーからの確認応答を待つ。
1. サーバーからSYNに対する 確認応答（**ACK**パケット） と コネクション確立要求（**SYN**パケット）が送られてきた場合にはデータ通信が可能になる。
1. 最後に、クライアントはサーバーからのSYNに対して、**ACK** を返す。

電話に例えると、1. もしもし、2. はい聞こえています、3. OKですね、というやりとりをしている状態になる。

- **SYN（Synchronize Flag）**
    - **コネクションの確立要求**に使われる。シーケンス番号の初期化を行う。
    - シーケンス番号は通し番号で、データの順序を示す。
- **ACK（Acknowledgement Flag）**
    - **確認応答**番号のフィールドが有効であることを示す。
    - 確認応答番号は次に受信すべきデータのシーケンス番号になっている。
- **FIN（Finish Flag）**
    - **コネクションの切断要求**に使われる。
    - 通信を開始したいときはSYNを送信するが、通信を終了したいときはFINを送信する。

https://www.infraexpert.com/study/tcpip9.html

### TCP（Transmission Control Protocol）

インターネット上で信頼性の高いデータ転送を行うためのプロトコル。

3ウェイハンドシェイクにもみられる、以下のような特徴を持つ。

- **信頼性がある**
    - 確認応答（ACK）と **再送制御** を使用してデータの正確な送受信を保証する。
- **コネクション型**
    - クライアントとサーバー間でデータの送受信を行う前に、接続を確立する。
    両者間で通信のパラメータを交換し、信頼性を確保できる。
- **フロー制御**
    - 受信側のバッファが一杯にならないように、送信側のデータ送信速度を制御する。
    受信側がデータを適切に処理できることを確保する。
- **輻輳制御**
    - ネットワーク上の輻輳（送信要求がネットワークの処理能力を超えることによるパフォーマンス劣化）を検出し、送信速度を調整することで、ネットワークの効率を最適化し、安全性を維持する。
- シーケンス番号とポート番号
    - シーケンス番号を使用して送信されるデータを順序付けし、正確な順序で再構築することができる。
    - ポート番号を使用して、送信先と受信元のアプリケーションを識別する。

#### TCPの使用例

Web閲覧において機能するHTTPや、メールの配送に使われるSMTPが代表的な例。
ファイルのアップロード/ダウンロードに用いられるFTPもTCP上で動作する。

最近では、YouTubeなどの動画視聴サービスには一部でTCPが用いられている。
動画をリアルタイムで再生するのではなく、TCPでデータを少しずつダウンロードしながら再生することで動画の途切れをなくし、視聴者のストレスを解消することができる。

#### TCPの最適化

- 初期輻輳ウィンドウ（IW）の調整
    - 初期輻輳ウィンドウ（TCPコネクションの開始時に送信できるデータ量）の値を適切に設定することで、コネクション開始時の輻輳制御を改善し、データ転送のパフォーマンスを向上させる。
- ウィンドウスケーリング
    - 受信側が処理できるデータ量（ウィンドウサイズ）を増やすことで、ネットワーク帯域幅をより効率的に利用し、大容量データを高速に転送できるようにする。
- TCP Fast Open
    - コネクションの確立とデータの送信を同時に行うことで、レイテンシを削減する。3ウェイハンドシェークによる遅延が軽減される。
- セレクティブACK（SACK）
    - 受信側が欠落している（できるだけ少ない数の）パケットだけを通知することで、再送の効率を向上させる。

[TCP最適化によるユーザーエクスペリエンスの改善 - net one](https://www.netone.co.jp/knowledge-center/blog-column/knowledge_takumi_143/)

### UDP（User Datagram Protocol）

インターネット上でデータを軽量かつ高速に転送するために使用されるプロトコル。
接続の確立やデータの到達確認が不要なため、オーバーヘッドが低く、効率的なデータ転送が可能。

- **コネクションレス型**
    - データ送受信の前にクライアントとサーバー間で接続を確立する必要がなく、低遅延の通信が可能。
- **信頼性がない**
    - データの到達確認や再送制御を行わないため、データの欠損や順序の不整合が発生する可能性がある（ただし、アプリケーション層で信頼性を実現するような対応が考えられる）。
- **軽量性**
    - ヘッダーサイズが小さく、プロトコルのオーバーヘッドが低いため、データ転送にかかる負荷が軽減される。

#### UDPの使用例

リアルタイム通信（オンラインゲーム、VoIP）、ビデオストリーミング、DNS問い合わせなど、低遅延や高速転送が重要なアプリケーション。

## 3. ネットワーク層

### 基本用語

#### IPアドレス

* ネットワーク上のデバイスを一意に識別するための識別子。
* ホストやルーターのインターフェイス（NIC）に1つ以上設定される。

#### IPv4アドレス
* 0から255までの数字を、ピリオドで区切って、4つ並べて表記する
    * 10進数表記の例: 192.168.1.1
* **32ビット**の0と1で構成されている
    * 2進数表記の例: 11000000.10101000.00000001.00000001（= 192.168.1.1）
* **サブネットマスク** 
    * IPv4アドレスの後にスラッシュ（/）と数字をつけることで、
IPv4アドレスの「先頭から何ビットがネットワーク部で、残りの何ビットがホスト部なのか（= **IPアドレスの範囲**）」を表す。
  * 192.168.1.0/255.255.255. **0**
      * ネットワーク上のIPv4アドレスは、
192.168.1. **0** ~ 192.168.1. **255**
= 256個
  * 10.0.0.0/255. **0.0.0**
      * ネットワーク上のIPv4アドレスは、
          10. **0.0.0** ~ 10. **255.255.255**
= 16,777,216（2^24）個
  * 0.0.0.0/0
      * すべてのIPv4アドレス
= 4,294,967,296（2^32）個
* **CIDR（Classless Inter-Domain Routing）表記**
  * サブネットマスクをビット数で記述し、IPv4アドレスを表記する方法。
  * 192.168.1.0/ **24**
      * ネットワーク上のIPv4アドレスは、
192.168.1. **0** ~ 192.168.1. **255**
= 256個
  * 10.0.0.0/ **8**
      * ネットワーク上のIPv4アドレスは、
          10. **0.0.0** ~ 10. **255.255.255**
= 16,777,216（2^24）個
  * 0.0.0.0/0
      * すべてのIPv4アドレス
= 4,294,967,296（2^32）個
* **ネットワーク部**
  * IPv4アドレスのうち、先頭の固定された部分。ネットワークを特定する。
      * **192.168.1.** 0の場合、192.168.1はネットワーク部
      * **10.** 0.0.0の場合、10はネットワーク部
* **ホスト部**
  * IPv4アドレスのうち、ネットワーク部以外の可変の部分。ネットワーク内におけるコンピュータを特定する。
      * 192.168.1. **0**の場合、1から254までがホスト部として取りうる値
      * 10 . **0.0.0**の場合、0.0.1から255.255.254までがホスト部として取りうる値

##### 予約されたIPv4アドレス

* **ネットワークアドレス**
    * ホスト部が「**0**」のIPv4アドレス。
    * ネットワーク自体を指すアドレス。
    * 例: 172.16.0.0/16, 192.168.1.0/24
* **ブロードキャストアドレス**
    * ホスト部が「**255**」のIPv4アドレス。
    * ネットワーク上のすべてのホストにパケットを送信したいときに使用するアドレス。
    * 例: 172.16.255.255/16, 192.168.1.255/24

##### サブネットマスクの計算

Q1.
192.168.1.0/24 + 192.168.2.0/24
= 192.168.1.0~192.168.1.255 (256個) + 192.168.2.0~192.168.2.255 (256個)
= 192.168.1.0~192.168.2.255 (512個)
= 192.168.1.0/23

Q2.
172.16.4.0/24 + 172.16.5.0/24
= 172.16.4.0~172.16.4.255 (256個) + 172.16.5.0~172.16.5.255 (256個)
= 172.16.4.0~172.16.5.255 (512個)
= 172.16.4.0/23

Q3.
10.1.0.0/23 + 10.1.2.0/23
= 10.1.0.0~10.1.1.255 (512個) + 10.1.2.0~10.1.3.255 (512個)
= 10.1.0.0~10.1.3.255 (1024個)
= 10.1.0.0/22

サブネットマスク計算表
https://note.cman.jp/network/subnetmask.cgi

##### IPv6アドレス

IPv6の登場背景は、主にIPv4の技術的な制約に対処するためであり、インターネットの成長とデバイス数の急激な増加に適応することが求められた。

- IPv4アドレス
    - **32ビット** で、4組の10進数（例：192.168.0.1）で表現される。2の32乗 = 約43億個のIPアドレスが利用可能。
- IPv6アドレス
    - **128ビット** で、8組の16進数（例：2001:0db8:85a3:0000:0000:8a2e:0370:7334）で表現される。約3.4 x 10の38乗個のIPアドレスが利用可能。
    - IPsec（インターネット・プロトコル・セキュリティ）がデフォルトでサポートされており、暗号化や認証機能が強化されている。
    - マルチキャスト（1対多）とアニキャスト（1対最も近い1）の通信がサポートされており、効率的な通信が可能。

##### パブリックIPアドレス vs プライベートIPアドレス

* パブリックIPアドレス
  * インターネット上で使用されるユニークなIPアドレス。ISP（インターネットサービスプロバイダ）から割り当てられる。
  * 例: 8.8.8.8（GoogleのDNSサーバー）、1.1.1.1（CloudflareのDNSサーバー）
* プライベートIPアドレス
  * ネットワーク内部でのみ使用されるIPアドレス。インターネット上では使用できない。
  * 例: 192.168.0.0 から 192.168.255.255（クラスC）、10.0.0.0 から 10.255.255.255（クラスA）、172.16.0.0 から 172.31.255.255（クラスB）

https://envader.plus/article/51

https://www.nic.ad.jp/ja/newsletter/No26/090.html#:~:text=%E5%86%92%E9%A0%AD%E3%81%A7%E7%B4%B9%E4%BB%8B%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F,43%E5%84%84%E5%80%8B%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

#### ルーター

インターネット上でデータパケットを適切な宛先に転送するためのネットワークデバイス。

* **ルーティングテーブル**
    * ルーターが、パケットの最適な経路を選択し次のホップ（ネットワークの一区間）へ送るために使用する、経路制御表のこと
* **ホストとの違い**
    * IPアドレスが付けられている点では同じ
    * ルーティング（経路制御）を行う機器であるという点で異なる
* **ノード**
    * ホストとルーターを合わせた呼称

#### ゲートウェイ

* ネットワーク同士を中継する仕組み。
* ルーティングテーブルにおける、パケットの行き先。

#### DHCP（Dynamic Host Configuration Protocol）

**ホストにIPアドレスを自動で割り当てる**ためのプロトコル。
かつては、同じIPアドレスが複数のホストで重複して設定されないように、管理者が注意して設定する必要があった。

現在のほとんどのブロードバンドルータには、DHCPサーバの機能が最初から組み込まれており、これにより、家庭でも気軽にLAN環境が構築できるようになった。

##### ブロードバンド

ブロードバンド（broad band）という名前のとおり、それまで主流だった「ナローバンド（narrow band：狭い帯）」よりもデータの送受信における周波数の帯域幅が広いサービス。
光ファイバー回線（FTTH）、4G（LTE/LTE-Advanced）以降のデータ通信、無線LAN（Wi-Fi）などのこと。


**帯域**とは、データの転送速度のこと。**bps / bit per second** という単位で表す。


#### NAT（Network Address Translation）

NATとは、プライベートIPアドレスをパブリックIPアドレスに変換する技術のこと。

NATデバイスはLAN（ローカルエリアネットワーク）内のデバイスからインターネットへの接続要求があると、その要求をパブリックIPアドレスに変換してインターネット上に送信する。

ルーターはNATデバイスの一つ。

### IP(Internet Protocol)

IPは、パケットを目的のコンピュータまで届けるという、TCP/IPで最も重要な役割を持っている。

以下のような特徴を持つ。

- ルーティング
    - ルーターを使用してパケットを適切な宛先に転送する。
- コネクションレス型
    - パケットを送信する前に通信相手とコネクションを確立しないため、高速。
    - コネクションの確立が必要な場合は、上位層のTCPによって信頼性を提供する。
- 信頼性がない
    - データの到達確認や再送制御を行わないため、データの欠損や順序の不整合が発生する可能性がある（ただし、トランスポート層で信頼性を実現するような対応が考えられる）。

### ARP（Address Resolution Protocol）

IPv4アドレス（IPアドレス）を対応するMACアドレス（物理アドレス）に変換するために使用される、アドレス解決のプロトコル。

IPアドレスが決まれば、宛先IPアドレスに向けてIPデータグラムを送信することができるが、実際にデータリンクを利用して通信をするときにはIPアドレスに対応したMACアドレスが必要になる。

## 2. データリンク層

### 基本用語

#### Ethernet

LAN上でデバイス間のデータを通信するためのプロトコル。

通信媒体で直接接続された機器間で通信するための仕様。
ここでの通信媒体とは、ツイストペアケーブル、光ファイバー、電波、赤外線など。

#### フレーム

Ethernetでは、IPにおけるパケットに相当するデータの単位をフレームと呼ぶ。

#### MACアドレス（Media Access Control Address）

物理アドレス、ハードウェアアドレスとも呼ばれる。
同じ通信媒体に接続された機器を識別するためのアドレス。

48ビットの長さを持ち、6つの2桁の16進数（例: 00:1A:2B:3C:4D:5E）で構成される。
先頭の3 ~ 24ビットは、製造元（ベンダー）を示すベンダ識別子（OUI、Organizationally Unique Identifier）であり、残りの25 ~ 48ビットは、ベンダーの製品固有の値。
すなわち、NICの製造元ごとに特定の数字が割り当てられている。

EthernetやWi-Fiなどの通信に使用される。

#### NIC（Network Interface Card）

ネットワークアダプタ、ネットワークインターフェイスカード、ネットワークカード、LANカードとも呼ばれる。

最近のコンピュータであればはじめから無線LAN（Wi-Fi）のインタフェースを備えた機種が多いが、中にはUSBポートを介してネットワークを利用するように設計されている機種があったり、以前のパソコンでは有線LANが主流だった。

コンピュータや他のデバイスがネットワークに接続するための専用のインタフェースをNICと呼んでいる。
デバイスとネットワーク間のデータの送受信を行う。

コンピュータにはLANケーブル（インターネットをするための線）を挿す穴が付いているが、パソコンの蓋を開けて見た時に、その穴がくっついている部品のこと。

NICには、デバイスがネットワーク上で一意の識別子を持つための **MACアドレス** が割り当てられている。

https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%AB%E3%83%BC%E3%83%89

https://e-words.jp/w/NIC.html

https://wa3.i-3-i.info/word12498.html

#### 無線LAN

無線通信では、電波や赤外線、レーザー光線などを利用する。無線通信の中で、オフィス内のようなLANの範囲を比較的高速で接続するものを無線LANと呼ぶ。

無線通信ではコンピュータ機器などをネットワークに接続するケーブルが不要になる。
当初は移動して使うことが多い軽量の機器に用いられていたが、省スペースで配線コストを削減できるメリットから、オフィスや家庭、店舗、駅、空港などでも使われるようになった。
例: Bluetooth、Wi-Fi、WiMAX、LTE、4G、5G

無線LANは、盗聴や改ざんといった危険に常にさらされている。
データの暗号化に加えて、認証された機器だけがその無線LANを利用できるようなアクセス制御を併用し、できる限り安全な環境で利用する必要がある。

#### ブリッジ

ブリッジは、データリンク層でネットワーク同士を接続し、データを転送するデバイス。
ポート数が限られており、高度な機能は提供しないことが一般的。

宛先MACアドレスが同じネットワークセグメントにある場合、ブリッジはそのデータフレームをフィルタリングし、転送しないことで、ネットワークのトラフィックを制御し、パフォーマンスを向上させる。

小規模なネットワークや2つの異なるセグメント（ネットワーク）を接続する必要がある場合に適している。

以下の例では、goldengateブリッジが、sanfranciscoネットワーク、sausalitoネットワーク、ハブを接続している。

![SimpleBridgedNetworkDiagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54467/8fed005c-a1e9-4efa-5251-5bac53ed9fd3.png)

https://docs.oracle.com/cd/E26924_01/html/E25834/rbridgesoverview.html

#### スイッチ（スイッチングハブ）

スイッチは、ブリッジの機能を持ち、ハブのような多くのポートを提供するデバイス。

**レイヤ2スイッチ（L2スイッチ）** と呼ばれることもある。

ハブやブリッジと比べて、より高速で効率的に動作し、高度な機能を提供することができる。
例えば、VLAN（仮想LAN）がサポートされていたり、QoS（Quality of Service）の設定を行うことができる。
また、リモート管理が可能なため、SNMP（Simple Network Management Protocol）を使用してネットワーク管理者が監視や設定を行える。

大規模なネットワークや高度な機能が求められる環境に適している。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0%E3%83%8F%E3%83%96

https://www.allied-telesis.co.jp/library/nw_guide/device/switch.html

## 1. 物理層

### 基本用語

#### ハブ（リピータハブ）

ネットワーク上の複数のデバイスを接続するためのシンプルなネットワーク機器。

接続されたすべてのデバイスに対して受信した信号を送信する。

ハブは、スイッチやブリッジと比べて機能がシンプルであり、現代のネットワーク環境ではあまり使われなくなっている。
代わりに、スイッチがハブに代わってよく使われており、データ転送の効率とネットワークパフォーマンスが向上する。

https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%96_(%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A9%9F%E5%99%A8)


# 参考

[マスタリングTCP/IP　入門編（第6版）](https://www.ohmsha.co.jp/book/9784274224478/)
[Amazon Web Services 基礎からのネットワーク＆サーバー構築　改訂版](https://bookplus.nikkei.com/atcl/catalog/17/261530/)
[絵で見てわかるITインフラの仕組み 新装版](https://www.shoeisha.co.jp/book/detail/9784798158464)