TCPの代わりにUDPを使用することが適切なのはいつですか?[閉まっている]


303

TCPはパケット配信を保証し、したがって「信頼できる」と見なすことができるため、UDPは何も保証せず、パケットが失われる可能性があります。TCPストリームではなく、アプリケーションでUDPを使用してデータを送信する利点は何ですか?どのような状況でUDPの方が適していますか?なぜですか?

UDPはストリームを作成および維持するオーバーヘッドがないため、より高速であると想定していますが、一部のデータが宛先に到達しない場合、それは無関係ではありませんか?


55
UDPは、パケット損失の可能性があるだけでなく、パケットが1回しか受信されないことを保証しません。ネットワークが複雑であるか、構成が適切でない場合、同じパケットを複数回受信する可能性があります。人々はこれを忘れがちであるので、注意してください!
ブライアンアグニュー

3
パケットの順序も保証されません。
Mehrdad Afshari、

19
TCPは配信を保証しません。パケットを配信できる場合、送信されたのと同じ順序になることを保証するだけです。
Chaim Geretz、2011年

5
ところで、TCP再送信の信頼性/順序どおりの配信を同等と見なす人がよくいます。これらの「専門家」は、UDPでの送信エラーを克服するために、TCPを(不適切に)再実装することになるため、TCPを使用することもできます。 本当じゃない。 再送信以外にも、レイテンシやゼロではないがゼロ以外のエラー率の結果としてスループットが指数関数的に低下しないエラー回復技術があります。
Ben Voigt 2014年

TCPは、宛先がパケットを受信しなかったかどうかも保証します。
csga5000 2015年

回答:


354

これは私のお気に入りの質問の1つです。UDPはとても誤解されています。

本当に簡単に別のサーバーに簡単に答えたい場合は、UDPが最適です。一般的には、1つの応答パケットに回答を含める必要があり、信頼性のために独自のプロトコルを実装するか、再送信する準備ができています。DNSは、この使用例の完全な説明です。接続設定のコストが高すぎます(ただし、DNSはTCPモードもサポートしています)。

もう1つのケースは、入ってくる新しいデータが以前のデータ/状態を置き換えるために失われる可能性があるデータを配信している場合です。気象データ、ビデオストリーミング、株価情報サービス(実際の取引には使用されません)、またはゲームデータが思い浮かびます。

もう1つのケースは、膨大な量の状態を管理していて、OSがその数のセッションを処理できないためにTCPの使用を避けたい場合です。これは今日ではまれなケースです。実際、アプリケーションライターがそのTCP状態に必要なリソースをより細かく制御できるように、ユーザーランドのTCPスタックを使用できるようになりました。2003年以前は、UDPが町で唯一のゲームでした。

もう1つのケースは、マルチキャストトラフィックの場合です。UDPは複数のホストにマルチキャストできますが、TCPはこれをまったく行えません。


興味深い答えをありがとう。現在、サーバーはすべてUDP(高帯域幅要件)で実行していますが、実際にはシングルホップ(ルーティングが無効になっているなど)があるためOKですが、パケットの並べ替えが一部の障害のあるネットワークカードで問題になる可能性があることに気付きました。どのユーザーモードTCP(または他のユーザーモードフロー制御)スタックをお勧めしますか?
ダッシュ

@dashesy-注文要件を取り除くことができますか?使用できるペイロード内に単調に増加する数がありますか?もしそうなら、あなたは本当に本格的なユーザーランドTCPスタックを必要としません。
drudru 2013年

@ drudru-はい、シーケンス番号があります。自分でバッファリングしてジッターを解除する必要があるかもしれません。おかげで、もう1つのオプションを削除することは常にすばらしいことです。
ダッシュ

64

TCPパケットが失われた場合、再送されます。これは、リアルタイムで特定の順序で処理されるデータに依存するアプリケーションには便利ではありません。

