TCP と UDP の違い、再送とポートの仕組み

回 4-3 道 4 ネットワークと暗号

TCP は、相手と 3 ウェイハンドシェイクでつながってから送り、順番の番号と確認応答で欠けを見つけて送り直す決まりです。UDP は、つながる手順も送り直しも持たず、8 バイトの頭を付けてすぐ送る決まりです。全部が順番どおりにそろうことが大事なら TCP、遅れて届いた物は使えない通話や生の映像のように間に合うことが大事なら UDP が向きます。

確実に順番どおり届けることと、遅れずに届けることを切り分けられるようになります。

TCP と UDP は、何が違うのか

TCP と UDP の違いは、届いたことを確かめて送り直すかどうかです。

ビデオ通話で 1 コマが失われたとき、送り直したコマが届くころには、相手はもう次の言葉を話しています。一方、ファイルは 1 か所でも欠けたら開けません。

TCP と UDP は、どちらもトランスポート層 (届いたデータを機械の中のどのプログラムに渡すかを受け持つ層) の決まりです。下の IP (住所で宛先まで運ぶ決まり) は、途中で失ったり順番を入れ替えたりします。その欠けを埋めるのが TCP、埋めずにすぐ渡すのが UDP です。

TCP と UDP はどう作られているのか

TCP は手順の多い重い決まり、UDP は軽い決まりです。

比べる所TCPUDP
つながる手順3 ウェイハンドシェイク無い
頭の大きさ20 バイト (追加の欄を除く)8 バイト
欠けたとき見つけて送り直す何もしない
届く順番並べ直して渡す届いた順に渡す
混雑したとき送る量を減らす決まりには無い

ポート番号は、機械の中の宛先

ポート番号は、1 台の機械の中でどのプログラムに渡すかを決める番号で、TCP にも UDP にも頭の先頭にあります。RFC 6335 は、0 から 1023 を System Ports、1024 から 49151 を User Ports、49152 から 65535 を Dynamic Ports (決まった用途に割り当てない) に分けています。DNS (名前から IP の住所を引く仕組み) のサーバーは、RFC 1035 で TCP と UDP の 53 番と決まっています。

TCP の頭と、3 ウェイハンドシェイク

TCP は、データを送る前に SYN、SYN と ACK、ACK の 3 回のやり取りで、お互いの番号の始まりをそろえます。これが 3 ウェイハンドシェイクです。

TCP の頭には、ポート番号 (16 ビットずつ)、順番の番号 (32 ビット)、確認応答の番号 (32 ビット)、頭の長さ、フラグ (印)、受け取れる量 (ウィンドウ)、検査の値などが並びます。フラグの SYN は番号をそろえたい、ACK は確認応答の番号が有効、FIN はもう送るデータが無い、RST はつながりを切る、を表します。

RFC 9293 の図の例では、A が番号 100 の SYN を送り、B が番号 300 と確認応答 101 を返し、A が確認応答 301 を返します。RFC 9293 は、この手順の一番の理由を、古い接続の申し込みが今のつながりを乱さないようにすることだと書いています。

つなぎ直すたびに往復が増える

順番の番号と確認応答で、欠けを見つける

TCP は 1 バイトごとに番号を振り、受け手は次にほしい番号を確認応答で返します。RFC 9293 によると確認応答は累積で、番号 X を返すことは X の手前までを全部受け取ったという意味です。

途中の 1 個が抜けると、受け手はその後ろを受け取っても、抜けた所の番号を返し続けます。RFC 5681 は、同じ確認応答の重なり (重複 ACK) が 3 回届いたら、失われたと見て、タイマーを待たずに送り直す (高速再送) よう定めています。重複 ACK が来ないときは、タイマー切れで気づきます。

輻輳制御は、混んだら送る量を減らす

