信頼できるUDPが必要な場合、何を使用しますか?


92

TCP接続が遅すぎる可能性があり、UDP「接続」が信頼性が高すぎる可能性がある状況がある場合、何を使用しますか?さまざまな標準の信頼できるUDPプロトコルが世の中にありますが、それらについてどのような経験がありますか?

返信ごとに1つのプロトコルについて話し合い、使用しているプロトコルについて他の誰かがすでに言及している場合は、それらを投票し、必要に応じてコメントを使用して詳しく説明することを検討してください。

ここでさまざまなオプションに興味があります。TCPはスケールの一端にあり、UDPはもう一方の端にあります。さまざまな信頼できるUDPオプションが利用可能であり、それぞれがTCPのいくつかの要素をUDPにもたらします。

多くの場合、TCPが正しい選択ですが、代替案のリストを用意しておくと、その結論に到達するのに役立ちます。UDPに基づいて構築されたEnetやRUDPなどには、さまざまな長所と短所があります。それらを使用したことはありますか、あなたの経験は何ですか?

疑いを避けるために、これ以上の情報はありません。これは架空の質問であり、決定を下す必要がある人が利用できるさまざまなオプションと代替案を詳述した回答のリストを引き出したいと思います。


1
この質問はテクノロジーを調査しているため、トピックから外れているようです
Dave Hillier '23 / 09/23

TCPがすべての場合に最適であると考える人は、次を読んでください。en.wikipedia.org
wiki

ウィキペディアには、UDP、UDP Lite、TCP、マルチパスTCP、SCTP、DCCP、およびRUDPのさまざまな側面を比較する優れた表があります。SCTPは、そのリストのほとんどの機能をサポートしています。
Eugene Beresovsky、2015

@EugeneBeresovsky私はSCTPについて少し調査しましたが、SOの回答を含むほとんどの情報は2013年以前の日付です。stackoverflow.com/questions/1171555/...
マイケルIV

@MichaelIvanov採用は確かに低いです。ただし、データセンター内で使用する場合は、スイッチやルーターが問題を引き起こさない限り(データセンターでは問題は発生しません)、OSを使用している限り、外部での導入を気にする必要はありません。リンクした質問の回答の1つで説明されているように、問題になる可能性があるライブラリサポート。
Eugene Beresovsky 2017

回答:


25

問題のドメインに関する追加情報なしにこの質問に答えることは困難です。たとえば、どのくらいの量のデータを使用していますか?どのくらいの頻度で?データの性質は何ですか?(例:一意であるか、1回限りのデータですか?それともサンプルデータのストリームですか?など)どのプラットフォーム用に開発していますか?(例:デスクトップ/サーバー/埋め込み)「遅すぎる」という意味を判断するために、どのネットワークメディアを使用していますか?

しかし、(非常に!)一般的な用語では、送信しようとしているデータについていくつかの困難な仮定を行うことができない限り、tcpに勝つために本当に一生懸命に努力する必要があると思います。

たとえば、送信しようとしているデータが単一のパケットの損失を許容できるものである場合(たとえば、サンプリングレートが信号の帯域幅より何倍も高い定期的にサンプリングされたデータ)、おそらくデータの破損を確実に検出できるようにすることで(たとえば、適切なcrcを使用して)、伝送の信頼性をある程度犠牲にします。

しかし、単一のパケットの損失を許容できない場合は、tcpがすでに持っている信頼性のための手法の種類を紹介し始める必要があります。そして、妥当な量の作業を行わずに、これらの要素を、それに伴う固有の速度問題のすべてを備えたユーザー空間ソリューションに構築し始めていることに気付く場合があります。


4
では、質問を調整します。「use TCP」応答よりも、さまざまな信頼性の高いUDPプロトコルの長所と短所にもっと興味があります;)
Len Holgate

9
@Andrew-2つのケースでTCPに勝るのは非常に簡単です。(1)アプリケーションには、「すべてのデータ、常に順序どおり、重複なし、過度のキューイングなし」よりも軽い信頼性要件があります。または、(2)マルチキャストを使用しています。信頼できるUDPは、マルチキャスト環境では非常に一般的です。
トム

4
また、TCPはWAN接続を介して使用されると、ひどく悪影響を受けます(長期的な問題)。なぜ、シンプルなのか。TCPは、ウィンドウ内のパケットが確認応答される必要があるウィンドウを使用します。ACKプロトコルは、回線距離による遅延のために影響を受けます。グーグル:WAN TCP「光の速度」
Ajaxx 09