例としては、ビデオストリーミング、特にVoIPSkypeなど)があります。ただし、これらの例では、ドロップされたパケットはそれほど重要ではありません。私たちの感覚は完全ではないため、気付かないこともあります。これが、これらのタイプのアプリケーションがTCPではなくUDPを使用する理由です。


16
あなたはそれを逆に持っていると思います。TCPは、送信された順序でデータが配信されるようにパケットを並べ替えます。UDPは、順序を再し、それはそれを受け取ったどんな順序でデータを配信しません。
ハンス・Malherbe

1
UDPは順序を保証しませんが、パケットに番号を付けて、受信後にそれらを並べ替えることができます。
クーゲル

7
@ Stephan202:Skypeでドロップされたパケットに気付かないことに同意する必要があると思います;-)
Robert S. Barnes

6
@Kugel:新しいTCPスタックを実装する可能性があることに注意してください。これで、OSよりも優れた仕事をする可能性は低くなります。
erikkallen 2010

1
@erikkallen:UDPを使用して、TCPが満たすように設計されたものと同じ要件でより高いレベルのプロトコルを実装している場合、既存のプロトコルよりもはるかに優れているとは考えられません。一方、UDPラッパーがTCPよりも適切に処理できるプロトコルにいくつかの機能を追加することで、一部のアプリケーションは恩恵を受けます。
スーパーキャット2015

56

UDPの「信頼性の欠如」は形式主義です。送信は完全に保証されているわけではありません。実際問題として、彼らはほとんどいつも通り抜けます。タイムアウト後、確認されず再試行されるだけです。

TCPソケットのネゴシエーションとTCPパケットのハンドシェイクのオーバーヘッドは非常に大きくなります。本当に巨大です。目に見えるUDPオーバーヘッドはありません。

最も重要なのは、TCPよりもオーバーヘッドの少ない信頼できる配信ハンドシェイクでUDPを簡単に補完できることです。これを読んでください:http : //en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

UDPは、パブリッシュサブスクライブ型のアプリケーションで情報をブロードキャストするのに役立ちます。IIRC、TIBCOは、状態変化の通知にUDPを頻繁に使用します。

その他の種類の一方向の「重要なイベント」または「ロギング」アクティビティは、UDPパケットで適切に処理できます。ソケット全体を構築せずに通知を送信したい。さまざまなリスナーからの応答は期待できません。

システムの「ハートビート」または「I'm alive」メッセージも適切な選択です。欠けているのは危機ではありません。半ダース(行)が欠落しています。


5
「実際問題として、彼らはほとんどいつも通り抜けます」。下位のネットワーク層の信頼性に大きく依存します。
m0skit0

さらに、「少数」のパケット損失と「多すぎる」パケット損失の計画には違いがありますか?損失は​​損失です。とにかくそれを計画する必要があります。
Sedat Kapanoglu

30

クライアントとサーバー間のUDP(IP)とTCP / IPの両方の通信をサポートする製品に取り組んでいます。15年以上前のIPXから始まり、13年前にIPサポートが追加されました。3年か4年前にTCP / IPサポートを追加しました。予想外の問題:UDPとTCPのコード比はおそらく約80/20です。製品はデータベースサーバーであるため、信頼性が重要です。他の回答で既に言及されているUDPによって課されるすべての問題(パケット損失、パケット倍加、パケット順序など)を処理する必要があります。ほとんど問題はありませんが、時々発生するため、処理する必要があります。UDPをサポートすることの利点は、UDPを自分の使用法に合わせて少しカスタマイズし、それからもう少しパフォーマンスを調整できることです。

