インフラ/ネットワークの知識4(トランスポート層)

# はじめに
トランスポート層の技術についてまとめます.

TCP,UDPといったものが出てきますが,これらの単語の理解を深めていきたいです.

# トランスポート層について
トランスポート層は,アプリケーションデータを効率的に伝送する仕組みを提供しており,アプリケーションデータの通信制御と識別を行う階層です.

ネットワーク層は,異なるネットワークに存在するノードとの接続性を確保するためにある階層だったので,確保した接続性の上で,データがどのアプリケーションのデータなのかの識別を行う必要があります.

そして,識別するために**トランスポートヘッダ**という制御情報を付加します.

トランスポート層で使用するプロトコルは**UDP, TCP**の2種類があります.

UDPのトランスポートヘッダのことをUDPヘッダと呼び,ヘッダ処理によってできるデータを**UDPデータグラム**といいます.
TCPのトランスポートヘッダのことをTCPヘッダと呼び,ヘッダ処理によってできるデータを**TCPセグメント**といいます.

トランスポート層は,送信するときはセッション層から受け取ったデータにUDP/TCPヘッダを付加し,受信するときは,送信とは逆の処理を施すことになります.

# UDPについて
UDPは音声通話や時刻同期,DHCPなど即効性を求めるアプリケーションで使用します.

送ったら送り続けるので,信頼性はないです.

また,UDPヘッダは以下のように構成されていて,8バイトしかないシンプルなつくりをしています.

#### UDPヘッダ
![スクリーンショット 2024-12-28 214219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/64f1fd8c-dc82-60be-3dc8-5f81701b1dca.png)

# TCPについて
TCPはメールやファイル転送,Webブラウザなど信頼性を求めるアプリケーションで使用します.

データを送る前に仮想的な通信路(**TCPコネクション**)を作り,その中でデータをやり取りします.

TCPではデータを双方向に確認しながら送りあうので,信頼性が高まります.

また,TCPヘッダは以下のように構成されていて,20バイトもある複雑なつくりをしています.

#### TCPヘッダ
![スクリーンショット 2024-12-28 214710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/a6c60f9f-88eb-026d-5cd7-5c0837fe323b.png)

# ポート番号
トランスポート層では,データがどのアプリケーションのものなのか,**アプリケーションの識別**をする必要があります.

識別するためのものを**ポート番号**と呼び,ポート番号はアプリケーションと紐づいているので,あて先ポート番号を見ればどのアプリケーションのデータ七日がわかります.

ポート番号は0 ~ 65535までの数字です.

割り当て範囲と使用用途によって以下の3種類に分類されます.
- System Ports
- User Ports
- Dynamic and/or Private Ports

### System Ports
System Portsは0 ~ 1023のポート番号で,'Well-known Ports'と呼ばれます.

世界的な組織によって管理されており,一般的なサーバアプリケーションに一意に紐づいています.

例えばUDPの123番は, ntpdやxnpgdなど時刻同期で使用するNTPのサーバアプリケーションに紐づいています.

### User Ports
User Portsは1024 ~ 49151のポート番号で,世界的な組織によって管理されており,メーカーが開発した独自のサーバアプリケーションに紐づいています.

例えば,TCP/3306だったらMySQLのデータベース接続で使用します.

### Dynamic and/or Private Ports
Dynamic and/or Private Portsは49152 ~ 65535のポート番号で,クライアントがセグメントを作るとき送信元ポート番号としてランダムに割り当てられます.

# TCPの処理
TCPの処理を'接続開始時', '接続時', '接続終了時'に分けて考えます.

## 接続開始時
TCPコネクションは**3ウェイハンドシェイク**でコネクションをオープンするところから始まります.

3ウェイハンドシェイクとは,TCPコネクションを確立する前の処理手順のことです.

TCPコネクションのオープンにおいて以下の3点が重要です.
- フラグ
- シーケンス番号
- オプションヘッダ

