Featured image of post トランスポート層とは?「どのアプリへ届けるか」を担う仕組みをやさしく解説【第27回】

トランスポート層とは?「どのアプリへ届けるか」を担う仕組みをやさしく解説【第27回】

この記事でわかること

  • トランスポート層がなぜ必要なのか
  • ポート番号がアプリを識別する仕組み
  • ウェルノウンポート番号の一覧と意味
  • ソケット(IPアドレス+ポート番号)という概念
  • エフェメラルポートとは何か
  • TCPとUDPの違いと、それぞれが向いている場面
  • netstat コマンドで通信状態を確認する方法

はじめに

インターネット層はIPアドレスを使ってパケットを正しいデバイスに届けます。でも、デバイスに届いた後が問題です。

今あなたのパソコンでは何個のアプリがネットワーク通信をしているか、考えてみてください。ブラウザでウェブを見ながら、バックグラウンドでメールが受信され、チャットアプリが通知を受け取り、OSが時刻を同期している——そんな状況はざらにあります。

届いたパケットをどのアプリに渡せばよいか。IPアドレスは「どのデバイスへ届けるか」しか教えてくれません。デバイス内の「どのアプリへ渡すか」はまったく別の問題です。

ここを担うのがトランスポート層です。


TCP/IPモデルの中の位置づけ

トランスポート層はTCP/IPモデルの3番目の層です。

┌─────────────────────────┐
│   アプリケーション層     │  ← メール・ウェブなどのアプリ
├─────────────────────────┤
│   トランスポート層       │  ← 今回の記事(どのアプリへ?)
├─────────────────────────┤
│   インターネット層       │  ← IPアドレス(どのデバイスへ?)
├─────────────────────────┤
│ ネットワークインターフェース層 │ ← MACアドレス(どのNICへ?)
└─────────────────────────┘
  • Transport(トランスポート):「輸送」「運搬」という意味。「交通機関(transportation)」と同じ語源です

インターネット層が「宛先のデバイスまで届ける」役割なら、トランスポート層は「そのデバイスの中の正しいアプリに仕分けて渡す」役割です。


ポート番号——アプリの「受付窓口番号」

トランスポート層がアプリを識別するために使う仕組みがポート番号です。

  • Port(ポート):「港」が語源。船が出入りする港の「出入り口」から転じて、ネットワークでは「通信の受付窓口」を意味します

ポート番号は 0から65535 までの整数です。各アプリは特定のポート番号で通信を待ち受けています。

IPアドレスをマンションの住所に例えるなら、ポート番号は部屋番号です。

宛先:203.0.113.1(IPアドレス) : 443(ポート番号)
         ↑                          ↑
    マンションの住所            部屋番号
                        (HTTPSを担当するアプリが待っている部屋)

「このマンションのこの部屋へ」という2つの情報がそろって、はじめてパケットが正しいアプリに届きます。


ウェルノウンポート番号——あらかじめ決まった部屋番号

  • Well-known(ウェルノウン):Well(よく)+ Known(知られた)→「よく知られた」という意味

代表的なアプリのポート番号は、あらかじめ世界共通で決められています。これをウェルノウンポート番号と呼び、0〜1023番の範囲が使われます。

ポート番号 プロトコル 用途
22 SSH サーバーへの暗号化リモートアクセス
25 SMTP メールの送信
53 DNS ドメイン名のIPアドレス変換
80 HTTP ウェブ(暗号化なし)
110 POP3 メールの受信
143 IMAP メールの受信(複数端末対応)
443 HTTPS ウェブ(暗号化あり)
3389 RDP Windowsのリモートデスクトップ

ブラウザで https:// から始まるURLを開くと、自動的にポート番号443番のアプリに接続します。URLに「:443」を書かなくてよいのは、https という文字列からポート番号を自動で判断してくれるためです。

逆に http://example.com:8080/ のようにURLにポート番号が明示されているサイトを見かけることがあります。通常(80番や443番)と異なるポート番号を使っているサーバーにアクセスするときに、このような書き方をします。


エフェメラルポート——クライアント側の一時的な番号

サーバー側のポート番号(443番など)は決まっています。では、ブラウザなどクライアント側のポート番号はどこから来るのでしょうか。