ネットワークはそれぞれ異なりますが、UDP通信プロトコルは一般的に少し高速です。懐疑的な読者は、私たちがすべてを正しく実装したかどうかを正しく質問します。さらに、2桁の担当者から何を期待できますか?それにもかかわらず、私は今、好奇心からテストを実行しました。このテストでは、100万件のレコードを読み取りました(sometableから*を選択)。個々のクライアント要求ごとに返すレコード数を1、10、次に100(各プロトコルで3つのテスト実行)に設定しました。サーバーは、100Mbit LAN上で2ホップしか離れていませんでした。数値は、他の人が過去に発見したものと一致しているようです(ほとんどの状況で、UDPは約5%高速です)。この特定のテストの合計時間はミリ秒単位でした。

  1. 1件
    • IP:390,760ミリ秒
    • TCP:416,903ミリ秒
  2. 10件
    • IP:91,707ミリ秒
    • TCP:95,662ミリ秒
  3. 100件
    • IP:29,664ミリ秒
    • TCP:30,968 ms

送信される総データ量は、IPとTCPの両方でほぼ同じでした。TCP / IPで「無料」で入手できるものと同じもの(チェックサム、シーケンス番号など)があるため、UDP通信には余分なオーバーヘッドがあります。たとえば、Wiresharkは、次のレコードセットのリクエストがUDPでは80バイト、TCPでは84バイトであることを示しました。


TCP専用に開発し、5倍のコーディング作業ではなく、より優れたハードウェアを購入した場合はどうなりますか?
inf3rno 2017年

2
具体的な数字をありがとう!5%の改善は、それが追加する複雑さに少しがっかりします。
セルゲイ

1
おそらく5%はローカルネットワークで送信されるためです(2つの希望は離れています)。私の推測では、遠いほど、差は大きくなります。
lepe 2017

19

ここにはすでに良い答えがたくさんありますが、要約だけでなく非常に重要な要素を1つ追加したいと思います。UDPは、輻輳制御を採用していないため、適切なチューニングではるかに高いスループットを実現できます。TCPの輻輳制御は非常に重要。接続の現在の容量を推定することにより、ネットワークの輻輳を最小限に抑えるために、接続のレートとスループットを制御します。コアネットワークなどの信頼性の高いリンクを介してパケットが送信される場合でも、ルーターのバッファーのサイズは制限されています。これらのバッファーは容量いっぱいになり、パケットはドロップされます。TCPは、受信された確認応答の欠落を通じてこのドロップに気づき、それにより、接続の速度が容量の見積もりに抑制されます。TCPもスロースタートと呼ばれるものを採用していますが、スループット(実際には輻輳ウィンドウ))は、パケットがドロップされるまでゆっくりと増加し、その後低下し、パケットがドロップされるまでゆっくりと増加します。これにより、TCPスループットが変動します。大きなファイルをダウンロードすると、これがはっきりとわかります。

UDPは輻輳制御を使用していないため、ドロップポイントまでバッファーを最大化しようとしないため、高速であり、遅延も少なくなります。つまり、UDPパケットはバッファー内で費やされる時間が短く、遅延が少なくて速く到達します。UDPは輻輳制御を採用していませんが、TCPは採用しているため、UDPフローに譲るTCPから容量を奪う可能性があります。

ただし、UDPは依然として輻輳やパケットドロップに対して脆弱であるため、アプリケーションは、おそらく再送信やエラー修正コードを使用して、これらの複雑な問題を処理できるように準備する必要があります。

その結果、UDPは次のことが可能になります。

  • ネットワークドロップ率がアプリケーションが処理できる制限内である限り、TCPよりも高いスループットを実現します。
  • TCPよりも速く、遅延が少ないパケットを配信します。
  • 接続をセットアップするための初期ハンドシェイクがないため、接続をより速くセットアップ
  • マルチキャストパケットを送信しますが、TCPは複数の接続を使用する必要があります。
  • 固定サイズのパケットを送信するのに対し、TCPはデータをセグメントで送信します。300バイトのUDPパケットを転送すると、相手側で300バイトを受信します。TCPを使用すると、送信ソケットに300バイトを供給することができますが、受信機は100バイトしか読み取らないため、途中でさらに200バイトあることを何らかの方法で把握する必要があります。これは、アプリケーションがバイトストリームではなく固定サイズのメッセージを送信する場合に重要です。

