UDP vs TCP、どれくらい速いですか?[閉まっている]


194

一部のパケット損失を許容できる一般的なプロトコルメッセージ交換用。UDP over TCPはどれほど効率的ですか?


質問もTCPに関するものなので、「tcp」タグを追加することもできます。
クリスティアンCiupitu 2008

5
「一般的なプロトコルメッセージ交換」とはどういう意味ですか?問題は、効率とは何かを明確にする必要があります。小さなメッセージのレイテンシを減らしたいですか?または、連続するデータストリームのスループットを高めたいですか?
JohanBoulé2014年

Tcpには、速度以外にUDPよりも優れた機能があります。
ラージクマールナガレティナム2015

3
TCPとUDPの速度の問題は議論の余地があります。見出しの質問は、実際には質問の本文と一致しません。TCPパケットとUDPパケットの両方が、同じメディア上でまったく同じ速度で移動します。
Ron Maupin、2015

回答:


86

UDPはTCPよりも高速であり、単純な理由は、TCPウィンドウサイズとラウンドトリップ時間を使用して計算された一連のパケットを確認するTCPではなく、継続的なパケットストリームを許可するその存在しない確認パケット(ACK)が原因です。 (RTT)。

詳細については、シンプルですが非常にわかりやすいSkullboxの説明(TCPとUDP)をお勧めします


19
実際には、TCPがUDPよりも高速であるケースが多くあります。以下の私の答えを参照してください。
ロバートS.バーンズ

2
どちらが高速かは、トラフィックの特性に完全に依存します。

4
答えは正しいかもしれませんが、質問には答えず、他の場所で言及されている知識を繰り返します。また、ACKを使用した信頼性の高いUDPメソッドは、TCPよりも著しく高速である可能性があることについても触れていません。
Elliot Woods

268

TCPがあなたに与える主なものは信頼性だと人々は言っています。しかし、それは本当ではありません。TCPが提供する最も重要なことは輻輳制御です。DSLリンク全体で100のTCP接続をすべて最高速度で実行できます。100の接続はすべて、利用可能な帯域幅を「感知」するため、生産的です。100種類のUDPアプリケーションを使用して、すべてのパケットを可能な限り高速にプッシュしてみてください。

より大規模な場合、このTCPの動作は、インターネットが「輻輳の崩壊」に陥らないようにするものです。

アプリケーションをUDPに向ける傾向があるもの:

  • グループ配信のセマンティクス:TCPのポイントツーポイントの確認応答よりもはるかに効率的に、人々のグループに信頼性の高い配信を行うことができます。

  • 順不同の配信:多くのアプリケーションでは、すべてのデータを取得する限り、どの順序でデータが届くかは関係ありません。順不同ブロックを受け入れることで、アプリレベルのレイテンシを削減できます。

  • 親しみやすさ:LANパーティーでは、ネットワークの更新をできるだけ速くブリットしている限り、Webブラウザーが適切に機能するかどうかは気にしないでしょう。

しかし、パフォーマンスを気にしているとしても、UDPを使いたくないでしょう。

  • 現在、信頼性の問題に取り組んでおり、信頼性を実装するために行うことの多くは、TCPがすでに行っているよりも遅くなる可能性があります。

  • これでネットワークに不便になり、共有環境で問題が発生する可能性があります。

  • 最も重要なのは、ファイアウォールによってブロックされることです。

複数のTCP接続を一緒に「トランキング」することにより、TCPのパフォーマンスと遅延の問題を克服できる可能性があります。iSCSIは、ローカルエリアネットワークの輻輳制御を回避するためにこれを行いますが、低遅延の「緊急」メッセージチャネルを作成することもできます(TCPの「緊急」動作は完全に壊れています)。


18
正解です。「フロー制御」(フロー制御のサブセットである輻輳制御とは対照的に)をさらに一般的にしたいと思います。複数のTCP接続が1つのリンクを共有できるだけでなく、何らかの理由で受信データの処理を一時停止した場合に、送信者が受信者のバッファをオーバーフローすることも防ぎます。
Alex B

1
@AaronLS:パケット損失RTT(往復時間)の増加キューイング遅延のプロキシと見なすことができます)は可能/可能です(例:WiFiネットワークは実際の輻輳なしにパケットを失う可能性があり、一部のTCP輻輳制御アルゴリズムを輻輳回避に騙します)輻輳インジケータ。
ninjalj 14年