3
@Ajaxx、あなたはこれに関して非常に正しいですが、最後のインターネットのメルトダウンのため、TCP / IPは意図的にこれを行います。輻輳制御なしで高ビットレートプロトコルを実行している場合、基本的には恥ずべきことです。あなたがネットワークを所有しているなら、ワイルドに行きましょう。
Kevin Nisbet、

2
「サンプリングレートがナイキストレートより大幅に高い場合」-定義により、サンプリングレートは常にナイキストレートの2倍です。
Steve

27

どのようなSCTP。IETF(RFC 4960)による標準プロトコルです。

チャンク機能があり、速度の向上に役立ちます。

更新:TCPとSCTP比較すると、 2つのインターフェースを使用できない限り、パフォーマンスは同等であることがわかります。

更新:素敵な紹介記事


それは良いことです。IPの上に構築するのではなく、UDPの上に構築できることにもっと興味がありますが、それは確かにソリューションスペースに適合するものです。
Len Holgate、

SCTPには多くの優れた機能(マルチホーミングなど)があり、部分的な信頼性拡張(RFC 3758)により、非常に柔軟なオプションです。これは最新のLinuxカーネルバージョンに含まれていますが、Windowsの場合は独自のSCTPスタックをインストールする必要があります。
Andrew Johnson、

6
SCTPはUDPを介してトンネリングできます。 tools.ietf.org/id/draft-ietf-sigtran-sctptunnel-00.txt
Miles

ありがとうMiles、それは便利なリンクです!
Len Holgate、

1
はい...しかし、UDPと同じレベルではなく、UDPの上に構築されたものは、少なくともWindowsでは、ユーザー空間での実装がより簡単になる可能性があります...
Len Holgate

21

ENET- http://enet.bespin.org/

私はENETを信頼性の高いUDPプロトコルとして使用し、サーバーでそれを使用している私のクライアント向けに非同期ソケットフレンドリーバージョンを作成しました。これはかなりうまく機能しますが、ピアツーピアpingが他の方法でアイドル状態の接続に追加するオーバーヘッドが好きではありません。たくさんの接続があり、それらすべてに定期的にpingを送信すると、忙しい作業になります。

ENETには、データの複数の「チャネル」を送信するオプションと、送信されるデータが信頼できない、信頼できる、またはシーケンス化されているオプションがあります。また、キープアライブとして機能する前述のピアツーピアpingも含まれます。


14