要約すると、UDPは、適切な再送信メカニズムも実装している限り、TCPが使用できるすべてのタイプのアプリケーションに使用できます。UDPは非常に高速で、遅延が少なく、接続ベースの輻輳の影響を受けず、固定サイズのデータ​​グラムを送信し、マルチキャストに使用できます。


1
ネットワークが十分に輻輳してパケット損失を引き起こす場合、TCPはネットワークの他のユーザーへの影響を最小限に抑えようとしますが、UDPベースの多くの実装ではそうではありません。これにより、減少するパイのより大きなシェアを獲得できますが、有効な帯域幅の有効期間の総量も減少します(たとえば、実際にはデータが配信されても​​送信者がそれに気付かない場合の不要な再送信の結果として)
スーパーキャット2017

まず、素晴らしい答えをありがとう、私は本当にそれから多くを学びました!しかし、私は質問があります:レイヤー4(TCPとUDPの両方)から受信したすべてのパケットのイーサネットアダプターの制限のため、レイヤー3(IP)でセグメンテーションは発生しませんか?TCPでは発生するがUDPでは発生しない他の種類のセグメンテーションを意味しますか?ご説明いただければ幸いです。
RuslanSh 2018

1
@Freezy。リンクのMTU(レイヤー2)を超えるパケットの断片化はレイヤー3-IPで発生します。ただし、TCPはストリームベースのプロトコルであり、データをバイトのストリームとして扱います。TCPは、MSSに応じたサイズのIPパケット内に収まるように、セグメントでデータを送信するため、TCPでもセグメンテーションが行われます。ただし、TCPがセグメントに入れるデータの量、またはソケットが読み取るデータの量は、多くの要因によって異なります。1バイトまたはMSSバイトにすることができます。UDPを使用すると、パケットが途中で失われていない場合、受信側は常に送信側が送信した正確なバイト数を取得します。
アンディ

15

UDPはオーバーヘッドが少なく、オーディオやビデオなどのリアルタイムデータのストリーミングなど、データが失われても問題ない場合に適しています。


15

UDPはコネクションレス型プロトコルであり、SNMPDNSなどのプロトコルで使用されます。このプロトコルでは、順序が狂って到着するデータパケットは許容可能であり、データパケットの即時送信が重要です。

SNMPで使用されるのは、ネットワークにストレスがかかっているとき、つまり信頼性の高い、輻輳制御のデータ転送を実現するのが難しいときに、ネットワーク管理を行う必要があることが多いためです。

これは接続の確立を含まないため、DNSで使用され、接続の確立の遅延を回避します。

乾杯


12

この質問に対して私が知っている最良の答えの1つは、Hacker NewsのユーザーzAy0LfpBZLC8mACからのものです。この答えはとても良いので、そのまま引用します。

TCPは完全な順序どおりの配信を保証するため、head-of-queueブロッキングを備えています。そのため、送信中にパケットが失われた場合、欠落したパケットの再送信を待つ必要がありますが、UDPはパケットが到着するとアプリケーションにパケットを配信します。 、重複を含み、パケットが到着するか、またはパケットが到着するという保証はありません(実際には、ポート番号と(オプションで)ペイロードチェックサムが追加されたIPです)が、通常はテレフォニーに適しています。数ミリ秒のオーディオが欠落している場合は問題になりませんが、遅延は非常に煩わしいので、再送信に煩わされることはありません。重複を削除し、並べ替えられたパケットを数百ミリ秒のジッターバッファーの正しい順序に並べ替えます。 、そしてパケットが時間内にまたはまったく表示されない場合、それらは単にスキップされ、コーデックでサポートされている場所で補間される可能性があります。