2
UDPは対処するための野郎です...私はすでにこれで燃え尽きています。何をしても、パフォーマンス、レイテンシ、スループット、信頼性のバランスが取れていないようです。タイマーのようなリアルタイムのものに最適です...しかし、私はUDPと転送エラー訂正を使用してTCPの置き換えに取り組んでおり、これは思っていたよりもはるかに困難です。輻輳制御。1GBネットワークとワイヤレスネットワークで同じように機能するユニバーサルシステムは、芸術作品です。ショットガンにロードされたパケットを再構成しようとしているように感じます。
Jason Nelson、

1
一方、TCPのもう1つの利点は、それが本質的に接続指向であることです。これにより、アプリケーションクライアントの処理ロジックが大幅に簡素化されます(listen-> accept->クライアントの状態は、当然、他のクライアントから独立しています)。特に単一のクライアントからの複数の接続の処理は、UDPを使うと危険になります。UDPの利点の1つは、UDPスタックは本当に簡単に実装できることです。これは、組み込みシステム(マイクロコントローラー、FPGAなど)の大きな利点です。特に、FPGAのTCP実装は、通常、他の誰かから購入したいものです。とは思わない)。
Jason C

1
これは、かなりのデータの配信に関心があることを前提としています(レイテンシをあまり気にしないでください)。かなりの数のアプリ(ゲーム/ VoIP)では、状況が大幅に異なります。非常に少量のデータしかありませんが、レイテンシは非常に重要です。UDPの合法的な使用の99%を占めるのは、この単純なものです。そして、いくつかの簡単な点:(a)グループ配信はインターネット経由では機能しません(そして、そうなることはほとんどありません)ので、イントラネットのみの領域です。(b)Googleによると、UDPに問題があるのはインターネット人口の8〜9%だけです。(c)「ネットワークに不適合」は、固定レートストリームには適用され
ません

93

一部のアプリケーションでは、TCPはUDPよりも高速です(スループットが優れています)。

これは、MTUサイズに比べて大量の小さな書き込みを行う場合です。たとえば、300バイトのパケットのストリームがイーサネット(1500バイトのMTU)を介して送信され、TCPがUDPより50%高速であるという実験を読みました。

その理由は、TCPがデータをバッファリングしてネットワークセグメント全体を埋め、利用可能な帯域幅をより効率的に使用するためです。

一方、UDPは、パケットをすぐに回線に送信するため、大量の小さなパケットでネットワークを混雑させます。

特別な理由がない限り、UDPを使用しないでください。特に、Nagleアルゴリズムを無効にすることで、TCPにUDPと同じ種類の遅延を与えることができるため(たとえば、リアルタイムのセンサーデータを送信していて、大量の小さなパケットでネットワークが輻輳する心配がない場合)。


3
私は実際にこの効果のベンチマークを行いました。例外をスローせずにUDPがサポートするのと同じ大きさのパケットを送信していて(Javaの場合)、TCPの方がはるかに高速でした。OS、ドライバー、ハードウェアの最適化の多くもこれに含まれていると思います。
チャーリー

14
@Myforwik:まず、これは実装定義ではなく、TCPプロトコルの一部です。Nagleアルゴリズムと呼ばれます。それは一般的に愚かなウィンドウ症候群として知られているものを防ぐのに役立ちます。両方の用語を調べます。第二に、TCPのpovからのパケットの概念はありません。最後に、「Effective TCP / IPプログラミング」という本では、1つの章全体がこの主題に向けられ、他の複数の章が、TCPとUDPをいつ使用するかを知るという関連する主題に向けられています。OPが一般的な質問をしたため、この状況(実際には非常に一般的です)を取り上げます。これは、考えられる多くの回答の1つです。
ロバートS.バーンズ2011年

46
@Myforwik。他人にモロニズムを提案するときは、私たち全員が私たちの知識にギャップがあることを理解してください。SOは、結局のところ、知識共有のためのフォーラムです。ほとんどすべての一人称シューティングゲームはUDPを使用しており、MTUに近いサイズでパケットを送信することはほとんどありません。ジョンカーマックにこのアプローチを思いついたのはどんなおばあさんであるかを教えたい場合は、まずこの点について徹底的に学ぶことをお勧めします。15年間、業界の価値のある高性能ネットワーキングコードは横になって死ぬことはありません。
エンジニア

2
300バイトパケットのストリームがイーサネット(1500バイトMTU)を介して送信され、TCPがUDPより50%高速である実験を読みました。」-この実験をリンクできますか?
Leviathan

3
@Leviathanこれは「効果的なTCP / IPプログラミング」の本にあります。
ロバートS.バーンズ

31

損失耐性あり

「ロストレランスあり」という意味ですか?

