networking - 速度 - ポート開放 tcp udp どっち




TCPの代わりにUDPを使用するのが適切なのはいつですか? (16)

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

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

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

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

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

私は、ストリームの作成と保守のオーバーヘッドがないため、UDPが高速であると想定していますが、一部のデータが宛先に到達しない場合は無関係でしょうか?


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


UDPは、アプリケーションが厳密なデータ複製ではなく「リアルタイム」データをより気にしている場合に使用できます。 たとえば、VOIPはUDPを使用することができ、アプリケーションはパケットの並べ替えを心配しますが、最終的にVOIPはすべての単一パケットを必要としませんが、もっと重要なのはそれらの多くの連続フローです。 たぶんここでは声質の「不具合」がありますが、主な目的はメッセージを受け取って相手側に完全に再現されないことです。 UDPは、接続の作成とTCPとの同期のコストがペイロードを上回る状況でも使用されます。 DNSクエリは完全な例です。 1つのパケットが1つのパケットに出力されます。 TCPを使用する場合、これははるかに集中的です。 あなたがDNSレスポンスを返さなければ、あなたはただ再試行します。


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


UDPはコネクションレスプロトコルであり、SNMP(シンプルネットワーク管理プロトコル)、DNS(Domain Name System)などのアプリケーションで使用されます。データパケットは不安定であり、信頼性が低く、データパケットの問題が直接送信されません。

UDPは接続確立を伴わないので、接続確立の遅延を避ける必要があるDNSのようなアプリケーションでは、UDPがTCPよりも優先されます。

ネットワークがストレス状態にあるとき、すなわち信頼性の高い輻輳制御されたデータ転送を達成することが困難なときに、ネットワーク管理としてSNMPで使用されることが多い。

乾杯


UDPはコネクションレスプロトコルなので、

  1. 簡単な要求 - 応答通信を必要とするプロセスに適しています。
  2. 内部流れ、エラー制御を有するプロセスに適している
  3. 幅広いキャスティングとマルチキャスティングに適しています

具体例:

  • SNMPで使用
  • RIPなどのいくつかのルート更新プロトコルに使用されます

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

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


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

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


ここには多くの良い答えがありますが、要約だけでなく重要な要素も追加したいと思います。 UDPは、 輻輳制御を採用していないため、正しいチューニングではるかに高いスループットを達成できます。 TCPにおける輻輳制御は非常に重要です。 接続の現在の容量を見積もり、ネットワークの輻輳を最小限に抑えるために、接続の速度とスループットを制御します。 パケットがコアネットワークなどの非常に信頼性の高いリンクを介して送信されても​​、ルータのサイズは制限されています。 これらのバッファはその容量までいっぱいになり、パケットは廃棄され、TCPは受け取った確認応答の欠如によってこの低下を認識し、接続の速度を容量の推定に抑えます。 TCPはスロースタートと呼ばれるものも使用しますが、スループット(実際には輻輳ウィンドウ )はパケットがドロップされるまでゆっくりと増加し、次に低下し、パケットがドロップされるまで徐々に増加します。 大きなファイルをダウンロードすると、これを明確に見ることができます。

UDPは輻輳制御を使用していないため、ドロップポイントまでバッファを最大限に活用しようとはしないため、遅延時間が短くなる可能性があります。つまり、UDPパケットのバッファ時間が短くなり、 UDPは輻輳制御を使用しないが、TCPはUDPを使用するため、TCPからUDPフローにつながる容量を奪うことができます。

UDPは依然として輻輳やパケットの破損に対して脆弱ですので、アプリケーションは再送信やエラー訂正コードを使用して、これらの損失をいくらか軽減するように準備する必要があります。

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

  • ネットワークのドロップ率がアプリケーションが処理できる限界内であれば、TCPより高いスループットを達成できます。
  • 遅延の少ないTCPよりも速くパケットを配信します。
  • 接続をセットアップするための初期ハンドシェイクがないので、接続をより速く設定する
  • マルチキャストパケットを送信しますが、TCPは複数の接続を使用する必要があります。
  • 固定サイズのパケットを送信しますが、TCPはセグメント内のデータを送信します。 300バイトのUDPパケットを転送すると、もう一方の端で300バイトが受信されます。 TCPを使用すると、送信ソケットに300バイトを送ることができますが、受信側は100バイトしか読み込まないため、何とか200バイト以上のバイト数があることがわかります。 これは、アプリケーションがバイトストリームではなく固定サイズのメッセージを送信する場合に重要です。

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


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

TCPは、完全かつ順序通りの配信を保証するため、キューの先頭をブロックします。したがって、パケットが転送中に失われた場合、欠落したパケットの再送信を待たなければなりませんが、UDPは到着時にパケットをアプリケーションに配信します(実際にはポート番号と(オプションで)ペイロードチェックサムが付加されたIPですが)電話には問題ありません。通常はどこにあるのでしょうか?わずか数ミリ秒のオーディオが欠落しても問題はありませんが、遅延は非常に厄介なので、再送信を気にせず、何回でも重複を取り除き、並べ替えられたパケットを数百ミリ秒間正しい順序で並べ替えますパケットが時間内に表示されない場合や、まったく表示されない場合は、単純にスキップされ、コーデックでサポートされている場合は補間が可能です。

