class: title, smokescreen, shelf, no-footer # UDP (User Datagram Protocol) <div class=digest-begin-01></div> --- class: img-right,compact # UDPヘッダ ![](images/udp-unreliable.png) - TCPと違い、最小限の情報のみです - **処理が軽いです** - 最低限の通信はできますが、 パケットの損傷、紛失、重複、順序の乱れなどについて何も配慮しません - 右図は、UDPやIP、イーサネットのレベルのあちこちでパケットが損失するイメージです。 TCPであればTCPが回復させますが、**UDPでは単にパケットが届かない**だけです (たいていは、**エラーの連絡もありません**) --- class: col-2,compact # UDPヘッダ - TCPと違い、最小限の情報のみです - **処理が軽い** - 最低限の通信はできますが、 パケットの損傷、紛失、重複、順序の乱れなどについて何も配慮しません - 障害への対処は、すべてソフトウエア内に書く必要があります - そのかわり、 **プログラマつまりユーザがプロトコルをすべてコントロールできるのがメリット**です <wbr> ![height240px](images/udp-header.png) | 図中の表現 | 内容 | 長さ | |----------------------------|--------------------|------| | source port | 送信元のポート番号 | 16 | | destination port | 送信先のポート番号 | 16 | | length | データの長さ | 16 | | checksum | チェックサム | 16 | --- class: col-2,compact # UDPを使っている例 <div class=footnote> <small> (脚注1) DNSクエリのデフォルトはUDPでも、サーバ間の設定ファイルの同期はTCP <br> (脚注2) 組み込み機器などではsoftware(firmware)の格納領域が小さいため、 firmwareを大きくしないために、 UDPで転送するTFTPを使いたいという理由もあります </small> </div class=footnote> - 大域的にUDPを使う例 - DNS (詳細は前回を参照) - 軽い動作 - IP電話などの**音声,動画** - **少々のパケット損失が問題にならない**メディア - 最初の認証などはTCP、 実際のデータ転送はUDPといったハイブリッドな作りが普通です <wbr> - **短距離**通信でUDPを使う例 - 視認範囲、1部屋などの規模感 - OSの自動設定 - DHCP (Dynamic Host Configuration Protocol) - ネットワーク機器の設定やbackup - TFTP (Trivial File Transfer Protocol) --- class: col-2,compact # UDPの意義 <div class=footnote> <small> (脚注) TCPの場合OSがエラー処理など何でも面倒をみてくれて便利です。 アプリ屋さんはデータ転信の詳細など一切気にせずにアプリを作れます。 だから多くのアプリがTCPベースなわけですよ </small> </div class=footnote> - TCPは仮想通信路を確立して転送を行いますが、 その確立する処理自体が重たいという問題があります - TCPはOSの機能なので(プログラマが何かしたくとも)細かな変更は不可能です <wbr> - そこで真逆のUDPという仕組みが用意されており、 TCPにない次のような特徴があります - 軽い動作 - **プログラマが変更可能なプロトコル** (トランスポート層はUDPにまかせて、 その上の階層で自由に設計できるという意味です) ... 前回の**DNS**、このあと紹介するQUIC(HTTP/3)などが、この好例と言えます <div class=digest-end-01></div>