ブラウザがウェブサーバーに接続するとき、OSが 1024番〜65535番 の範囲からランダムにポート番号を割り当てます。これを**エフェメラルポート(Ephemeral Port)**と呼びます。

  • Ephemeral(エフェメラル):「短命な」「一時的な」という意味。その通信が終わるとポート番号は解放されます

1つのブラウザでタブを3つ開くと、タブごとに異なるエフェメラルポートが割り当てられます。

ブラウザ タブA → 送信元ポート:54231 → YouTubeサーバー:443番
ブラウザ タブB → 送信元ポート:54298 → Googleサーバー:443番
メールアプリ   → 送信元ポート:55103 → メールサーバー:993番

同じパソコンから複数の通信が同時に起きていても、ポート番号が違うので混線しません。サーバーから返ってきたパケットがポート番号54231番宛てなら「タブAへ」と正しく届きます。

第23回のNAPTの記事で「送信元ポート番号:51001」といった数字が出てきたのを覚えているでしょうか。あの番号がエフェメラルポートです。ルーターはこの番号と内部デバイスのIPアドレスを対応させて変換テーブルを作り、「どのデバイスのどのアプリへの返信か」を管理していました。


ソケット——IPアドレスとポート番号のペア

「IPアドレス+ポート番号」をひとつにまとめた概念を**ソケット(Socket)**と呼びます。

  • Socket(ソケット):「差し込み口」「コンセント」という意味。電源プラグを差し込む口から転じて、ネットワーク通信における「接続の差し込み口」を表します

通信は必ず「自分のソケット ↔ 相手のソケット」という2つのソケットのペアで成り立ちます。

自分のパソコン                   Webサーバー
192.168.1.10 : 54231  ←→  203.0.113.1 : 443
  ↑自分のソケット                ↑相手のソケット

このペアが1つの通信セッションを一意に表します。タブを複数開いていても、それぞれのセッションは別のエフェメラルポートを使うため、まったく別のソケットペアで管理されます。


TCPとUDP——2つの配送方式

トランスポート層には代表的なプロトコルが2つあります。それがTCPUDPです。

TCP(Transmission Control Protocol)

  • Transmission(トランスミッション):「伝送」「送り届ける」という意味。自動車の変速機「トランスミッション」と同じ語源で、「力を確実に伝える」ニュアンスがあります
  • Control(コントロール):「制御」「管理」
  • Protocol(プロトコル):通信の取り決め・規約

合わせると「伝送を制御する通信の取り決め」です。

UDP(User Datagram Protocol)

  • User(ユーザー):利用者
  • Datagram(データグラム):Data(データ)+ gram(〜を書いたもの、電報)→「データのひとかたまり」
  • Protocol(プロトコル):通信の取り決め・規約

合わせると「ユーザーがデータの塊を送るための通信の取り決め」です。


TCP——確実に届けることを最優先にする

TCPは「データを正確に、もれなく届けること」を最優先にした設計です。書留郵便に例えると伝わりやすいです。受け取り確認があり、届かなければ再配達を手配してくれる。手間がかかるぶん、確実性が高い。

TCPの主な仕組みを見てみましょう。

① 接続の確立(スリーウェイハンドシェイク)

データを送り始める前に、送信側と受信側が「通信します」「わかりました」「ありがとう」という3回の確認を交わします。これを**スリーウェイハンドシェイク(3-way handshake)**と言います。

  • Handshake(ハンドシェイク):「握手」という意味。相互確認の儀式のイメージです

この事前確認があるため、「つながっているかどうかわからないまま送り続ける」という状況が起きません。

② 確認応答(ACK)

データを受け取るたびに「届きました」という確認メッセージ(ACK:Acknowledgement = 受け取り確認)を返します。送信側は一定時間待ってもACKが返ってこなければ、同じデータを再送します。これを再送制御と呼びます。

③ 順序保証

ネットワーク上でパケットがバラバラの順序で届くことがあります。TCPはパケットに番号を付けて管理し、受信側で正しい順序に並べ直してからアプリに渡します。

これら3つの仕組みにより「全データが正確な順序で届く」ことが保証されます。確認応答のやりとりが増えるぶん、UDPより通信のオーバーヘッドは大きくなります。


UDP——速さを最優先にする

UDPは「とにかく速く送ること」を優先した設計です。ラジオ放送に例えられます。放送局は電波を流すだけで、誰が聞いているか・ちゃんと聞こえているかを確認しません。確認の手間がないぶん、圧倒的に速い。

