UDPとTCPって何が違うの?
以前TCPについてまとめた記事で、「届いたことを確認し、もし届いていなかったら送り直す」というTCPの仕組みによって、データが確実に届けられるようになっていることを学びました。
大半のアプリケーションはTCPに則って、データ送受信を行いますが、すべてがそうではありません。トランスポート層にはもうひとつ、UDPという通信プロトコルがあります。
DNSについてまとめた記事でも紹介したのですが、クライアントとDNSサーバが通信するときはUDPに則って行われます。今回は、UDPがTCPとどういった点で異なるかについてまとめます。
これは何の記事か?
プログラミングしか学んでこなかったエンジニアが本を参考に、UDP
の仕組みについて大まかにまとめた記事です。
対象読者
- プログラミングしか学んでこなかった
- UDPってなんですか??
- TCPとUDPって何が違うんですか?
この記事のゴール
-
UDP
がTCP
とどういった点で異なるかを簡単に説明できる
全体像の把握
この記事は、トランスポート層で行われる処理のうち、UDP
についてまとめたものになります。(赤枠の部分)
TCPのおさらい
TCPに則った通信では、届けたいデータを特定の大きさに分割して、クライアントとサーバがお互いに確認を取り合いながら送受信を行います。途中でデータの取りこぼしなどがあったら再送信することで、確実に全てのデータを送受信できる仕組みになっています。
このように複雑な仕組みになっているのは、データを確実に届けるためです。データを確実に届けるために、随時届いたかどうかを確認し、もし届かなかったらそのデータだけを再送信するようしているわけです。
TCPで送信する必要のないデータも存在する
TCPはどこまでデータが届いて、どこから再送信しなければならないかを制御しているために複雑になっています。この仕組みを、データを全て送り終わった後に受信側から受信確認応答をもらうだけにすれば、どこまで届いたかなど気にしなくてよくなります。
そうすればTCPの複雑さは取り除かれるのですが、問題もあります。パケットをひとつでも取りこぼしてしまったら、また全データを送受信し直さなければならなくなります。これではあまりにも非効率です。
データがいくつものパケットに分けられて送信される際は、TCPに則って通信を行った方が効率的なのです。しかし、逆を言えば、データが1つのパケットだけで十分なものだったら、TCPで通信を行わなくてもいいわけです。
このように、1つのパケットで済んでしまうような短いデータの時にUDPが使用されます。
UDPが使用されるケース
制御用の短いデータ
DNSサーバへの問い合わせなど、制御用に行う通信は、1つのパケットで済むことが多いので、こういった場面ではUDPを使用します。
UDPにはTCPのような受信確認がないので、接続や切断のフェーズがありません。アプリケーションからデータを受け取り、UDPヘッダーを付加した後、IPに依頼して送信するだけとなります。
UDPの場合、プロトコル・スタックがエラーを検知できないので、問題になるのではと思うかもしれません。しかし、返事が返ってこないことはアプリケーションが気づけるので、アプリケーションが送り直せば問題は解決します。
音声や動画のデータ
音声や動画のデータを送る場合もUDPが使用されます。音楽や動画は決められた時間にデータを届けなければ、音声や映像が止まってしまうことになります。
TCPのように受信確認応答でエラーを検出して送り直していては時間もかかりますし、再生タイミングに間に合わなかったデータが届いても役に立ちません。
また音声や動画のデータが一部届かなかったとしても、一瞬途切れるか止まるだけであり、その程度なら許容できますよね。
つまり、送り直しが必要ない、もしくは、送り直しても役に立たないときにUDPが使用されます。
まとめ
-
UDP
はTCP
とは違って受信確認をしないので、信頼性はないが、即時性の高い通信が行える。 -
UDP
はTCP
とは違って、パケット1つで送信できるようなデータや、届かなくても再送する必要のないデータを届ける時に使用される。
参考にした本
所感
UDP
を理解するには、まずTCP
を理解することが先だなと感じました。TCP
がパケットの受信確認や再送信を行う仕組みや、その目的をわかっていないとUDP
について学んでも、深くは理解できなのかなと思いました。