### フラグ
3ウェイハンドシェイクのフラグは'SYN', 'SYN/ACK', 'ACK'という順番です.

このやり取りをした後ESTABLISH状態となり,TCPコネクションができます.

この時点で,実際のデータはやりとりしません.

### シーケンス番号
シーケンス番号は,データの順序を表す番号のことです.

各ノードはこの番号を見て,データを効率よく並べます.

### オプションヘッダ
オプションヘッダは,TCPに関連する各種拡張機能を通知しあうために使用されます.

## 接続時
接続時では,データの信頼性と速度を両立させるために転送制御を行います.

中核を担っているのは以下の3点となります.

- 確認応答
- 再送制御
- フロー制御

### 確認応答
TCPはシーケンス番号とACK番号が協調的に動作することで信頼性を保ち,この協調的な動作の機能を**確認応答**と呼びます.

### 再送制御
失われたデータをもう一度送りなおしたり,送ってもらうようにお願いしたりする機能を**再送制御**と呼びます.

TCPはシーケンス番号とACK番号によってパケットロスを検知し,パケットの再送を行います.

再送制御が発動するタイミングは,受信ノードがきっかけのFast Retransmitと,送信ノードがきっかけのRTOの2つあります.

### フロー制御
フロー制御はコネクション上にたくさんのセグメントを送り出すための機能で,転送効率を上げることができます.

フロー制御は,複数のセグメントをまとめて受け取り,一つのACKで応答することで転送電率を高めています.

フロー制御において**ウィンドウサイズ**が重要な役割を果たしています.

## 接続終了時
TCPコネクションは4ウェイハンドシェイクで終わります.

4ウェイハンドシェイクは,TCPコネクションを終了するための処理手順のことです.

クライアントとサーバは,4ウェイハンドシェイクの中でFINパケットを交換し合い,クローズと呼ばれる後始末を行います.

TCPコネクションのクローズにおいて以下の2点が重要です.

- FINフラグ
- TIME-WAIT

### FINフラグ
FINフラグはもう送るデーがないことを表すフラグで,上位アプリケーションのクローズ要求によって付与されます.

やり取りの順序は'FIN/ACK', 'ACK', 'FIN/ACK', 'ACK'となります.

### TIME-WAIT
コネクションを閉じるときは,両方のノードですぐに閉じるわけではなく,アクティブクローズのノードだけがTIME-WAIT時間分待ってから閉じます.

これは,届くかもしれないパケットを待つ保険のようなものです.

# ファイアウォール
ファイアウォールは,IPアドレスやプロトコル,ポート番号などを使用して通信を制御する機器です.

ファイアウォールの持つ通信制御機能のことを**ステートフルインスペクション**と呼び,これは通信の許可/拒否を定義する**フィルタリングルール**と,通信を管理する**コネクションテーブル**を用いて通信を制御します.

### フィルタリングルール
フィルタリングルールは,どんな通信を許可し,どんな通信を拒否するかを定義している設定です.

フィルタリングルールは送信元IPアドレス,あて先IPアドレス,プロトコル,送信元ポート番号,あて先ポート番号,通信制御などの設定項目で構成されます.

### コネクションテーブル
コネクションテーブルは,送信元IPアドレス,あて先IPアドレス,プロトコル,送信元ポート番号,あて先ポート番号,コネクションの状態,アイドルタイムアウトなど,いろいろな要素から構成される複数のコネクションエントリから構成されたものです.

ファイアウォールは,自信を経由するコネクションの情報をコネクションテーブルで管理します.

## コネクションテーブル使用例(UDP)
UDPにおけるステートフルインスペクションの動きは以下となります.

#### 1.フィルタリングルールと照合
ファイアウォールはクライアント側にあるOutsideインタフェースでUDPデータグラムを受け取り,フィルタリングルールと照合します.
![スクリーンショット 2024-12-29 160516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/026d49f9-adcc-38bb-7942-d3831b804538.png)