また、TCPの主要な部分はフロー制御であり、可能な限りスループットを確保しますが、ネットワークに過負荷をかけません(これは冗長です。過負荷のネットワークはパケットをドロップするため、これを行う必要があります)再送信するとスループットが低下します)、UDPにはそのようなものはありません-これはテレフォニーのようなアプリケーションでは理にかなっています通話が速くなることはありません。

リアルタイム/低レイテンシアプリケーションに加えて、UDPは、DNSルックアップなどの非常に小さなトランザクションに適しています。これは、TCPコネクションの確立とティアダウンオーバーヘッドがないためです。リクエストが一般的なMTUよりも小さく、応答もおそらく小さい場合は、サーバーで状態を維持する必要がなく、フロー制御の順序付けなど、1回のラウンドトリップで実行できます。そのような用途にも。

そしてもちろん、UDPを使用して独自のTCP置換を構築することもできますが、ネットワークダイナミクスをある程度理解していなければ、それはおそらく良い考えではありません。最新のTCPアルゴリズムはかなり洗練されています。

また、SCTPやDCCPのように、UDPやTCPだけではないことにも触れておきたいと思います。現在の唯一の問題は、(IPv4)インターネットがNATゲートウェイでいっぱいであり、エンドユーザーアプリケーションでUDPおよびTCP以外のプロトコルを使用できないことです。


UDPを介してSCTPおよびDCCPを実行できます。
デミ

9

ビデオストリーミングは、UDPを使用する完璧な例です。


いくつか例を挙げてください。
Gaurav Sing 2017

「ビデオストリーミング」がその例です。hotstarでストリーミングされるライブマッチを考えてみましょう。
Sisir

8

既に述べたように、UDPはオーバーヘッドが低いため、ビデオやオーディオなどのストリーミングに適しています。パケットを失うだけで、再送信して追いつくことをお勧めします。

TCP配信の保証はありません。ソケットが切断された場合、または基本的にデータが到着しない場合に通知されます。それ以外の場合は、そこに到達したときに到達します。

人々が忘れている大きなことは、udpはパケットベースであり、tcpはバイトストリームベースであることです。送信した「tcpパケット」がもう一方の端に表示されるパケットであるという保証はなく、多くのパケットに分解できます。ルーターとスタックが望むように。したがって、ソフトウェアには、バイトを解析して使用可能なデータのチャンクに戻すというオーバーヘッドがあり、かなりのオーバーヘッドがかかる可能性があります。UDPが故障している可能性があるため、必要に応じてパケットに番号を付けるか、他のメカニズムを使用してパケットの順序を変更する必要があります。しかし、そのudpパケットを受け取った場合、同じバイトがすべて同じ順序で残り、変更はありません。したがって、udpパケットという用語は意味がありますが、tcpパケットは必ずしもそうではありません。TCPには、アプリケーションから隠された独自の再試行および順序付けメカニズムがあります。

UDPは、基本的にはポイントツーポイント接続を作成して維持する必要がないため、両端でコードを書く方がはるかに簡単です。私の質問は通常、TCPオーバーヘッドが必要な状況はどこですか?そして、受信したtcp「パケット」が送信された完全なパケットであると想定するようなショートカットを使用する場合、あなたの方がいいですか?(長さ/内容を確認するのに面倒な場合は、2つのパケットを破棄する可能性があります)


TCPには配信保証があります。チャンクAはチャンクBの前にアプリケーションに配信されるため、アプリケーションがチャンクBを(アプリケーションレベルで)確認すると、チャンクAを取得したことがわかります。ただし、これはTCP処理レベルでも発生します。
Simeon Pilgrim

TCPでは、各チャンクにその長さのプレフィックスを付けるだけで、データのチャンクを安全に区切ることができます。アプリケーションに応じて、各チャンクに1バイト、2バイト、または4バイトの固定長でプレフィックスを付けるか、128 ^ N以下の各チャンクにNバイトの長さでプレフィックスを付けることができます。それほど大きなオーバーヘッドではありません。このような設計は、ギャップのない順序どおりの配信を保証しないプロトコルでは良くありませんが、TCPを使用する場合はそのような設計で十分です。
スーパーキャット2013年