また、TCPの大部分は、できるだけ多くのthrougputを得ることができるように、ネットワークを過負荷にすることなく、フロー制御が行われます(オーバーロードされたネットワークがパケットを破棄するため、 UDPは何も持っていません - テレフォニーのようなアプリケーションには理にかなっています。特定のコーデックを使用しているテレフォニーはある程度の帯域幅を必要とするため、 "遅くする"ことはできません。コールが速くなるわけではありません。

リアルタイム/低遅延アプリケーションに加えて、UDPは、TCP接続確立とティアダウンオーバヘッドを持たないという理由だけで、待ち時間と帯域幅の両方の観点から、DNSルックアップのような実際の小さなトランザクションには意味があります。 あなたの要求が典型的なMTUよりも小さく、おそらくrepsonseもあるなら、あなたは1回の往復で行うことができ、サーバ上で状態を保持する必要はなく、フロー制御と特に有用ではないものそのような用途のためにも。

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

また、SCTPとDCCPのようなUDPとTCP以上のものがあると言わざるを得ないでしょう。 唯一の問題は、(IPv4)インターネットがエンドユーザアプリケーションでUDPおよびTCP以外のプロトコルを使用することを不可能にするNATゲートウェイでいっぱいであることです。


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

スピードは非常に重要であり、各アップデートがプレーヤーが見ることができるものの完全な現在の状態が含まれているので、アップデートが見逃されてもそれほど重要ではありません。


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


我々は、数多くのPCに数千のwinformクライアントを持つWebサービスを持っています。 PCはDBバックエンドとの接続がなく、すべてのアクセスはWebサービスを介して行われます。 そのため、UDPポートをリッスンする中央ロギングサーバーを開発することにしました。そして、すべてのクライアントは、受け取ったDBテーブルにダンプされるxmlエラーログパケット(log4net UDPアペンダーを使用)を送信します。 いくつかのエラーログが失われていて、何千ものクライアントがあっても、メインのWebサービスをロードしていない専用のロギングサービスでは高速です。


既に述べたように、UDPはビデオやオーディオのようなストリーミングに適しています。パケットを失ってから再送して追いつく方が良い場合があります。

TCP配信の保証はありません。ソケットが切断されたかどうか、または基本的にデータが到着しないかどうかを伝えることになっています。 そうでなければ、そこに着くとそこに着きます。

人々が忘れる大きなことは、udpはパケットベースであり、tcpはバイトストリームに基づいているということです。あなたが送った "tcpパケット"が相手側に現れるパケットであるという保証はなく、多くのパケットに解読できますルータやスタックが望むように。 したがって、ソフトウェアでは、バイトを解析して使用可能なデータ・チャンクに戻すオーバーヘッドが増え、かなりのオーバーヘッドがかかる可能性があります。 UDPは故障している可能性がありますので、パケットに番号を付けるか、そうしたい場合にはパケットを再注文するために他のメカニズムを使用する必要があります。 しかし、そのudpパケットを取得した場合、同じバイトがすべて同じ順序で、変更なしで到着します。 つまり、udpパケットという用語は意味がありますが、TCPパケットは必ずしも必要ではありません。 TCPにはアプリケーションから隠された独自の再試行および順序付けメカニズムがあります。UDPを使用してそれを再作成してニーズに合わせて調整することができます。

基本的にポイントツーポイント接続を作成して維持する必要がないため、UDPは両端でコードを書く方がはるかに簡単です。 私の質問は、通常、TCPオーバーヘッドが必要な状況はどこですか? そして、もしあなたが受け取ったtcp "packet"が完全なパケットであると仮定するようなショートカットを取ったなら、あなたは良いでしょうか? (あなたが長さ/内容をチェックすることを迷惑を掛ければあなたは2つのパケットを捨てるでしょう)


私は、クライアントとサーバーの間のUDP(IP)とTCP / IP通信の両方をサポートする製品を開発しています。 IPXは15年以上前にIPのサポートを始めてから13年前に追加されました。 TCP / IPサポートは3、4年前に追加されました。 ワイルドな推測:TCP / UDPコード比はおそらく約80/20です。 製品はデータベースサーバーなので、信頼性が重要です。 UDP(パケットロス、パケットダブリング、パケット順など)が課している問題は、他の回答ですでに述べたすべての問題を処理する必要があります。 まれに問題はありませんが、時々発生するため、処理する必要があります。 UDPをサポートするメリットは、UDPを独自の用途に合わせて少しカスタマイズして、それをもう少し調整することができることです。

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

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

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


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





udp