26

クライアント/サーバー アプリケーションで、さまざまな長さのテキスト データがクライアントとサーバーの間で送受信される場合、送信されるパケットの末尾をどのようにマークすればよいですか? たとえば、サーバーがクライアントからパケット データを受信して​​いる場合、サーバーはクライアント パケットが完全に受信されたことをどのように認識しますか?

データの前に受信するパケットの全長をサーバーに伝えるのと、パケットの終わりをマークする何かを持っているのとのどちらがより一般的ですか?

送信されるデータの中には、数文字の長さしかないものもあれば、数千文字になるものもあります。

4

6 に答える 6

37

TCPは、データの継続的なストリームを提供します。TCPはパケットを使用して実装されますが、TCPの全体的なポイントはパケットを隠すことです。

描きたい壁のように考えてください。壁はレンガでできています。レンガをモルタルで接着し、漆喰を塗って壁面を滑らかにします。レンガはIPパケットであり、TCPは石膏です。

これで、滑らかな漆喰のTCPトンネルができたので、そこに構造を追加します。ボックスを描画して、描画が互いに分離されているようにします。これがあなたがしたいことです:あなたのデータに少しの「管理」構造(図面の周りのボックス)を追加すること。

多くのプロトコルはpacket、固定形式の管理ヘッダーで始まる一連のデータであるの概念を使用します。ヘッダーには、パケットの終了場所を決定するのに十分な情報が含まれています。たとえば、パケット長が含まれます。HTTPは、Content-Lengthヘッダーを使用して、または(HTTP / 1.1を使用して)データを1つまたは複数のミニパケットに分割する「チャンク転送エンコーディング」を使用してこれを行います。各ミニパケットには、正確にミニパケットの長さの指示で構成される単純なヘッダーがあります。

もう1つの方法は、「通常のデータ」には表示できない特別なターミネーターシーケンスを作成することです。データがテキストの場合、値ゼロのバイトをターミネータとして使用できます。

さらに別の方法は、自己終了データを使用することです。これは、要素の終わりに到達したかどうかをいつでも知ることができるように構造化されたデータです。たとえば、XMLデータは、などのマーカーのネストされたペアとして編成され<foo>...</foo>ます。終了マーカー(</foo>)に到達すると、要素が終了したことがわかります。

于 2010-03-05T21:46:10.327 に答える
4

先頭で長さをエンコードするとゴミに注意。たとえば、長さに 4 バイナリ バイトを使用し、一部の外部プローブが HTTP 要求を送信する場合、膨大な数になり、永遠に待機することになる可能性があります (プログラムをクラッシュさせる可能性のあるバッファーの割り当ては言うまでもありません)。異なる関数を使用してそれぞれの長さを 2 回送信し、それらを比較します (例: ~len と len xor 0x139AF321)。また、誰かが積極的にプログラムをクラッシュさせようとしている場合に備えて、最大値を設定する必要があります。長さが悪い場合は、接続を閉じます。

トラフィックが暗号化されている場合、これは HMAC を超えています。

于 2016-11-26T04:25:20.820 に答える
4

先頭に長さフィールドが含まれるようにパケットを構成します。

于 2010-03-05T20:36:07.303 に答える
4

HTTP からヒントを得てください。

文字のターミネータ シーケンスを使用するか、メッセージ ヘッダーのどこかに長さを指定するか、または両方をうまく組み合わせて使用​​します。

HTTP と同様に、ヘッダーは CR-LF-CR-LF で終わります。ヘッダーを超えるデータがある場合、データ長はヘッダーの 1 つにあります。

于 2010-03-05T20:40:45.290 に答える
3

送信者が長さを知っている場合、送信者は長さを固定サイズ フィールドとして事前に指定し、その後に可変サイズ データを指定する必要があります。

テール マーカーに対する利点は、受信側が予想されるデータ量に合わせて最適化できることです。たとえば、正しいサイズのバッファーを割り当てることができます。たとえば、TCP/IP プロトコルを介したストレージには、TCP/IP を介した同じ問題があります。そのような場合、ヘッダーは、その後に期待されるデータの長さを提供します。

後で、「ヘッダー」に入れる他のビットを見つけるかもしれません。独自のレイヤー 5 プロトコルを拡張するための構造が整っていることを嬉しく思います。

于 2010-03-05T22:03:42.117 に答える