固定長のデータ量を探す場合でも、長さは必要ありません。バイト数をカウントするだけです...
old_timer

1
@supercat。あなたは、絶対に正しい。これは、アプリケーションに複雑さを追加することも意味します。UDPで実際に必要な複雑さ。このため、ファイルなどのストリームの転送にはTCPの方が適しています。しかし、チャンクされたデータの信頼性、そしておそらく最上位のTCP上のTLSの追加のセキュリティが必要なときに、私はあなたがすることを正確に行います。
アンディ

5

ビデオゲームのネットワーク通信は、ほとんどの場合UDP経由で行われます。

速度は最も重要であり、各更新にはプレーヤーが見ることができる完全な現在の状態が含まれているため、更新が欠落していても問題にはなりません。


5
通常は完全な状態ではなく、最後の確認からのデルタなので、更新は徐々に大きくなります。
Simeon Pilgrim

5

重要な質問は、「UDPの方がどのような状況に適しているか(tcpより)」に関連しています。

上記には多くの素晴らしい答えがありますが、欠けているのは、TCPパフォーマンスに対するトランスポートの不確実性の影響の正式で客観的な評価です。

モバイルアプリケーションの大幅な成長と、それに伴う「時折接続される」または「時々切断される」パラダイムにより、接続が困難な場合にTCPが接続を維持しようとするとオーバーヘッドが強くなる状況が確かにあります。 UDPとその「メッセージ指向」の性質のケース。

今、私はこれに数学/研究/数値を持っていませんが、接続が一般に貧弱で古いTCPであるときにTCPで達成できるよりも、UDPでACK / NAKおよびメッセージ番号付けを使用してより確実に機能するアプリを作成しました時間を費やしただけで、クライアントのお金は接続しようとしました。あなたは多くの西洋諸国の地方と農村地域でこれを得ます...


3

他の人が強調したいくつかのケースでは、パケットの到着の保証は重要ではないため、UDPの使用は問題ありません。UDPよりもTCPの方が望ましい場合もあります。

TCPの代わりにUDPを使用したいユニークなケースの1つは、別のプロトコル(トンネル、仮想ネットワークなど)でTCPをトンネリングする場合です。TCP over TCPをトンネリングすると、それぞれの輻輳制御が相互に干渉します。したがって、一般に、UDP(またはその他のステートレスプロトコル)経由でTCPをトンネルすることを好みます。TechRepublicの記事:TCP over TCPの理解:エンドツーエンドのスループットと待機時間に対するTCPトンネリングの影響を参照してください。


2

UDPは、アプリが正確なデータ複製ではなく「リアルタイム」データを重視する場合に使用できます。たとえば、VOIPはUDPを使用でき、アプリはパケットの並べ替えを心配しますが、最終的にはVOIPがすべてのパケットを必要とするわけではありませんが、さらに重要なのは、それらの多くの連続フローが必要です。多分あなたはここに音声品質の「グリッチ」がありますが、主な目的はメッセージを受け取ることであり、反対側で完全に再現されることではありません。UDPは、接続の作成とTCPとの同期の費用がペイロードを上回る状況でも使用されます。DNSクエリは完璧な例です。クエリごとに1つのパケットが送信され、1つのパケットが返されます。TCPを使用する場合、これはより集中的になります。DNS応答が返されない場合は、再試行してください。


2

速度が必要な場合はUDP、パケットが必要でない場合は精度、精度が必要な場合はTCP。

UDPは、パケットの精度に依存しないようにプログラムを記述しなければならないという点で、しばしばより困難です。


2

常に明確であるとは限りません。ただし、損失のない正しい順序でパケットの配信を保証する必要がある場合は、TCPがおそらく必要です。