基本的に、UDPは「ロストレラント」ではありません。あなたは誰かに100パケットを送ることができます、そして彼らはそれらのパケットの95しか得ないかもしれません、そしていくつかは間違った順序にある​​かもしれません。

ビデオストリーミングやマルチプレーヤーゲームなど、パケットの背後にある他のすべてのパケットを遅延させるよりもパケットを逃した方がよい場合、これは明白な選択です。

ただし、他のほとんどの場合、欠落または再配置されたパケットは重要です。何かが失敗した場合に再試行するためにUDP上で実行する追加のコードをいくつか記述し、正しい順序を強制する必要があります。これにより、特定の場所でわずかなオーバーヘッドが追加されます。

ありがたいことに、一部の非常に賢い人々がこれを行い、彼らはそれをTCPと呼んでいました。

このように考えてください:パケットが欠落した場合、できるだけ早く次のパケットを取得して続行するか(UDPを使用)、または実際に欠落したデータが必要ですか(TCPを使用)。本当にエッジケースのシナリオでない限り、オーバーヘッドは問題になりません。


1
100のうち5パケット?かなりたくさんあります。あくまでも一例です。質問:実際の状況では、どれだけのパケットが失われる可能性がありますか?たとえば、10000のうち2(プラスマイナス1)であれば、それについては心配しません。
2013年

1
@変な、うん、それはほんの一例だった。パケット損失の実際の量は、接続、アップストリームネットワークなどによって異なります。以前は多くのオンラインゲームをプレイしていました。インターネット接続を使用しているのが私だけの場合、パケット損失は発生しませんが、バックグラウンドダウンロードを開始するとすぐに、いくつか(おそらく10%〜20%)のダウンロードを開始します。しかし、これは約5年前のことであり、より高速なインターネット接続が役立つ場合があります。
Orion Edwards

2
インターネットルーターはTCPの前に
UDPを

19

UDPとTCPのどちらのプロトコルが(スループットの点で)パフォーマンスが優れているかは、実際にはネットワークの特性とネットワークトラフィックによって異なります。たとえば、Robert S. Barnesは、TCPのパフォーマンスが向上するシナリオ(小さいサイズの書き込み)を指摘しています。ここで、ネットワークが混雑していて、TCPトラフィックとUDPトラフィックの両方があるシナリオを考えてみます。TCPを使用しているネットワーク内の送信者は、「輻輳」を感知し、送信速度を削減します。ただし、UDPには輻輳回避または輻輳制御メカニズムがありません。UDPを使用する送信者は、同じレートでデータを送り込み続けます。徐々に、TCP送信側は送信速度を最低限に下げ、UDP送信側がネットワーク経由で送信するのに十分なデータを持っている場合、使用可能な帯域幅の大部分を占有します。したがって、このような場合、UDP送信者は、ネットワーク帯域幅のパイが大きくなるため、スループットが向上します。実際、これは活発な研究トピックです-UDPトラフィックの存在下でTCPスループットを改善する方法。私が知っている1つの方法は、どのTCPアプリケーションを使用してスループットを向上できるかは、複数のTCP接続を開くことです。これにより、各TCP接続のスループットが制限される場合でも、すべてのTCP接続のスループットの合計が、UDPを使用するアプリケーションのスループットよりも大きくなる可能性があります。


2
これは正しくありません。ルーターはTCPの前にUDPをドロップします。共有回線では、UDPに溺れる可能性がありますが、供給過剰の状況で起こりそうなことはテクノロジーに依存しますが、UDPが衝突だけを送信されるようになるまで、非常に簡単に低下します。
user1496062

私はあなたの説明が好きですが、1ポイントを取得しません。UDP接続がすべてのトラフィックを取得できる場合(帯域幅が狭いかデータが高い場合)、その場合、TCPを使用しているアプリケーションは基本的にUDPを使用している人質に保持されます。すべてのアプリケーションがTCPを使用している場合、それらは互いに「うまく機能します」。では、そもそもなぜルーターでUDPを許可するのでしょうか。
IgorČordaš2014年

@PSIXO:まあ、TCPとUDPは異なるアプリケーション要件に対応するため、どちらもアプリケーションで使用されます。あなたの提案の意味するところは、TCPトラフィックとUDPトラフィックに異なるネットワークインフラストラクチャを用意する必要があるということです。それが研究者が「ソフトウェア」の対立のバランスをとる別の方法を見つけるのに忙しい理由です。
gjain 14年

