メインコンテンツへスキップ
見出し画像

【基礎から学び直すITインフラ入門】#3 トランスポート層 - TCPとUDP

    3記事目です。まだ、3記事目だというのに2月に突入してしまいました。
    続けるコツは無理しないことと言い聞かせてやっていこうと思います。
    では、始まります。前回記事は ↓ から。

    はじめに

    前回は、Webページを例に、データがどのように流れていくかを学びました。
    今回は、その中で登場したトランスポート層に焦点を当てます。TCPとUDPという2つの主要なプロトコルの違いと、それぞれがどのような場面で使われるのかを見ていきましょう。

    トランスポート層の役割

    はじめに、トランスポート層の役割についておさらいしましょう。
    【基礎から学び直すITインフラ入門】#1ネットワークの階層モデル で紹介した、TCP/IPモデルにおけるトランスポート層となります。

    画像
    TCP/IPモデル 第3層トランスポート層

    トランスポート層の主な役割:

    1. アプリケーションの識別: ポート番号で同じコンピュータ内のどのアプリ宛かを識別

    2. データの届け方の制御: 確実に届けるか、速度を優先するかを決定

    この層には主に2つのプロトコルがあります。それぞれをどのような違いがあるのかを比較して、詳細を見ていきましょう。

    TCPとUDPの比較

    TCPとUDPを比較し、それぞれのプロトコルについて説明していきます。

    画像
    TCPとUDPの比較

    簡単にまとめると、TCPは「速度は遅いけど確実」、UDPは「速度は速いけど不確実(届かないときがある)」と覚えておいてください。

    TCP

    TCPは、データを確実に、正しい順序で届けることを最優先にしたプロトコルです。そのためにTCPで行われる処理を見ていきましょう。

    1. 接続確立 - 3-wayハンドシェイク
    TCPでは、通信の状態や目的を示すためにフラグという仕組みを使い、複数のフラグを組み合わせて使うことで様々な制御を行います。
    3-wayハンドシェイクは、データを送る前にSYN(接続開始を要求するフラグ)とACK(データの受信確認を示すフラグ)を利用して、接続を確立します。

    画像
    3-wayハンドシェイク

    3-wayハンドシェイクのステップ:

    ステップ1: クライアントから、接続開始の要求フラグ(SYN)をTCPヘッダに付与して送信

    ステップ2: サーバーから、接続開始要求を受信したフラグ(ACK)と、接続開始要求フラグ(SYN)をTCPヘッダに付与して応答

    ステップ3: クライアントから、サーバーからの接続開始要求を確認したフラグ(ACK)をTCPヘッダに付与して接続を開始


    2. データの到達保証 - 確認応答と再送
    接続ができたら、データを送ります。

    画像

    データ送信時には、シーケンス番号とACK番号を用いて到達保証を行います。シーケンス番号は送信するデータの順序や位置を管理するための識別子です。受信側は、正しく受信できたデータの次に受信を期待するシーケンス番号をACK番号として応答します。
    何らかの理由でデータが消失し、一定時間内にACKが返らなかった場合、送信側は同じデータを再送することで、データの到達を保証しています。

    ※図を簡潔にするために省略しましたが、3-wayハンドシェイク時にも、シーケンス番号、ACK番号は使われています。


    3. 順序保証
    ネットワークではパケットが順番通りに届くとは限りません。TCPはシーケンス番号を使って正しい順序に並び替えます。

    上記の仕組みを利用して、TCPは、通信の確実性を実現しています。

    UDP

    UDPは、シンプルで高速な通信を実現するプロトコルです。

    画像
    UDP

    UDPには接続確立の概念がないため、SYNやACKといったフラグも存在せず、データの到達や順序にも保証がないため、ヘッダーも軽量で高速な通信を実現しています。

    ※ちなみに、UDP自体には保証はありませんが、必要に応じてアプリケーション側で制御することはあります。

    プロトコルの使い分け(例)

    Webページ :TCP
    ✅HTMLの1文字でも欠けたら表示が崩れる
    ✅ 完全なデータが必須
    ⚠️多少遅くても問題ない

    ライブ配信:UDP
    ✅少しノイズが入っても視聴可能
    ✅ 過去のフレームを再送しても意味がない
    ❌ 遅延は許されない

    ポート番号 - アプリケーションの識別

    トランスポート層ではポートでアプリケーションを識別します。重要な概念となるので、ポート番号について少し触れておきます。

    ポート番号とは

    IPアドレスだけでは、どのアプリケーションに届けるかまでは分かりません。そこで使われるのがポート番号です。
    IPアドレスとポート番号の組み合わせによって、どのコンピュータの、どのアプリケーションかまで一意に特定することができます。

    主なポート番号

    画像
    主要なポート番号一覧

    ポート番号の範囲

    ポート番号は0〜65535(16ビット)の範囲で、用途によって3つに分類されます。

    0 〜 1023 : ウェルノウンポート(Well-Known Ports)
    有名なサービス用に予約済みのポート番号です。
    例: 80(HTTP), 443(HTTPS), 22(SSH)

    1024 〜 49151 : 登録済みポート(Registered Ports)
    アプリケーションが登録して使用します。
    例: 3306(MySQL), 5432(PostgreSQL)

    49152 〜 65535 : 動的ポート(Dynamic Ports)
    エフェメラルポート(一時ポート)とも呼ばれる
    クライアントが一時的に使用
    例: ブラウザが通信時に自動割り当てされる送信元ポート

    さいごに

    今回は、トランスポート層における TCP と UDP の役割や違いについて見てきました。
    TCPは優れていて、UDPは劣っているみたいに最初は考えがちだったのですが、目的に応じた使い分けが重要なことがわかりますね。

    次回は、インターネット層に焦点を当て、IPアドレッシングについて詳しく見ていきます。IPアドレスの構造など、ネットワーク設計に欠かせない知識を学びます。

    あなたへのおすすめ