情報処理の試験でTCPとかUDPとか目にするけどどう違うのか?
UDPを使う場面ってどんなとき?
ほとんどの場合TCPを使います。
ストリーミングサービスなどのリアルタイム性が高いものを作るときにUDPです。
TCPとUDP
TCPとUDPはトランスポート層(レイヤー4)のプロトコルです。IP層の上です。
IP層が単にデータを送るだけなのに対して、トランスポート層は、全てデータが揃っているか、できていなければ再送指示などを行います。
TCPがやること
TCPはトランスポート層がやるとされていることをやります。
3-wayハンドシェイク、到達確認、シーケンス番号の管理(順番の管理、データが揃っているか)、などを行い、通信の信頼性を確保します。データ化けやデータ欠けはTCPでエラーとなります。
例えば、HTTPはTCP上のプロトコルですが、通信経路上でデータ化けが起こるという心配は不要です。
ほとんどのプロトコルがTCP上に構築されています。よく使うところで言うと、HTTP, FTP, IMAPなどなどです。
UDPがやること
UDPは何もやりません。3-wayハンドシェイク、到達確認、シーケンス番号の管理などを一切やりません。
UDPを採用している限りデータが確実に届かないことがあります。順番が入れ替わるかもしれません。
LinuxのUDPの実装を見れば分かりますが、チェックサムだけやってすぐにIP層に投げる感じです。つまり、トランスポート層を素通りさせるのがUDP層です。
UDPが必要なとき
UDPは何もやりません。
データが確実に届くことが保証されません。順番が入れ替わるかもしれません。こんなプロトコルを使う場所があるのか?と思うかもしれません。
リアルタイムな通信
UDPは、リアルタイム性を重視するときに使われます。
例えば、VoIPつまり電話の音声を送受信するプロトコルRTPがUDP上です。
電話の音声で、100msくらい途切れたときその100ms分を再送するよりも、次の音声が送信される方を優先した方がよさそうです。
データの完全性よりも速度重視です。オンラインゲームなどもこのカテゴリーですね。少々画像が乱れたとしても大まかに動作することの方が重要です。
NTP, DNS, DHCPもUDP上です。何度も素早く通信する必要があるためUDP上になります。
電話やオンラインゲームのようなデータのやりとりをするならUDPを考えてよいかもしれません。
自作の通信制御
TCPのやっていることが性能面で気に入らないけど信頼性は大事、というときはUDPにして上位で再送制御などを行います。
と言いますが、自作で再送制御したいと思うケースがあるのか私は分かりません。
が、しかし、
HTTP/3の話を最初聞いたときはびっくりしました。いまどきTCPを否定する人がいるのかと。先入観はいけないんだなと思うと同時に、Googleの技術力の底知れなさを感じます。
まとめ
TCPとUDPの違いと使い分けを説明しました。
大体がTCPです。普通のITエンジニアが関わるのはTCPです。リアルタイムなサービスを作るときはUDPを検討しましょう。
コメント