TCP/IPモデル TCP/IPとは、送信層で使用されるプロトコルであるTCP(Transmission Control Protocol)と、ネットワーク層で使用されるプロトコルであるIP(Internet Protocol)をまとめて呼ぶ名称です。これは、データがネットワーク上で安定して伝達されることを目指しています。
TCP/IPモデルは、このTCP/IPを中心にOSIの7階層に対応して4階層、または5階層として捉えるのが一般的です。4階層と5階層の違いは、ネットワークアクセス層を物理層とデータリンク層に分けるかどうかですが、ここでは5階層で分類して説明します。
- 物理層
物理層は、ネットワーク機器のデジタルデータを送信に適した形に変換し、安定かつ信頼性のあるデータ伝達を可能にする役割を担います。ハードウェアに関する内容が多いため詳細には扱いませんが、データリンク層から受け取ったビットストリーム(0と1で構成されたデジタルデータ)を送信媒体に適した形にマッピングして送信します。
送信過程でデータ信号が弱くなったり、データにノイズが入ったり、歪んだりする問題が発生することがありますが、これをリピータという装置が信号を増幅・再生し、より遠くまでデータを安定して伝達できるように助けます。その後、受信側の物理層では信号を再びビットストリームに変換し、データリンク層に送ります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここからフレーム、パケット、セグメントという送信単位が登場しますが、注意すべき点は、ヘッダーなどの制御情報を除けば、これら3つが運ぶデータのサイズは同じであるということです。(例えばパケットを組み立ててセグメントになるわけではありません。)各階層でそのデータに対して必要な制御情報が異なるため、これを区別するために使用されます。
事前に整理すると、
- セグメント → 送信層でアプリケーション層から受け取ったデータを分割し、TCPヘッダーを追加したもの
- パケット → 送信層で送ったセグメントにIPヘッダーを付加したもの
- フレーム → ネットワーク層で送ったパケットにイーサネットフレームヘッダーとトレーラーを付加したもの
となります。
おおまかに言うと、
(ethernet frame header-IP header-TCP header-payload-trailer)
の形になります。
このように、データを送信する側で各階層に必要なヘッダーなどの制御情報を付加する過程をエンキャプセレーション(カプセル化)と呼びます。
逆に受信側の各階層では、自分に必要な情報を得るためにこの制御情報を一つずつ取り除く過程をデエンキャプセレーション(カプセル解除)と呼びます。
- データリンク層
同じLAN内にある2つのノード間の通信を担当し、送信単位として「フレーム」を使用します。
データリンク層では、MACアドレスという識別子を通じて隣接する機器間でフレームが移動します。これはネットワークカードに割り当てられた固有のアドレスです。
この層の役割をいくつか見てみましょう。
1) フレームの生成と分離
データを送信する際、ネットワーク層からパケットを受け取り、送信元のMACアドレスや送信先のMACアドレスなどの付加情報であるヘッダーを前に、トレーラーを後ろに付けてフレームを作成します。これをフレーミングと呼びます。これらのフレームを再びまとめて物理層に送ります。
そして、相手側でデータを受信する際には、物理層から0と1で構成されたビットストリームをデータリンク層に渡し、ここで送信側が付けたヘッダーとトレーラーを基にビットストリームをフレームに分離します。
2) 隣接する機器間でのデータの移動
データリンク層では、MACアドレスを利用してスイッチング(Switching)という方法で隣接する機器間のデータ送信を担当します。スイッチングとは、簡単に言えばポートを通じて隣接する機器間にデータが移動する過程です。
後ほど述べますが、ネットワーク上で最適な経路を決定するのはネットワーク層で行われます。これをルーティングと呼び、ネットワーク層ではルーティングを通じて次に進むべき目的地のIPを特定します。
しかし、データリンク層ではMACアドレスに基づいてデータを送信するため、IPアドレスを知っていてもMACアドレスを知らなければデータを送信できません。したがって、同じネットワークセグメントに属する機器のIPアドレスとMACアドレスを対応付けたARPテーブルを持っています。
現在の機器で次に進むべき目的地の機器に対するIPアドレスとMACアドレスがARPテーブルにあれば、そのMACアドレスを持つ場所に進みますが、ARPテーブルにMACアドレスがない場合は、同じネットワークに属するすべてのルーターにIPアドレスを送信します。これをARPリクエストと呼びます。
ここで、受信した機器のIPアドレスがARPリクエストのIPアドレスと一致すれば、この機器は応答としてMACアドレスを送信します。このMACアドレスはARPテーブルに保存され、新しいフレーミング過程でヘッダーの送信先MACアドレスとして使用されます。
この一連の過程を経て、ついにスイッチングが行われます。ただし、スイッチングを行う機器は多様で、ルーター、L2スイッチ、ハブなどがスイッチングを行うことができます。ここではL2スイッチを基準に説明します。L2スイッチは複数のネットワーク機器とポートで接続されており、(ポート、接続された機器のMACアドレス)を対応付けたMACテーブルを持っています。このMACテーブルは受信したデータフレームをMACアドレスと対応付けられた機器に転送する役割を担います。これもARPリクエストと似たように、フラッディングを通じてポートに接続されたすべての機器のMACアドレスを更新することがあります。
ここで注意すべき点は、新しいネットワーク機器に到着するたびに送信されたデータフレームに保存された送信先MACアドレスと送信元MACアドレスは常に異なるということです。筆者は2つのノード間で通信が行われるときに2つのノードのMACアドレスを常に持っていると思っていましたが、実際にはそうではありませんでした。
- ネットワーク層
ネットワーク層は、異なるネットワークセグメントに属するノード間の通信を担当し、送信単位はパケットです。ここでネットワークセグメントとは、同じブロードキャストドメイン(ブロードキャスト要求が届く範囲)に属する機器の集合を指します。
ネットワーク層では、送信時に送信層から受け取ったセグメントに送信元IP、送信先IPなどの制御情報が含まれたIPヘッダーを追加してデータリンク層にパケットを渡し、逆にデータを受信する場合はデータリンク層からフレームを受け取り確認して送信層に送ります。
ネットワーク層は複数の役割を担います。その中からいくつかを取り上げて見てみましょう。
1) ルーティング
これはパケットが目的地まで最適な経路で到達するようにする過程を意味します。この過程でルーターまたはL3スイッチ(ルーターとL2スイッチの役割を同時に果たす)という機器を経由し、この過程で機器に保存されたルーティングテーブルを利用して、パケットのヘッダーに含まれる目的地のアドレスを確認し、どのホップ(中間停留地)に進むべきかを判断します。この一連の最適経路を見つける過程をルーティングアルゴリズムとも呼び、代表的なものとしてlinked-state(ダイクストラ基盤)、distance-vector(ベルマン-フォード基盤)などがあります。ただし、ルーティングはルーター以外にもL3スイッチが担当することもあります。
2)混雑制御
オンラインゲームをしていると、ネットワーク状態が混雑しているというメッセージをよく目にするでしょう。これはパケットがネットワーク上に溢れていることを意味しますが、なぜこれが問題になるのでしょうか。いくつか理由がありますが、
第一に、ルーターで単位時間あたり処理できるパケットは限られているため、パケットの送信が遅延します。
第二に、ルーターに多くのパケットが到着すると、後で処理するパケットを保持するバッファが必要ですが、このバッファの容量が超過すると、後から入ってくるパケットは失われて再送される必要があります。
これら二つは高いレイテンシを意味し、ユーザー体験の観点から良くありません。したがって、ネットワーク層ではこれらの問題を解決するために混雑制御の役割を担います。具体的には、
- パケットの伝達速度を一定に保つ
- 特定のノードの混雑を検出して他の経路にパケットを送ることで、特定の機器にパケットが集中するのを防ぐ
などの役割を果たします。
3) パケットの分割と再組立
MTU(Maximum Transmission Unit、最大送信単位)とは、各ルーターで一度に受け取れるデータ(パケット)の最大サイズを指します。場合によってはパケットがMTUを超えることがあり、その場合はこれをフラグメントという単位で分割し、パケットが到着した際に受信側で再組立します。
4. 送信層
送信層は、送信元ノードと目的地ノード間で正常なデータ送受信が行われるようにする役割を担います。
これをネットワーク層と関連付けて言うと、ネットワーク層がデータが目的地に到達するための経路探索を行う役割を担うのに対し、送信層は
アプリケーションから送信されたデータストリームをセグメントという単位に分割し、制御情報が含まれたヘッダーを付加してネットワーク層に渡します。受信側では、この分割されたセグメントを再組立して目的地のポートにあるアプリケーションに渡します。
さらに詳しく見ると、
1) データ送信時の順序保証
TCPではデータストリームをセグメントに分割した後、データを元の順序で送信します。この際、パケットが途中で失われても再組立に問題が起こらないように、ヘッダーにシーケンス番号(Sequence Number)とAck番号(Acknowledgement Number)を使用します。
例えば、初期シーケンス番号が1でデータサイズが100の場合、シーケンス番号は100になり、Ack番号は101となります。つまり、シーケンス番号はそのデータがデータストリームのどのバイトから始まるかを示す情報であり、Ack番号はこのセグメントのデータに対して次に来るべきセグメントのシーケンス番号を意味します。これを通じてセグメントを再びデータストリームに組み立ててアプリケーションに送ります。
2) 接続維持
TCPでは3-way handshakeを通じて送信者と受信者間の接続を確認しデータ送信を開始し、データ送信が終了すると4-way handshakeを通じて両者間の接続を解除します。
3) 混雑制御
ネットワーク層でどんなに混雑制御をしても、実際に送信層でデータを無制限に送信し続ければ意味がありません。したがって、送信層ではデータを送った後に戻ってくる応答時間などを確認し、送信するデータ量を決定します。
4) フロー制御
ネットワークの混雑状況とは別に、もし受信側も受信したデータを処理する時間が必要であり、ルーターと同様に後で処理するデータを蓄えるバッファなどが存在する場合があります。
このとき、送信側が現在相手側の送信層が処理できるバッファのサイズを超えるデータを送信すると、必然的にデータの損失が発生します。したがって、受信側は現在受け取れるデータ量を相手に知らせ、送信側が送信データ量を制御します。
5. アプリケーション層
アプリケーション層は、実際に機器内で実行されているプロセスに関する層を意味します。
データを送受信する際、アプリケーションは機器内のOSに組み込まれたプロトコルスタックを利用します。このプロトコルスタックがネットワーク層と送信層の役割を担います。アプリケーションはデータを送信したいときにプロトコルスタックに依頼してソケットを作成します。簡単に言えば、通信に必要な情報を記録しておくものと考えてください。これを通じて他のホストと通信します。
アプリケーション層では送信時に送信層へデータを送り、受信時には送信層に保存されているセグメントを読み取ります。読み取り速度の向上は応答速度の向上につながります。なぜなら、TCP/IPではデータ送信の安定性を確保するためにフロー制御を行っているため、現在受信側が受け取れるウィンドウサイズが増加すれば(つまり、受信側がデータを早く処理できるようになれば)、送信側の送信速度を高めることができるからです。整理するとドミノのように、
アプリケーションのデータ処理速度向上 → 送信層のウィンドウサイズが早く増加 → ウィンドウサイズが満杯で待機する時間が減少 → データを迅速に送信
と表現できます。
データ送信過程
TCP/IPモデルについて整理したので、これを基にデータが送信される過程を整理してみましょう。
- アプリケーション層
例えば、ウェブブラウザがユーザーが入力したURLを使ってDNSサーバーにリクエストを送り、該当URLのIPアドレスを取得します。そして、アプリケーションはプロトコルスタックにソケットを作成するよう依頼し、ソケットを通じてデータを送信します。ここで一連の過程を通じて、受信側のIPアドレスとポート番号がソケットに保存され、二つのホスト間の接続が確立されます。
- データに制御情報を付加
- 送信層: TCPヘッダー(ポート番号) + データ → セグメント
- ネットワーク層: IPヘッダー(IPアドレス) + セグメント → パケット
- データリンク層: MACヘッダー(MACアドレス) + パケット + トレーラー → フレーム
などの過程を通じてエンキャプセレーションを行います。
- 送信
フレームはデータリンク層で組み立てられ、LANドライバを通じてLANアダプタに渡され、LANアダプタがデータを送信します。
- LAN内での移動
現在のデータの目的地のMACアドレスが同じネットワークセグメントに属しているか確認し、属していなければゲートウェイルーターにデータを送信します。
- WANでの移動
ルーティングを通じて次に進むべき機器を継続的に探します。ルーターやL3スイッチはネットワーク層以外にも物理層、データリンク層の処理を担当しており、まず物理層を通じてデータがデータリンク層に渡されると、データリンク層は目的地のMACアドレスが自分のアドレスかどうかを確認しながらデータをフィルタリングします。ネットワーク層ではIPヘッダーに付加された目的地IPアドレスを基に次に進むべき機器を探し、再びデータリンク層にデータを渡します。データリンク層では再び現在のMACアドレスと次の目的地のMACアドレスが含まれたMACヘッダーを付加し、フレームを作成してポートを通じて隣接する機器に送信を続けます。
- 目的地機器のネットワークセグメントに到着
目的地機器のネットワークセグメント内にあるARPテーブルを通じて目的地機器のMACアドレスを確認し、送信します。到着すると、再びデエンキャプセレーションの過程を通じて各階層で送信側が送った制御情報を確認し、送信層に到達してアプリケーションに到着します。
reference:
이해하면 인생이 바뀌는 TCP 송/수신 원리 - YouTube
[10분 테코톡] 🔮 히히의 OSI 7 Layer - YouTube
Data Link Layer - GeeksforGeeks
What is the maximum transmission unit (MTU)?
What is Transmission Control Protocol (TCP)? - GeeksforGeeks
MAC addresses and their functionality - Homenet Howto
Routing vs. Forwarding vs. Switching | Baeldung on Computer Science
ChatGpt