TCP/IPもでるおよびデータ送信まプロセスまとめ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897906/f56f5edf-5ea4-ea16-c989-668c2b207e05.png)

## TCP/IPモデル

TCP/IPとは、トランスポート層で使用されるプロトコルであるTCP（Transmission Control Protocol）と、ネットワーク層で使用されるプロトコルであるIP（Internet Protocol）をまとめて呼ぶ名称です。これはデータがネットワーク上で安定的に伝達されることを目指しています。

TCP/IPモデルは、このTCP/IPを中心にOSI 7層に対応して4層、あるいは5層として捉えるのが一般的です。4層と5層の違いは、ネットワークアクセス層を物理層とデータリンク層に分けるかどうかの違いですが、ここでは5層として分類して説明します。


### 1. 物理層

物理層はネットワーク機器のデジタルデータを送信に適した形に変換し、安定的で信頼性のあるデータ伝達を可能にする役割を担います。ハードウェア的な内容が多いため詳細には扱いませんが、データリンク層から受け取ったビットストリーム（0と1からなるデジタルデータ）を送信媒体に適した形にマッピングして送信します。

送信過程でデータ信号が弱くなったり、データにノイズが発生したり、歪んだりする問題が発生することがありますが、これをリピーターという装置が信号を増幅・再生し、より遠くまでデータが安定的に伝達されるように助けます。その後、受信側の物理層では信号を再びビットストリームに変換し、データリンク層に送ります。

ここから、送信単位としてフレーム、パケット、セグメントが出てきますが、読む際に注意すべき点は、ヘッダーなどの制御情報を除けば、三つが移動するデータのサイズは同じであるということです。（例えば、パケットを組み立ててセグメントになるわけではありません。）各層でそのデータに対して必要な制御情報が異なるため、これを区別するために使用します。

あらかじめ整理すると

- **セグメント** → トランスポート層でアプリケーション層から受け取ったデータを分割し、そこにTCPヘッダーを追加したもの
- **パケット** → トランスポート層で送信されたセグメントにIPヘッダーを付加したもの
- **フレーム** → ネットワーク層で送信されたパケットに前にイーサネットフレームヘッダーと後ろにトレーラーを付加したもの

となります。

すると大体、

（イーサネットフレームヘッダー - IPヘッダー - TCPヘッダー - データ - トレーラー）

の形になります。

このようにデータを送信する側で各層に必要なヘッダーなどの制御情報を付加する過程を**カプセル化（encapsulation）**と言います。

逆に、受信側の各層では自分に必要な情報を得るためにこの制御情報を一つ一つ取り除く過程を**デカプセル化（decapsulation）**と言います。

### 2. データリンク層

同じLANにある二つのノード間の通信を担当し、送信単位として「フレーム」を使用します。

データリンク層ではMACアドレスという識別子を通じて隣接する機器間でフレームが移動します。これはネットワークカードに割り当てられた固有のアドレスです。

この層の役割をいくつか見てみると

#### 1) フレームの生成と分離
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897906/32945d23-1c51-f443-d5f3-6ad056ac36b0.png)


データを送信する際、ネットワーク層からパケットを受け取り、送信元のMACアドレスや宛先のMACアドレスなどの付加情報であるヘッダーを前に、トレーラーをビットの後ろに付けてフレームを作ります。これを**フレーミング**と言います。これらのフレームを再びまとめて物理層に送ります。

そして、相手側でデータを受信する際、物理層から0と1で構成されたビットストリームをデータリンク層に渡します。ここで送信側が付加したヘッダーとトレーラーを基にビットストリームをフレームに分離します。

#### データリンク層でのスイッチングとルーティングの過程

#### 2) 隣接する機器間のデータ移動

データリンク層ではMACアドレスを利用して**スイッチング（Switching）**というプロセスを通じて隣接する機器間のデータ送信を担当します。ここでスイッチングとは簡単に言えば、ポートを通じて隣接する機器間にデータが移動する過程です。

