2

理論的には、SOCK_DGRAM で TCP ソケットを使用することを妨げるものは何もありません。得られるのは、信頼できるデータグラム転送です。バークレーソケットを使用してこれは可能ですか?

4

6 に答える 6

6

注目したいのはSCTP Protocolです。信頼できる TCP スタイルの接続を介してデータグラムを送信する機能を提供します。

TCP とは対照的に、SCTP はレコード指向として特徴付けられる場合があります。つまり、ユーザー データグラム プロトコル (UDP) と同様の方法でメッセージの観点からデータを転送するため、1 回の送信操作でバイト (メッセージ) のグループが送信されます。 (レコード) は、受信側アプリケーションでそのグループとまったく同じように読み取られます。TCP はストリーム指向で、バイトのストリームを転送し、順不同の配信の場合に正しく並べ替えます。ただし、メッセージの境界、つまり送信側での元の伝送単位に関するデータの構造は考慮されません。

おそらくあなたが探している SCTP 1 対 1 スタイルの接続を見てください。

ほとんどの Unix / Linux OS 用の実装があり、Windows 用のサード パーティの実装があります。詳細については、リンクした Wiki 記事の最後を参照してください。

于 2010-04-10T19:29:19.663 に答える
3

タイプとしての SOCK_DGRAM は、UDP ソケットを取得します。もちろん、TCP で UDP をカプセル化できますが、ユーザー空間で UDP 部分を処理する必要があります。何かが信頼できるかどうかは、ネットワーク上のプロトコルに依存します。TCP を使用すると信頼性が高くなります。UDP ではありません。

UDP ソケットを作成するには:

int s;
s = socket(AF_INET, SOCK_DGRAM, 0);

TCP ソケットを作成するには:

int s;
s = socket(AF_INET, SOCK_STREAM, 0);

データの個別のチャンクをネットワーク経由で送信するには、2 つの一般的な方法があります。UDP を使用して個別のチャンクをデータグラムとして送信することも、TCP データに構造化してストリームとして送信することもできます。一般に、TCP を使用する方が簡単で、失敗する可能性が低くなります。UDP を使用している場合は、タイムアウトして、取得するまで同じデータを要求し続けます。

于 2010-04-09T13:18:05.970 に答える
1

理論的には、SOCK_DGRAM で TCP ソケットを使用することを妨げるものは何もありません。得られるのは、信頼できるデータグラム転送です。バークレーソケットを使用してこれは可能ですか?

いいえ、Berkeley API は信頼できないデータグラムまたは信頼できるストリームを提供します。

TCP 経由で信頼できるチャンクを送信する場合は、ストリームをチャンクに分割するプロトコルを使用します。それはとても簡単です。

于 2010-04-09T13:24:49.680 に答える
0

このオプションを提供するソケット API は見たことがありません。また、データの配置を制御できるようにするという TCP の目的の一部が無効になります。TCP は単なるトランスポートであり、その抽象化はバイト ストリームです。

アプリケーション層が気にするメッセージの概念を提供する、TCP の上に独自のメッセージ構造を構築する必要があります。

于 2010-04-10T19:42:14.197 に答える
0

あまり。TCP と UDP は同じ層のプロトコルであり、それらにのみ意味のある機能を持っています。たとえば、listen() と accept() を見てみましょう。

TCP パケット内で UDP ヘッダーとデータを送信できますが、まったく意味がありません。どうしてそうするか?トンネリングの一種?実際、UDP パケットを手動で解析して構築するのは非常に簡単ですが、あなたのシナリオでは実際のアプリケーションが見当たりません。

于 2010-04-09T13:20:33.657 に答える
-1

物事をシミュレートすることはできますが、実際にそうする理由はありません。確実な配送を希望するか、タイムリーな配送を希望するかのいずれかです。TCP は最初のものを提供し、UDP は 2 番目のものを提供します。TCP は、確認応答されるまでメッセージについて相手側に繰り返し伝えることで信頼性を実装しているため、この 2 つを混在させることはできません。ストリーミングの場合、通常は信頼性の高いデータ配信が必要ですが (ストリームを再構築できるようにするため)、順序が重要ではない小さなメッセージ (データグラムなど) の場合は、そのようなオーバーヘッドは必要ありません (UDP は、メッセージが少なくとも文字化けして到着することはありません; これは、TCP と UDP の両方が生の IP を介して提供するものの 1 つです)。

もちろん、これらの両極端の間には他にも興味深いケースがいくつかあります。リアルタイム ストリーミング データ (ビデオ通話など) の場合、ストリーミングしているためRTPを使用しますが、遅延よりもデータ損失から回復することができます。UDP には大きすぎるメッセージ (UDP ヘッダーの長さフィールドは 16 ビットしかないため、厳密な上限は 64kB です) の場合は、フラグメントを再構築できるように、転送に TCP を使用する必要があります (したがって、 SOAP は、UDP 経由ではなく、HTTP 経由で TCP 経由で送信されます)。

于 2010-04-10T20:10:51.027 に答える