輻輳制御は、失われたことを混雑の合図と見て、確認応答を待たずに送ってよい量 (輻輳ウィンドウ、cwnd) を減らす仕組みです。RFC 5681 の決まりは次の通りです。

  • スロースタートでは、確認応答 1 つにつき cwnd を最大 1 セグメント (一度に送る 1 かたまり) 増やす。往復 1 回でほぼ倍になる
  • 輻輳回避では、往復 1 回につき 1 セグメントずつ増やす
  • 重複 ACK 3 回で気づいたら、しきい値 (ssthresh) を送りかけの量の半分 (最低 2 セグメント) に下げ、送り直しのあと cwnd もそこまで下げて続ける
  • タイマー切れで気づいたら、cwnd を 1 セグメントに下げ、スロースタートからやり直す

混んだ道で送り直しを増やせばさらに混むので、それを防ぐ代わりに、失うたびに TCP は遅くなります。

失敗すると送る量が半分に落ちる

UDP の頭は 8 バイトだけ

UDP の頭は、送り元と宛先のポート番号、長さ、検査の値の 4 つで、2 バイトずつの 8 バイトです。RFC 768 は、届くことも重複しないことも保証しないと書き、順番どおりの確実な届け方が要るなら TCP を使うように、とも書いています。長さの欄は頭を含めたバイト数です。

何に使われるか、DNS は両方を使い分ける

UDP の代表的な使い道は、DNS の問い合わせ、通話や映像、QUIC と HTTP/3 です。RFC 1035 は、ふつうの問い合わせには手間の少ない UDP を勧め、名前の表をまるごと写すゾーン転送には UDP を使わないと定めています。元の決まりでは UDP の答えは 512 バイトまでで、超えると切って TC (切れた) の印を立てます。のちの RFC 6891 (EDNS(0)) で、UDP でも大きな答えを扱えるようになりました。

HTTP/3 は QUIC の上で動き、RFC 9000 によると QUIC の小包は UDP のデータグラムで運ばれます。

動かして確かめる

まず、ポート番号の範囲を判定します。番号の欄は 16 ビットなので、一番大きい番号は 2 の 16 乗から 1 を引いた数です。

動かす ポート番号の範囲

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

53 System
8080 User
50000 Dynamic
最大 65535

次に、UDP の頭を struct で詰めます。! はネットワークの並び (ビッグエンディアン)、H は 2 バイトの整数です。

動かす UDP の頭 8 バイト

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

8 バイト
c3 50 00 35 00 17 00 00
送り元 50000 宛先 53
長さ 23
中身 15

「こんにちは」は UTF-8 で 15 バイトなので、長さは頭と足して 23 (16 進数で 17) です。

続いて TCP の頭を詰め、RFC 9293 の図と同じ番号で 3 ウェイハンドシェイクの 3 つを作って読み戻します。I は 4 バイト、B は 1 バイトの整数です。

動かす TCP の頭と 3 ウェイ

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

20 バイト
100 0 SYN
300 101 SYN ACK
101 301 ACK

追加の欄が無い TCP の頭は 20 バイトで、UDP より 12 バイト多くなります。5 << 4 は頭の長さの欄で、4 バイトの塊が 5 個あることを表します。

欠けと遅れで、何が起きるか

TCP は欠けを埋めるまで、その後ろに届いたデータも渡さずに待たせます。UDP は待たせない代わりに、欠けたまま渡します。

確認応答から、抜けた番号を見つける

6 個のかたまりを送り、3 番だけが失われたとします。本物の TCP はバイトの番号を返しますが、ここではかたまりの番号で数えます。

動かす 確認応答から送り直す

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

ACK [2, 3, 3, 3, 3]
重複の ACK 3
送り直す番号 3
ACK 7

4 番から 6 番が届いても確認応答は 3 のままで、同じ 3 が 3 回重なったので 3 番を送り直します。届くと確認応答は一気に 7 に進みます。

混雑を見ると、送る量が落ちる

上の図と同じ条件で、cwnd を往復 1 回ごとに記録します。5 回目の往復でロスが起き、重複 ACK で気づく場合と、タイマー切れ (RTO) で気づく場合を比べます。高速回復の途中の細かい増減は省いています。