一方、UDPは、情報のシーケンスがそれほど重要でない場合や、データが単一のパケットに収まる場合に、情報の短いパケットを送信するのに適しています。

同じ情報を多くのユーザーにブロードキャストする場合にも適しています。

それ以外の場合は、シーケンスされたデータを送信する場合に適していますが、一部のデータが欠落しても、心配する必要はありません(VOIPアプリケーションなど)。

一部のプロトコルは、TCPの機能の一部(すべてではない)が必要なため、より複雑ですが、UDPが提供する機能よりも複雑です。これは、アプリケーション層が追加機能を実装する必要がある場所です。これらの場合、UDPも適切です(たとえば、インターネットラジオ、順序は重要ですが、すべてのパケットが通過する必要があるわけではありません)。

使用例/使用例1)LAN上の多数のマシンに正しい時刻をブロードキャストするタイムサーバー。2)VOIPプロトコル3)DNSルックアップ4)LANサービスの要求(例えば、どこにいるのですか?)5)インターネットラジオ6)その他多数...

UNIXでは、grep udp / etc / servicesと入力して、今日実装されているUDPプロトコルのリストを取得できます。


2

StevenのUnixネットワークプログラミングのセクション22.4 「TCPの代わりにUDPを使用する場合」をご覧ください。

また、UDPは常にTCPよりも速いという誤解については、この別のSOの回答を参照してください。

スティーブンの言うことは次のように要約することができます:

  • ブロードキャストとマルチキャストにはUDPを使用してください。これが唯一のオプションです(新しいアプリにはマルチキャストを使用してください)。
  • 単純な要求/応答アプリにはUDPを使用できますが、独自の確認応答、タイムアウト、再送信を組み込む必要があります
  • バルクデータ転送にUDPを使用しないでください。

1
来た人のために、最後の点についてもう少し情報を。TCPはバルクデータ転送で機能しますが、データが最初から最後まで到着することを気にしない場合は、UDPを介してより高速なプロトコルを作成できます。非常に特殊な病理学的ケースでは、はるかに高速です。UDPで一括転送を実行できないということではなく、常にパフォーマンスが悪いということでもありません。実装するのはお尻の痛みなので、面倒なことはほとんどありません。
ijw

1
はい、UDPを使用して一括転送できます。独自の制御メカニズムを実装する必要があります。それがお尻の痛みかどうかは、プログラミングスキルに依存しますが、必ずしもパフォーマンスが悪いとは限りません。あなたは自分が何をしているかを知る必要があります。そうしないと、はい、あなたは苦しむかもしれません。
アンディ

2

UDPはコネクションレス型プロトコルであることを知っているので、

  1. 単純な要求/応答通信を必要とするプロセスに適しています。
  2. 内部フロー、エラー制御があるプロセスに適しています
  3. ブロードキャスティングとマルチキャストに適しています

具体的な例:

  • SNMPで使用
  • RIPなどの一部のルート更新プロトコルに使用されます

2

TCPとUDPを比較すると、UDPのようなコネクションレスプロトコルは速度を保証しますが、パケット伝送の信頼性は保証しません。たとえば、ビデオゲームでは通常、信頼性の高いネットワークは必要ありませんが、速度が最も重要であり、ゲームにUDPを使用すると、ネットワークの遅延を減らすことができます。

ここに画像の説明を入力してください


1

途中で一部のデータが失われても送信されるデータが完全に損なわれない場合に、UDP over TCPを使用します。その使用法の多くは、ゲーム(FPSなど)のようなリアルタイムアプリケーションで使用されます。FPSでは、すべてのプレーヤーが常にどこにいるかを知る必要がなく、途中でいくつかのパケットを失うと、新しいデータはプレーヤーがどこにいるのかを正しく伝えます)、リアルタイムビデオストリーミング(1つの破損したフレームが表示エクスペリエンスを台無しにすることはありません)。