ええ、本質的にはい、2つのインフラストラクチャがあることは完璧なソリューションですが、残念ながらそれは妥当ではありません。私がコメントで述べたかったのは、TCPへのUDPヒットを過大評価しているということです。それが高い要因である場合、TCPが高速で機能する必要がある場合、人々はルーターでUDPを無効にするだけです(企業では時々そうします)。UDPパケットは、TCPよりも垂下する可能性が高いことにも注意してください。あなたの回答の残りの事実については、私は完全に同意し、それが非常に役立つと思いますが、特定の影響を過大評価していると思います。
IgorČordaš2014年

18

「何が速い」と言えば、少なくとも2つの非常に異なる側面があります。それは、スループットと待ち時間です。

スループットについて言えば、(他の回答で述べたように)TCPのフロー制御は非常に重要であり、UDPで同等のことを行うことは、確かに可能ですが、大きな頭痛の種です。その結果、スループットが必要なときにUDPを使用しても、(TCPよりも不当なアドバンテージを得たい場合を除き)良いアイデアと見なされることはめったにありません。

ただし、レイテンシについて言えば、全体が完全に異なります。パケット損失がない場合、TCPとUDPは非常によく似た動作をします(違いはあるとしても、限界です)-パケットが失われた後、パターン全体が大幅に変化します。

パケットが失われた後、TCPは再送信を少なくとも200ミリ秒待機します(RFC6298の段落2.4ごとに1秒ですが、実際の最新の実装では200ミリ秒に減少する傾向があります)。さらに、TCPを使用すると、宛先ホストに到達したパケットであっても、欠落したパケットが受信されるまでアプリに配信されません(つまり、通信全体が約200ミリ秒遅れます)。 -ラインブロッキングは、TCPまたは信頼性+順序付きUDPのいずれであっても、すべての信頼性のある順序付きストリームに固有です。さらに悪いことに、再送信されたパケットも失われた場合は、約600ミリ秒の遅延について話します(いわゆる指数バックオフのため、最初の再送信は200ミリ秒、2番目の再送信は200 * 2 = 400ミリ秒です)。私たちのチャネルのパケット損失が1%の場合(これは今日の標準では悪くありません)、また、毎秒20回の更新があるゲームがあります。このような600ミリ秒の遅延は、平均して8分ごとに発生します。そして、600ミリ秒はテンポの速いゲームであなたを殺すのに十分すぎるほどです-まあ、それはゲームプレイにとってかなり悪いです。これらの効果こそが、ゲーム開発者がTCPよりもUDPを好むことが多い理由です。

ただし、UDPを使用してレイテンシを削減する場合は、単に「UDPを使用する」だけではレイテンシを大幅に改善できないため、UDPをどのように使用しているかを理解することが重要です。特に、RUDPライブラリは通常、その「指数バックオフ」を回避し、再送信時間を短くしますが、「信頼性のある順序付けされた」ストリームとして使用する場合、ヘッドオブラインブロッキングの影響を受ける必要があります(したがって、二重の場合)パケット損失、その600msの代わりに約1.5 * 2 * RTTを取得します-またはかなり良い80ms RTTの場合、それは〜250ms遅延であり、これは改善ですが、それでも改善することは可能です)。一方、使用した技術はで説明している場合http://gafferongames.com/networked-physics/snapshot-compression/および/またはのhttp:// ithareを。 、Head-of-Lineブロッキングを完全に排除することができます(20更新/秒のゲームのダブルパケット損失の場合、RTTに関係なく遅延は100ミリ秒になります)。

そして、サイドノートとして-あなたは(あなたのクライアントがUDPをブロック醜いファイアウォールの6から9パーセントの一つの背後にある場合、ブラウザのように、または)のみTCPが、無UDPへのアクセス権を持って起こる場合-そこに思えるへの道であることをレイテンシをあまり発生させずにUDP-over-TCPを実装します。ここを参照してください:http : //ithare.com/almost-zero-additional-latency-udp-over-tcp/(必ずコメントも読んでください(!))。


13

各TCP接続では、データが送信される前に初期ハンドシェイクが必要です。また、TCPヘッダーには、さまざまな信号とメッセージ配信の検出を目的とした多くのオーバーヘッドが含まれています。メッセージ交換の場合、障害が発生する可能性が少しでもあれば、UDPで十分です。受信を確認する必要がある場合は、TCPが最適なオプションです。


失敗する可能性が低く、パケットサイズに制限があります。

11

@Andrew、私は違うと頼みました。UDPは、パフォーマンス要件のため、一部の種類のアプリケーションで選択されます。古典的な例の1つはビデオ会議です。この種のアプリケーションはTCP制御にうまく応答しません。

考慮すべき他の側面は、マルチキャストが必要になる場合です。その場合は、UDPを使用してください。