動かす 輻輳ウィンドウの動き

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

重複 [1, 2, 4, 8, 16, 8, 9, 10]
RTO [1, 2, 4, 8, 16, 1, 2, 4]

16 まで伸びたところでロスが起き、重複 ACK なら 8 から 1 ずつ、タイマー切れなら 1 からやり直しです。最後の往復で送れる量は 10 と 4 で、失うたびに TCP が遅くなる理由が見えます。

なぜ動画や通話で UDP が選ばれるのか

通話や生の映像で UDP が選ばれるのは、遅れて届いたコマは使えないからです。コマには映す期限があり、期限を過ぎて届いたコマは映しても意味がありません。

1 秒 30 コマなら 1 コマはおよそ 33 ms ごとです。片道 50 ms、往復 100 ms の相手から送り、受け手は届いてから 40 ms の余裕を持って映すとします。3 番のコマが失われ、送り直しが往復 1 回分遅れる場合を比べます。各行は、コマの番号、映す期限 (ms)、渡された時刻 (ms) です。

動かす 期限に間に合うか

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

TCP
0 90 50 OK
1 123 83 OK
2 156 116 OK
3 189 249 遅れ
4 222 249 遅れ
5 255 249 OK
UDP
0 90 50
1 123 83
2 156 116
3 欠け
4 222 182
5 255 215

TCP では 3 番が期限 189 に対して 249 に渡り、間に合いません。182 に届いていた 4 番も、3 番を待って 249 まで渡されず、期限 222 を過ぎました。順番どおりに渡す約束が、失われていない 4 番まで遅らせたのです。UDP では 3 番が欠けるだけで、4 番と 5 番は間に合いました。

実際の決まりもこの考えに沿っています。RFC 3550 は、通話や会議の音声と映像を運ぶ RTP を、ふつうは UDP の上で動かすと書いています。ブラウザの通話の仕組み WebRTC の通信を定めた RFC 8835 は、多くの部分が UDP を前提にし、TCP の経路を挟むと先頭の詰まり (head of line blocking) などで性能の問題が出うると書いています。

確実さと速さの取り替え

ただし、動画の配信がいつも UDP というわけではありません。録画の動画や、少しの遅れを許すライブ配信には、映像を小分けのファイルにして HTTP で取りに行く形があり、HTTP Live Streaming (HLS、RFC 8216) がその 1 つです。受け手が先の分をためてから映すので、送り直しの遅れはためた分で吸収できます。下が TCP か UDP かは HTTP の版で決まり、RFC 9114 によると HTTP/2 は主に TLS と TCP の上、HTTP/3 は UDP の上の QUIC で動きます。

崩れる前提は次の通りです。

  • 全部が順番どおりにそろえば役に立つ、という前提。期限のあるデータでは、遅れは欠けと同じになる
  • UDP ならいつも通る、という前提。RFC 8835 は、UDP を通さない防火壁のために TCP で迂回する道も求めている
  • UDP は届かなくても困らない、という前提。確実さが要るなら、上のプログラムが自分で補う

仕事でどう確かめるか

仕事では、データに「いつまでに要るか」の期限があるかを最初に確かめます。欠けてはいけない物 (ファイル、API の応答) は TCP、古い値の価値がすぐ下がる物 (通話、対戦の位置) は UDP の上の仕組みを考えます。

防火壁の許可を作るときは、DNS の 53 番のように同じ番号を TCP と UDP の両方で使うサービスがあるので、番号と一緒に TCP か UDP かも書きます。Linux なら ss -tuln で待ち受けている番号を一覧できます。遅さを調べるときは、TCP なら再送の回数と往復の時間、UDP なら欠けた割合を見ます。Wireshark のような道具で、3 ウェイハンドシェイクや重複 ACK も見られます。

関わる実例

SYN フラッド攻撃 (1996 年 9 月ごろ)

