質問

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

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

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

多くの場合、TCP が正しい選択であることはわかっていますが、代替案のリストがあると、その結論に達するのに役立つことがよくあります。Enet、RUDP など UDP 上に構築されたものにはさまざまな長所と短所があります。使用したことがありますか。どのような経験がありましたか?

疑念を避けるために付け加えておきますが、これ以上の情報はありません。これは仮定の質問であり、意思決定を必要とする人が利用できるさまざまなオプションや代替案の詳細を示す回答のリストを引き出すことを期待したものです。

役に立ちましたか?

解決

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

しかし、(非常に!)一般的に言えば、送信しようとしているデータについて厳密な仮定ができない限り、速度で tcp に勝つにはかなりの努力が必要になると思います。

たとえば、送信しようとしているデータが 1 つのパケットの損失を許容できるようなものである場合 (例:定期的にサンプリングされたデータ(サンプリング レートが信号の帯域幅の何倍も高い場合)の場合は、データ破損(例:適切な crc の使用を通じて)

しかし、単一のパケットの損失を許容できない場合は、tcp がすでに備えている信頼性を高めるための技術の導入を開始する必要があります。そして、適切な量の作業を行わないと、固有の速度の問題をすべて抱えた状態で、これらの要素をユーザー空間ソリューションに構築し始めていることに気づくかもしれません。

他のヒント

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

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

アップデート:ある TCPとSCTPの比較 は、2 つのインターフェイスを使用できない限り、パフォーマンスが同等であることを示しています。

アップデート:ある 素敵な紹介記事.

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

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

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

当社には、UDT (UDP ベースのデータ転送) を使用している防衛産業の顧客がいます (「 http://udt.sourceforge.net/)とても満足しています。フレンドリーな BSD ライセンスも持っているようです。

ルドプ - 信頼性の高いユーザー データグラム プロトコル

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

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

キープアライブに関しては ENet よりも若干設定可能であるように見えますが、それほど多くのオプションはありません (つまり、すべてのデータは信頼性があり、順序付けされている必要があると判断したビットだけでなく、順序付けされています)。実装はかなり簡単そうです。

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

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

簡単な中間点があります。 ネーグルのアルゴリズム これは、送信者が大量のデータ ストリームで受信者を圧倒し、輻輳やパケット損失が発生しないようにする 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");

上記のリストでは十分ではないと判断し、信頼性の高い独自の UDP を開発したいと考えている人は、Google QUIC 仕様を必ず参照してください。これには、多くの複雑な例外ケースや潜在的なサービス拒否攻撃が含まれています。私はまだこれの実装を試していませんし、それが提供するものすべてが必要なわけではないかもしれませんが、新しい「信頼性の高い」UDP 設計に着手する前に、このドキュメントを読む価値は十分にあります。

QUIC の良い出発点は次のとおりです。 ここ, 、Chromium ブログをご覧ください。

現在の QUIC 設計ドキュメントはこちらからご覧いただけます ここ.

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

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

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

プロトコル DCCP、で標準化 RFC 4340, 「Datagram Congestion Control Protocol」があなたが探しているものかもしれません。

そうみたいです Linuxで実装される.

多分 RFC 5405, 「アプリケーション設計者のためのユニキャスト UDP 使用ガイドライン」が参考になります。

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

上で述べたように、問題の正確な性質に関する情報は不足していますが、データを圧縮して転送すると役立つ可能性があります。

RUDP. 。ゲーム用のソケット サーバーの多くは同様のものを実装しています。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top