後ほど説明しますが、ネットワーク上で最適な経路を決定するのはネットワーク層で行います。これを**ルーティング（Routing）**と言います。ルーティングを通じてネットワーク層では次に進むべき目的地のIPを見つけ出します。

しかし、データリンク層ではMACアドレスを基にデータを送信するため、IPアドレスを知っていてもMACアドレスを知らなければデータを送信できません。したがって、同じネットワークセグメントに属する機器のIPアドレスとMACアドレスをマッピングした**ARPテーブル（ARP Table）**を持っています。

現在の機器で次に進むべき目的地機器のIPアドレスとMACアドレスがARPテーブルにあれば、そのMACアドレスを持つ場所に進みますが、現在ARPテーブルにMACアドレスがない場合は、同じネットワークに属するすべてのルーターにIPアドレスを送ります。これをすぐに**ARPリクエスト**と言います。

ここで、受信した機器のIPアドレスがARPリクエストのIPアドレスと同じであれば、この機器は応答としてMACアドレスを送ります。このMACアドレスはARPテーブルに保存され、また新しいフレーミング過程でヘッダーの宛先MACアドレスとして使用されます。

この一連の過程を経て、ついにスイッチングが行われます。ただし、このスイッチングを行う装置は様々あり、ルーター、L2スイッチ、ハブなどがすべてスイッチングを行うことができます。ここでは**L2スイッチ**を基準に説明します。L2スイッチは複数のネットワーク機器とポートという形で接続され（ポート、接続された機器のMACアドレス）、**MACテーブル**を持っています。このMACテーブルは受信したデータフレームをMACアドレスとマッピングされている機器に伝達する役割を担います。これもARPリクエストと似たように**フラッディング（Flooding）**という過程を通じてポートに接続されたすべての機器のMACアドレスを更新することもあります。

ここで注意すべき点は、新しいネットワーク機器に到着するたびに送信されたデータフレームに保存された宛先MACアドレスと送信元MACアドレスが常に異なるということです。筆者は二つのノード間の通信が行われる際に二つのノードのMACアドレスを常に持っていると思っていましたが、そうではありませんでした。

### 3. ネットワーク層

ネットワーク層は異なるネットワークセグメントに属するノード間の通信を担当し、送信単位はパケットです。ここでネットワークセグメントとは、同じブロードキャストドメイン（ブロードキャストリクエストが届く範囲）に属する機器の集まりを指します。

ネットワーク層では、送信時にトランスポート層から下りてきたセグメントに送信元IP、宛先IPなどの制御情報が含まれた**IPヘッダー**を付加してデータリンク層にパケットを伝達し、逆にデータを受信する場合にはデータリンク層からフレームを受け取って確認し、トランスポート層に送信します。

ネットワーク層は様々な役割を担います。その中からいくつかを取り上げて見てみましょう。

#### 1) ルーティング

これはパケットが目的地までの最適な経路で到達するようにする過程を意味します。この過程でルーターや**L3スイッチ（ルーターとL2スイッチの役割を同時に果たす）**という機器を経由します。この過程では機器に保存された**ルーティングテーブル**を利用して、パケットのヘッダーに含まれた目的地のアドレスを確認し、どのホップ（中継地点）に進むべきかを判断します。この一連の最適経路を見つける過程を**ルーティングアルゴリズム**とも呼び、代表的なものにリンクステート（ダイクストラベース）やディスタンスベクター（ベルマンフォードベース）などがあります。ただし、ルーティングはルーター以外にもL3スイッチが担当することもあります。

#### 2) 混雑制御

オンラインゲームをしていると、ネットワーク状態が混雑しているという文言をよく見るでしょう。これはパケットがネットワーク上に溢れていることを意味しますが、なぜこれが問題になるのでしょうか。いくつかの理由があります。

まず第一に、ルーターで単位時間あたりに処理できるパケットは限られているため、パケットの送信が遅れます。