UDPにはTCPのような接続確立・確認応答・順序保証がありません。送りっぱなしです。パケットが途中で失われても再送しません。

「届かなくて困らない場面があるの?」と思うかもしれません。音声通話を例に考えてみましょう。

あなたが「おはようございます」と話したとき、最初の1文字「お」が届かなかったとします。TCPであれば「お」を再送してもらえます。ところが、「お」が届く頃には話し手はもう「ございます」まで話し終わっています。0.5秒前の音声を今さら再生されても、会話の流れが乱れるだけです。

音声通話やライブ映像にとって大切なのは「すべてが届くこと」より「今この瞬間のデータが遅れずに届くこと」です。多少欠けても、それは「電波が悪い」として人間が補完できます。だからUDPが向いています。


TCPとUDPの使い分け

TCP UDP
信頼性 高い(全データが正確に届く) 低い(欠けても再送しない)
速度 確認応答の分だけ遅い 速い
順序保証 あり なし
接続確立 必要(ハンドシェイク) 不要
主な用途 ウェブ・メール・ファイル転送・SSH 音声通話・ライブ配信・DNS・ゲーム

TCPを使う場面 データが欠けると困る用途です。ウェブページが半分しか表示されない、ファイルのダウンロードがどこかで壊れている——そんな状況は許容できません。正確性を保証するTCPが適しています。

UDPを使う場面 多少のデータ欠損より低遅延が重要な用途です。DNSも問い合わせパケットが非常に小さく、届かなければ即座に再試行すればよいのでUDPが使われます。オンラインゲームもキャラクターの位置情報は1フレーム前より今この瞬間のデータが重要なため、UDPが向いています。


netstatコマンドで通信の状態を確認してみよう

現在パソコンで行われているTCP/UDP通信の一覧は netstat コマンドで確認できます。

Windowsの場合

netstat -an

Mac・Linuxの場合

netstat -an

または

ss -an

次のような出力が得られます(環境によって異なります)。

Proto  Local Address           Foreign Address         State
TCP    192.168.1.10:54231      142.250.185.46:443      ESTABLISHED
TCP    192.168.1.10:54298      172.217.26.46:443       ESTABLISHED
TCP    0.0.0.0:22              0.0.0.0:*               LISTEN
UDP    0.0.0.0:53              0.0.0.0:*               -

各列の見方はこうです。

  • Local Address:自分のIPアドレス+ポート番号(ソケット)
  • Foreign Address:通信相手のIPアドレス+ポート番号(ソケット)
  • State:接続の状態

**State(ステート)**の主な値はこうです。

State 意味
ESTABLISHED 接続が確立されて通信中
LISTEN 接続の待ち受け中(サーバー側のアプリ)
TIME_WAIT 接続を終了した直後の待機状態
CLOSE_WAIT 相手が接続を終了し、自分側の終了を待っている状態

5423154298 のような大きめの番号がエフェメラルポートです。ブラウザのタブを複数開いた状態で netstat -an を実行すると、ポート443番宛ての ESTABLISHED 接続が複数のエフェメラルポートから張られている様子を実際に確認できます。

LISTEN 状態のエントリは「このポート番号で接続を待ち受けているアプリがある」ことを示します。たとえばSSHサーバーが動いていれば22番ポートが LISTEN で表示されます。


まとめ

  • トランスポート層は「デバイス内のどのアプリへ届けるか」を担う層。インターネット層がデバイスまで届けた後の仕分けを担当する
  • ポート番号(0〜65535)がアプリを識別する。ウェルノウンポート(0〜1023番)はHTTPSの443番、HTTPの80番など、アプリごとにあらかじめ決められている
  • クライアント側はエフェメラルポート(1024〜65535番)をOSが自動割り当て。タブやアプリごとに別の番号を使い、複数の通信を同時に区別できる
  • ソケットは「IPアドレス+ポート番号」のペアで、1つの通信セッションを一意に識別する
  • TCPは確認応答・再送制御・順序保証を備えた信頼性重視のプロトコル。ウェブ・メール・ファイル転送に使われる
  • UDPは確認なしで高速に送りっぱなしにするプロトコル。音声通話・ライブ配信・DNS・ゲームに使われる
  • netstat -an コマンドで現在の通信一覧・ポート番号・接続状態を確認できる