8
UDPも使用されます。これは、1つまたは2つのパケットを見逃した場合でも、おそらく手遅れであり、おそらくそれをスキップして次のステップに進んで視聴を続けることができるためです。いくつかのドロップされたパケットが原因でビデオに少しブリップが発生することは、大量の輻輳よりもはるかに優れています。
Kibbee 2009年

1
正解-ほとんどのルーターがネットワークをマルチキャスティングすることはまれです。
user1496062

8

まだ話されていない2つのIP間でネット上のメッセージをすばやくブラストする必要がある場合、UDPは少なくとも3倍、通常は5倍早く到着します。


1
参照はありますか?
ジェラール

8

はっきりさせておきます。 TCP / UDPは、2台の車が路上で運転されているということです。交通標識と障害物がエラーであると仮定しますTCPは交通標識を扱い、周りのすべてを尊重します。車に何かが起こる可能性があるため、運転が遅い。一方でUDPはちょうどオフに駆動し、フルスピードには道路標識に尊重していません。何も、狂った運転手。UDPにはエラー回復機能がありません。障害がある場合、UDPはそれに衝突して続行します。一方で、TCPはすべてのパケットが送信されると完全に受信されていることを確認し、ノー・エラーは、そう、車はちょうど衝突することなく障害物を渡します。これが、ゲームでUDPが推奨される理由を理解するための良い例であることを願っています。ゲームにはスピードが必要です。 ダウンロードではTCPが優先されるか、ダウンロードされたファイルが破損する可能性があります。


7

私の経験では、UDPは少し高速ですが、それほど高速ではありません。選択はパフォーマンスではなく、メッセージの内容と圧縮技術に基づいて行う必要があります。

メッセージ交換を伴うプロトコルの場合、TCPを使用した場合のわずかなパフォーマンスヒットは、それだけの価値があることをお勧めします。必要なすべてを提供する2つのエンドポイント間の接続が与えられます。自分がやっていることに本当に自信がない限り、UDPの上に信頼できる独自の双方向プロトコルを試して製造しないでください。


5

TCPは通常、複数のメッセージを送信し続けることに注意してください。これをUDPで実装したい場合、確実に実行したい場合は、かなりの作業が必要になります。ソリューションの信頼性が低下するか、速度が低下するか、作業量が信じられないほどになります。UDPの有効なアプリケーションはありますが、この質問をしている場合、おそらくそうではありません。


5

プログラマーが両方のメリットを享受できるようにするために、いくつかの作業が行われています。

SCTP

これは独立したトランスポート層プロトコルですが、UDPを介して追加の層を提供するライブラリーとして使用できます。通信の基本単位はメッセージです(1つ以上のUDPパケットにマップされます)。組み込みの輻輳制御があります。プロトコルには、スイッチを入れるためのノブとひねりがあります

  • メッセージの配信
  • ユーザー定義のパラメーターを使用した、失われたメッセージの自動再送信

特定のアプリケーションでこれが必要な場合。

これに関する1つの問題は、接続の確立が複雑である(したがって処理が遅い)ことです。

他の同様のもの

同じような独自の実験的なもの

これはまた、TCPのトリプルウェイハンドシェイクを改善し、高速回線をより適切に処理するように輻輳制御を変更しようとします。


3

ネットワークの状態を考慮せずにTCPまたはUDPについて話すことは無意味です。2点間のネットワークの品質が非常に高い場合、UDPはTCPよりも絶対的に高速ですが、GPRSネットワークなど他の場合では、TCPはUDPよりも高速で信頼性が高い場合があります。


1

ネットワークのセットアップは、あらゆる測定にとって重要です。ローカルマシンのソケットを介して、または世界の反対側と通信している場合、それは大きな違いを生みます。

ディスカッションに追加したい3つのこと:

  1. ゲーム開発のコンテキストでのTCPとUDPに関する非常に優れた記事がここにあります。
  2. さらに、iperfjperfはGUIを使用してiperfを強化します)は、測定によって自分の質問に答えるための非常に優れたツールです。
  3. 私はPythonにベンチマークを実装しました(このSO質問を参照)。UDPの場合、平均10 ^ 6回の反復で8バイトを送信する場合の差は約1〜2マイクロ秒です。

1
ベンチマークを実際のインターネットに関連させるには、netemなどのパケット損失シミュレーターでベンチマークを再実行する必要があります。それを正しく行うと(そして、たとえば100ミリ秒のシミュレートされたRTTと1%のシミュレートされたパケット損失で)、結果は大幅に異なります。つまり、TCPとUDPのレイテンシはパケット損失ゼロで実際には同じですが、損失パケットごとにA LOTが異なり始めます。
No-Bugs Hare
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.