第二に、ルーターに多くのパケットが到着すると、後で処理するパケットを蓄える**バッファ**が必要となり、このバッファの容量が超過すると、後から入ってくるパケットは失われ再送信が必要になります。

この二つは高い**レイテンシー**を意味し、これはユーザー体験の観点から良くありません。したがって、ネットワークレイヤーではこの問題を解決するために混雑制御の役割を担います。

具体的には、パケットの伝達速度を一定にする、または特定のノードの混雑を検知して他の経路などにパケットを送ることで特定の機器にパケットが集中するのを防ぐなどの役割を果たします。

#### 3) パケットの分割と再組み立て

**MTU（Maximum Transmission Unit、最大送信単位）**とは各ルーターで一度に受け取ることができるデータ（パケット）の最大サイズを指します。場合によってはパケットがMTUを超えることがあるため、これを**フラグメント（Fragment）**という単位で分割し、パケットが到着した際に受信側で再組み立てします。

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

トランスポート層は送信元ノードと宛先ノード間で正常なデータ送受信が行われるようにする役割を担います。

これをネットワーク層と関連づけて言えば、ネットワーク層がデータが目的地まで到達するための経路探索を行う役割を担うのに対し、トランスポート層は、

アプリケーションから送信されたデータストリームを**セグメント**という単位に分割し、制御情報が含まれたヘッダーを付加してネットワーク層に伝達します。
受信側ではこの分割されたセグメントを再組み立てし、目的地ポートにあるアプリケーションに伝達する役割を担います。さらに詳しく扱うと

#### 1) データ送信時の順序保証

TCPではデータストリームをセグメントに分割した後、データを元の順序通りに送信します。この際、パケットが途中で失われても再組み立ての問題が発生しないように、ヘッダーに**シーケンス番号（Sequence Number）**と**Ack番号（Acknowledgement Number）**を使用します。

例えば、初期シーケンス番号が1でデータのサイズが100であれば、シーケンス番号は100となり、Ack番号は101になります。つまり、シーケンス番号はそのデータがデータストリームのどのバイトから始まるデータかに関する情報であり、Ack番号はこのセグメントのデータに続くべきセグメントのシーケンス番号を意味します。これを通じてセグメントを再びデータストリームに組み立て、アプリケーションに送信します。

#### 2) 接続の維持

TCPでは**3-wayハンドシェイク**を通じて送信者と受信者間の接続を確認し、データ送信を開始します。また、データ送信が終了すると**4-wayハンドシェイク**を通じて両者間の接続を解放します。

#### 3) 混雑制御

ネットワーク層でどれだけ混雑制御を行っても、トランスポート層でデータを無制限に送信し続けると意味がありません。したがって、トランスポート層ではデータを送った後に戻ってくる応答時間などを確認し、送信するデータ量を決定します。

#### 4) フロー制御

ネットワークの混雑度とは別に、受信側でも受け取ったデータを処理する時間が必要となり、ルーターと同様に後で処理するデータを蓄える**バッファ**などが存在します。

この時、送信側が現在相手側のトランスポート層が対応できるバッファのサイズを超えるデータを送信すると、必然的にデータの損失が発生します。したがって、受信側は現在受け取れるデータ量を相手に通知し、送信側が送信データ量を制御します。

### 5. アプリケーション層

アプリケーション層は実際に機器内で実行されているプロセスに関する層を指します。

データを送信または受信する際、アプリケーションは機器内OSに組み込まれた**プロトコルスタック**を利用します。このプロトコルスタックがネットワーク層とトランスポート層の役割を担います。アプリケーションはデータを送信したい時、プロトコルスタックに依頼して**ソケット**を作成します。簡単に言えば、通信に必要な情報を記録しておくものと考えてください。これを通じて他のホストと通信を行います。

アプリケーション層ではトランスポート層にデータを送信することもあり、受信時にはトランスポート層に保存されているセグメントを読み取ります。読み取る速度の向上は**応答速度の向上**につながります。なぜなら、根本的にTCP/IPではデータ送信の安定性のためにフロー制御を行っているため、現在受信側が受け入れることができる**ウィンドウサイズ**が増える（つまり、受信側がデータをどれだけ早く処理できるか）が、送信側の送信速度を高めることにつながるからです。まとめるとドミノのように、