さて、1つの破損したフレームが表示のその部分を台無しにしてしまいますが、失われたフレームよりも後のフレームの方が価値がある場合、それを待っている間、後者のフレームをすべて失速させたくありません。
Simeon Pilgrim

1

私たちは、何千ものwinformsクライアントを同じ数のPCに持つWebサービスを持っています。PCはDBバックエンドとは接続されておらず、すべてのアクセスはWebサービスを介して行われます。そこで、UDPポートでリッスンする中央ログサーバーを開発し、すべてのクライアントがXMLエラーログパケットを(log4net UDPアペンダーを使用して)送信し、受信時にDBテーブルにダンプされるようにしました。いくつかのエラーログが見落とされても何も気にしないので、何千ものクライアントでは、メインのWebサービスを読み込まない専用のログサービスで高速です。


0

TCPが機能する可能性がある場合に、UDPを提案することに少し消極的です。問題は、TCPがなんらかの理由で機能していない場合、接続が遅すぎるか輻輳しているため、UDPを使用するようにアプリケーションを変更しても役に立たないことです。悪い接続はUDPにとっても悪いです。TCPはすでに輻輳を最小限に抑えるという非常に優れた機能を果たしています。

UDPが必要なのは、ブロードキャストプロトコルの場合だけです。アプリケーションに2つの既知のホストが含まれる場合、UDPは、コードの複雑さの大幅に増加したコストに対して、限界のパフォーマンス上の利点しか提供しない可能性があります。


UDPからより良い結果が得られる1つのアプリケーションは、中間ノードがトラフィックポリシングを実行している場合の通過テストです。これは、パケットレートをより簡単に制御できるためです。TCPは、パケットを高速にプッシュし、TCPの相互作用を制御します。ウィンドウ処理は、ポリシングと悪影響を及ぼします。
Simeon Pilgrim

これはまだ最適化であり、実際のテストから従う必要があります。私の主張は、最初にTCPを使用することを試み、何らかの理由でTCPが機能していないことがわかった場合にのみ代替手段を試すことです。理論的にはより良い帯域幅の使用をサポートするUDPを選択することは、時期尚早な最適化の形式です。
SingleNegationElimination 2009

ああ、最適化の面で同意します。しかし、TCPが他の問題と比較して問題になる可能性があるときの知識は、そのパフォーマンスの問題を解決しようとするときに役立ちます。
Simeon Pilgrim

-1

UDPは、自分が何をしているか本当にわかっている場合にのみ使用してください。今日、UDPは非常にまれなケースですが、UDPをどこにでも貼り付けようとする(非常に経験豊富な)専門家の数は不釣り合いのようです。おそらく、エラー処理と接続保守のコードを自分で実装することを楽しんでいます。

チェックサムインプリントと呼ばれるものにより、最近のネットワークインターフェイスカードではTCPがはるかに高速になることが期待されます。驚くべきことに、高速接続速度(1Gbpsなど)では、チェックサムの計算はCPUにとって大きな負荷になるため、インプリント用のTCPパケットを認識するNICハードウェアにオフロードされ、同じサービスを提供しません。


2
UDPチェックサムオフロードは、TCPチェックサムオフロードと同じように使用できます。
Ben Voigt 2014年

チェックサムの検証は行いません。
Pavel Radzivilovsky 2014年

1
今日のコンシューマーグレードのイーサネットアダプターでも、送信と受信の両方にUDPチェックサムオフロードがあります(受信オフロードは検証を行っています)。そして、10年前にプロシューマハードウェアでその機能を確認しましたが、サーバークラスのNICでさらに長く使用されていると思います。
Ben Voigt

-2

UDPは、データパケットを送信する必要があるVoIPに最適であり、信頼性は低くなります...ビデオチャットはUDPの例です(ビデオチャット中にWiresharkネットワークキャプチャで確認できます)。また、TCPは動作しません。 DNSおよびSNMPプロトコル。UDPにはオーバーヘッドがありませんが、TCPには多くのオーバーヘッドがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.