2

私のアプリケーションは、ソケットの小さなメッセージを使用してネットワーク経由で送信します。各メッセージは約 200 バイトのデータです。データが 1 フレームではなく 2 フレームで送信されるようにしたいと思います。私の質問は

  1. それを行う方法、つまり TCP にバッファを 2 つのフレームに自動的に分割させる方法はありますか?
  2. バッファを 2 つの別々の書き込みで送信した場合、同じ結果が得られますか?

Linux と C を使用しています。

4

2 に答える 2

5

それを行う方法、つまり TCP にバッファを 2 つのフレームに自動的に分割させる方法はありますか?

TCP はストリーム通信プロトコルであり、すべてのデータは連続しています。データを区切り記号で分割する必要があります。

たとえば、HTTP プロトコルでは、分割された各リクエストは 2 つに分割されます\n

バッファを 2 つの別々の書き込みで送信した場合、同じ結果が得られますか?

いいえ、それらは 1 つの連続したデータ ストリームとして受信されます。フレームは無意味です。

注: アプリケーションでデータ TCP を受信する前に、パケットは分離されますが、OS はそれらを収集して再構築します。このプロセスはアプリケーションから透過的です。

于 2013-03-22T10:52:31.330 に答える
0

ここでは、考慮できるいくつかの事項を示します。

  1. TCP には、パケットに設定できるPSH フラグがあり、TCP がバッファリングされたデータをプッシュアウトします。しかし、理論的には、受信側でデータが再び結合される可能性があるため、これはやや信頼性に欠けます。ただし、実際には、データが個別に配信されることがわかります。
  2. "\n" はデータ内で自然に発生する可能性があるため、実際には区切り文字として使用できません。何らかのエスケープ シーケンスを使用して、データ内のすべての "\n" をエスケープする必要があります。これは痛みを伴うことがあります。
  3. メッセージ境界が必要な場合は、それをサポートするプロトコルを検討してください。UDPのように。ただし、UDP を使用すると、保証された配信が失われます。独自の確認、再試行などを行う必要があります。
  4. 最後にSCTPがあります。あまり使用されていないプロトコルですが、少なくとも Linux スタックで利用できます。それは両方の長所を提供します。メッセージの境界、配信の保証、シーケンスの保証。
于 2013-03-22T12:42:58.037 に答える