アプリケーションのデータ処理速度の向上 → トランスポート層のウィンドウサイズが早く増える → ウィンドウサイズが満杯で待機時間が減る → データを迅速に送信できると言えるでしょう。

## データ送信過程

TCP/IPモデルについて整理しましたので、これを基にデータが送信される過程を整理してみましょう。

### 1) アプリケーション層

例えば、ウェブブラウザがユーザーが入力したURLを使ってDNSサーバーにリクエストし、そのURLのIPアドレスを取得します。そしてアプリケーションはプロトコルスタックにソケットを作成するように依頼し、ソケットを通じてデータを送信します。ここで一連の過程を通じて受信側のIPアドレス：ポート番号がソケットに保存され、二つのホスト間の接続が確立されます。

### 2) データに制御情報を付加

- **トランスポート層**: TCPヘッダー（ポート番号） + データ → セグメント
- **ネットワーク層**: IPヘッダー（IPアドレス） + セグメント → パケット
- **データリンク層**: MACヘッダー（MACアドレス） + セグメント + トレーラー → フレーム

などの過程を通じて**カプセル化（encapsulation）**を行います。

### 3) 送信

フレームはデータリンク層で組み立てられ、**LANドライバー**を通じて**LANアダプター**に伝達され、LANアダプターがデータを送信します。

### 4) LAN内での移動

現在のデータの目的地のMACアドレスが同じネットワークセグメントに属しているかを確認し、属していない場合は**ゲートウェイルーター**にデータを送ります。

### 5) WANでの移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897906/e06dbc65-06b1-1629-6047-1ec447f0a1c1.png)

ルーティングを通じて次に進むべき機器を継続的に探します。ルーターや**L3スイッチ**はネットワーク層の他に物理層、データリンク層の処理も担当します。まず物理層を通じてデータがデータリンク層に渡ると、データリンク層は宛先のMACアドレスが自分のアドレスと一致するか確認しながらデータをフィルタリングします。ネットワーク層では**IPヘッダー**が付加された宛先IPアドレスを基に次に進むべき機器を見つけ出し、再びデータリンク層にデータを渡します。データリンク層では再び現在の自分のMACアドレスと次の目的地のMACアドレスが含まれたMACヘッダーを付加し、フレームを作成してポートを通じて隣接する機器に送信し続けます。

### 6) 目的地機器のネットワークセグメントに到着

目的地機器のネットワークセグメントにおいて**ARPテーブル**を通じてネットワークセグメント内にある目的地機器のMACアドレスを確認し、送信します。到着すると、再び**デカプセル化（decapsulation）**の過程を通じて各層で送信側が送った制御情報を確認し、トランスポート層に達してアプリケーションに到着します。

## 参考資料

- [理解すると人生が変わるTCP送受信原理 - YouTube](https://www.youtube.com/...)
- [10分テコトック] 🔮 ヒヒのOSI 7 Layer - YouTube
- [ネットワークを学ぼうとしている人のために - YouTube](https://www.youtube.com/...)
- [ARPを簡単に理解する](https://...)
- [Data Link Layer - GeeksforGeeks](https://www.geeksforgeeks.org/data-link-layer/)
- [What is the maximum transmission unit (MTU)?](https://...)
- [What is Transmission Control Protocol (TCP)? - GeeksforGeeks](https://www.geeksforgeeks.org/what-is-tcp/)
- [MACアドレスとその機能 - Homenet Howto](https://...)
- [Routing vs. Forwarding vs. Switching | Baeldung on Computer Science](https://www.baeldung.com/...)
- [ChatGPT](https://...)
- [成功と失敗を決める1%のネットワーク原理](https://...)

---

※注：画像リンクや特定のURLはそのまま保持しています。