UDT(UDPベースのデータ転送)(http://udt.sourceforge.net/を参照)を使用していて、非常に満足している国防業界の顧客がいます。私はそれもフレンドリーなBSDライセンスを持っていると思います。


2
特に防衛部門で、顧客とその使用例について詳しく説明できますか?おそらくそうではありませんが、一見の価値はあります。私は実際、ファイル転送アプリケーションでUDTについて上司にアイデアを投げかけましたが、まだ実際にはどこにも行きませんでした。
Thomas Owens

10

RUDP- 信頼できるユーザーデータグラムプロトコル

これにより、以下が提供されます。

  • 受信パケットの確認
  • ウィンドウ処理と輻輳制御
  • 失われたパケットの再送信
  • オーバーバッファリング(リアルタイムストリーミングより高速)

キープアライブに関してはENetよりも少し構成しやすいように見えますが、それほど多くのオプションはありません(つまり、すべてのデータは信頼できるものであり、必要なビットだけでなく順序付けられています)。実装はかなり簡単に見えます。


私はこれを見ていましたが、多くの実装があるようには見えません。推薦を得ましたか?
ニコラス

いいえ、ごめんなさい。最終的にそれを使用することにはならなかったので、常にゼロから実装するつもりでした。
Len Holgate、2014

9

他の人が指摘したように、あなたの質問は非常に一般的であり、何かがTCPよりも「速い」かどうかは、アプリケーションのタイプに大きく依存します。

TCPは一般に、あるホストから別のホストへのデータの信頼性の高いストリーミングを実現するのと同じくらい高速です。ただし、アプリケーションがトラフィックの小さなバーストを大量に実行して応答を待機している場合は、遅延を最小限に抑えるためにUDPの方が適切な場合があります。

簡単な中間点があります。NagleのアルゴリズムはTCPの一部であり、大量のデータストリームの送信側が受信側を圧倒して、輻輳やパケット損失が発生しないようにするのに役立ちます。

TCPの信頼できる順序どおりの配信とUDPの高速応答が必要であり、大量のデータストリームの送信による輻輳を心配する必要がない場合は、Nagleのアルゴリズムを無効にできます。

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

私が言ったように、TCPがスケールの一方の端にあり、UDPがもう一方の端にあると仮定すると、他には何があります。
Len Holgate、2009

詳細な説明が必要な場合は、説明したプロトコルのほとんどがUDPに基づいて構築されています。
smo 2008

TCPが一方の端にあり、UDPがもう一方の端にあるという仮定は誤りです。たとえば、UDPにはフロー制御がないため、簡単にパケットを速く送信しすぎて、その間にあるルーターがすべてのパケットをドロップしてしまう可能性があります。その後、あなたは何をしますか?失われたパケットを無視するか、再送信しますか?それらを再送すると、多かれ少なかれTCPを再実装することになります。信頼できる通信のもう1つのオプションはSCTPです。
番号

1
高速応答は、必ずしも高スループットとは限りません。
Matt

1
同意しません。nagleが多数の小さいパケットを持つTCPベースのプロトコルで使用される場合、それらは一緒にマージされ、より大きなパケットが作成されます。送信に若干の遅延が発生するため、遅延がわずかに増える場合があります。ただし、パケットが多い=パケットヘッダーが多い=オーバーヘッドが大きいため、nagleをオフにするとスループットが低下する可能性があります。LANでドロップされるパケットは、通常、入力バッファーの充てんに関係しています。多数のクライアントが同じホストにデータを送信している場合、違いはない場合があります。nagleをオフにしてからオンにしても、実際には効果があるとは思いません。
Matt

8

上記のリストでは不十分であり、OWNの信頼性の高いUDPを開発したいと考える人は、Google QUIC仕様を確認する必要があります。これは、多くの複雑なコーナーケースと潜在的なサービス拒否攻撃をカバーしているためです。私はまだこれの実装を試していません。また、それが提供するすべてのものを望まない、または必要としないかもしれませんが、このドキュメントは、新しい「信頼できる」UDP設計に着手する前に読む価値があります。

QUICのためのポイントオフに良いジャンプがあり、ここを超えるクロムブログで、。

現在のQUIC設計ドキュメントはここにあります


4

TCP接続が遅すぎる可能性があり、UDP「接続」が信頼性が高すぎる可能性がある状況がある場合、何を使用しますか?さまざまな標準の信頼できるUDPプロトコルが世の中にありますが、それらについてどのような経験がありますか?

あなたの文のキーワードは「潜在的」です。プロトコルの信頼性が必要な場合は、TCPが実際にはニーズに対して遅すぎることを自分で証明する必要があると思います。

UDPから信頼性を引き出したい場合は、基本的にUDPの上にTCPの機能の一部を再実装することになります。これにより、最初からTCPを使用するよりも遅くなる可能性があります。


はい、Andrew Edgecombeも同じように言っていますが、私が言ったように、私はWHATの選択肢の賛否両論に興味があります。選択肢のリストとその長所と短所がなければ、何が最良かを判断するのは困難です。
Len Holgate、2009

既知の信頼性関数がある場合、UDPストリームを手動で調整して、OSのTCPストリームをしのぐことができます。まれですが。
ジョシュア

1
26の@ 17、私はLen Holgateに同意します。TCPは、状況によっては信頼できるUDPよりも遅くなります。高BDPネットワークと同様に、中国からニューヨークへの1 Gbpsのインターネット接続があるとすると、TCPは1 Gbpsの速度のほぼすべてを使用するのに適していると思います。TCPは、地上のほとんどの接続に適していますが、高帯域幅遅延製品を備えたネットワークには適していません。
nullptr 2014年


3

かもしれRFC 5405、「アプリケーションデザイナーのためのユニキャストUDPの使用上の注意事項は、」あなたのために有用であろう。


2

データの圧縮を検討しましたか?

上記のように、問題の正確な性質に関する情報はありませんが、データを圧縮して転送することで問題が解決する場合があります。


1
特に最近の圧縮ライブラリでは。一部はmemcpyと同じくらい高速です。例:lz4。
Matt


-3

UDPを使用して信頼性を実現する最良の方法は、アプリケーションプログラム自体に信頼性を構築することです(たとえば、確認応答と再送信のメカニズムを追加することにより)。

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