RFC 4987 によると、TCP の SYN フラッド攻撃は 1996 年に手口が公開され、1996 年 9 月までに実際の攻撃が観測されました。ある ISP のメールサーバーが止まり、CERT が注意喚起 CA-96.21 を出しました。攻撃者は、多くは偽の送り元を名乗って SYN を大量に送り、つながりかけの受け付けの枠を埋めて、本物の申し込みを断らせます。崩れた前提は「SYN を送った相手は最後の ACK まで返す」です。

UDP を使った増幅攻撃 (CISA の TA14-017A)

米国の CISA の注意喚起 TA14-017A (最終改訂 2019 年 12 月 18 日) は、UDP はつながりを作らず送り元の住所を確かめないので、送り元を被害者の住所に偽れると説明しています。偽の問い合わせへの大きな答えが、被害者に押し寄せます。増幅率は DNS で 28 から 54 倍、NTP で 556.9 倍と載っています。崩れた前提は「UDP の送り元の住所は本物だ」です。

よくある問い

TCP はプロトコルですか、TCP セッションとは何ですか

はい、TCP は通信の決まり (プロトコル) で、今は RFC 9293 に定められています。TCP セッションは、3 ウェイハンドシェイクで始まり FIN か RST で終わる、2 つの端の間の 1 本のつながりを指す呼び方です。RFC 9293 は、つながりを両端の住所とポート番号の組 (ソケット) の対で見分けます。

UDP はどういう意味ですか

UDP は User Datagram Protocol の略で、1 回で完結する小包 (データグラム) を送る決まりです。頭は 8 バイトだけで、つながる手順なしにすぐ送れますが、届くことは保証しません。

TCP と UDP はどちらが速いですか

最初の 1 個が届くまでは、ハンドシェイクの往復が無い UDP の方が速くなります。ただし速さより、遅れと欠けのどちらを許せるかで選びます。

HTTP/3 は UDP なのに、なぜ確実に届くのですか

HTTP/3 は QUIC の上で動き、QUIC の小包が UDP で運ばれます。RFC 9000 によると、QUIC は確実に届けるための応答と輻輳制御を自分で持っています。TCP がしていた送り直しを、UDP の上の QUIC が受け持つ形です。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。4 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

A が番号 100 で SYN を送りました。B が返す SYN と ACK の確認応答の番号はいくつですか。

2 問目

このコードを動かすと何が出ますか。

UDP の頭の大きさ

import struct
print(struct.calcsize("!HHHH"))

3 問目

ビデオ通話で UDP が選ばれる一番の理由はどれですか。

4 問目

TCP の送り手に、同じ確認応答の番号が 3 回重なって届きました。RFC 5681 の高速再送ではどうしますか。

説明課題

次のことを、自分の言葉で 3 行にまとめてください。書いたら、下の模範解答を開いて比べてください。

  • TCP と UDP の違いを、ハンドシェイク、確認応答、送り直しの言葉を使って
  • 通話や生の映像で UDP が選ばれる理由と、録画の配信では HTTP で取りに行く形もある理由

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

通信が遅い、つながらない、ときどき途切れるといった調べ物では、TCP の再送と輻輳制御による遅れか、UDP の欠けかを分けて考えると、何を測ればよいかが決まります。

もっと深く

この回の続きを、ゆめさくのコースの章や道具で深められます。頁の中の確認クイズに答えたあと、手を動かす量を増やしたいときに使ってください。

一次資料

どれも 2026年10月27日に開いて、題と中身を確かめました。

次へ

道 4 ネットワークと暗号の回

  1. 4-1層に分けて考えるOSI、TCP/IP、パケット頁で読む
  2. 4-2IP とサブネットIP アドレス、CIDR、ルーティング頁で読む
  3. 4-3TCP と UDP再送、輻輳制御、ポートこの回
  4. 4-4HTTP と DNSHTTPS、HTTP/3、名前解決頁で読む
  5. 4-5TLS と暗号の基礎共通鍵、公開鍵、ハッシュ、署名頁で読む

道 4 の頁へ戻るほかの道を見る