この記事でわかること
- トランスポート層がなぜ必要なのか
- ポート番号がアプリを識別する仕組み
- ウェルノウンポート番号の一覧と意味
- ソケット(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つあります。それがTCPとUDPです。
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 | 相手が接続を終了し、自分側の終了を待っている状態 |
54231 や 54298 のような大きめの番号がエフェメラルポートです。ブラウザのタブを複数開いた状態で 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コマンドで現在の通信一覧・ポート番号・接続状態を確認できる