#### 2. アクションが許可のエントリにヒットした場合
この場合,コネクションテーブルにコネクションエントリを追加し,そのコネクションエントリに対する戻り通信を許可するフィルタリングルールを動的に追加します.
![スクリーンショット 2024-12-29 162448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/41d0e875-bce9-0bfe-ec53-a3af69df395f.png)

#### 3. アクションが拒否のエントリにヒットした場合
この場合,コネクションテーブルにコネクションエントリを追加せず,クライアントに対してDestination UnreachableのICMPパケットを追加します.
![スクリーンショット 2024-12-29 162809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/dea8195e-6c94-8dc3-789e-0d1a49209fe3.png)

#### 4. アクションがドロップのエントリにヒットした場合
この場合,コネクションエントリを追加せず,何もしません.
![スクリーンショット 2024-12-29 162847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/02a9d03a-81d2-f0be-fa47-69fcaf464a01.png)

#### 5. サーバからの戻り通信の発生
アクションが許可のエントリにヒットした場合,サーバからの戻り通信が発生します.
![スクリーンショット 2024-12-29 163156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/173486ec-217f-4f78-3778-651a4c99a1b7.png)

#### 6.アイドルタイムアウトが経過したら,エントリを削除
ファイアウォールは通信が終了したら,コネクションエントリのアイドルタイムをカウントアップします.

アイドルタイムアウトが経過すると,コネクションエントリとそれに関連するフィルタリングエントリを削除します.

![スクリーンショット 2024-12-29 163430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/7e23fd6e-6162-29da-e9cf-92bc95dcf23c.png)


## コネクションテーブル使用例(TCP)
TCPにおけるステートフルインスペクションの動きは以下となります.

#### 1.フィルタリングと照合
ファイアウォールはクライアント側にあるOutsideインタフェースでSYNパケットを受け取り,フィルタリングルールと照合します.
![スクリーンショット 2024-12-29 164144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/b447417c-6a59-2659-c053-8f05a40ac854.png)

#### 2.アクションが許可のエントリにヒットした場合
この場合,コネクションテーブルにコネクションエントリを追加し,そのコネクションエントリに対応する戻り通信を許可するフィルタリングルールを動的に追加します.
![スクリーンショット 2024-12-29 164814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/498f1c15-03d1-2eef-f8c1-6b6cf29c226e.png)


#### 3. アクションが拒否のエントリにヒットした場合
この場合,コネクションテーブルにコネクションエントリを追加せず,クライアントに対してRSPパケットを返します.
![スクリーンショット 2024-12-29 165554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/58ce2f10-0e01-126f-5c43-c0de506bcd45.png)

#### 4. アクションがドロップのエントリにヒットした場合
この場合,コネクションテーブルにコネクションエントリを追加せず,何もしません.
![スクリーンショット 2024-12-29 165645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/eae7c4a9-427b-7770-2bf1-2baaa03f2ad3.png)

#### 5.サーバからの戻り通信の発生
アクションが許可のエントリにヒットした場合,サーバからのSYN/ACKパケットが戻ってきます.
![スクリーンショット 2024-12-29 165906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/b3d71326-da3f-cc9a-d8e3-8c9efdf102e3.png)

#### 6.クロース処理が実行されたら,エントリを削除
アプリケーションデータを送り終えたら,4ウェイハンドシェイクによるクローズ処理が実行されます.
![スクリーンショット 2024-12-29 170057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/76e2d06f-87b6-4432-4b4e-bdac89db0123.png)

# 最後に
トランスポート層でのTCPやUDPの働き,ファイアウォールがどのように動くのかをまとめました.

このトランスポート層までの理解をしておけば,ひとまずネットワークのことについては問題ないと思います.

今後,ふとしたときに今まで書いてきた記事を見直し,ネットワークへの理解を頭に残らせたいと思います.

# 参考
[インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93-%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%81%BF%E3%82%84%E3%81%9F%E3%81%B2%E3%82%8D%E3%81%97/dp/4797396806)