5

私が認識している 2 つの異なる TCP メッセージ フレーミング方法の長所と短所を調べています。

  1. Delimited: TCP ストリームは、区切り文字バイトを使用して、固定長でないメッセージに分割されます。データを送信するとき、ルーチンはデリミタのメッセージ データをチェックし、それをエスケープして、メッセージ フレームの安全な送信を保証する必要があります。データを受信するとき、ルーチンはフレームをメッセージに分割するために区切り文字バイトを探してストリームを読み取る必要があります。

例: ユーザー [ユーザー名]\nパスワード [パスワード]\n

  1. 長さのプレフィックス: TCP ストリームは、メッセージの長さを示すために、たとえば 4 バイトのプレフィックスを使用して、所定のサイズのメッセージに分割されます。データを受信すると、ルーチンは最初にプレフィックスを読み取り、メッセージ フレームの長さを決定します。データを送信するとき、ルーチンは送信前に長さプレフィックスをメッセージに追加する必要があります。

例: [MessageLength]User [ユーザー名][MessageLength]Password [Password]

これらの方法はどちらも、サイズが異なり、解釈されるバイトのストリームを含むメッセージ フレームの送信を可能にします。上位レベルのメッセージ構造またはプロトコルは関係ありません。


そのため、私はスケーラビリティとパフォーマンス効率に注意を向けています。ベンチマーク テストを実行して、メッセージ処理を伴わずに最大の効率スループットを得ることができる方法を確認する必要があることに気付きました。


私の現在の考えでは、私は決して専門家ではありません。

区切りメッセージ フレームは、ストリーム内の各バイトをチェックしてメッセージ フレーム区切り文字を確認する必要があるため、受信ルーチン中の効率が低下します。Length-Prefixed メッセージ フレームは、常にプレフィックス バイトを読み取り、残りのメッセージ フレーム ストリームは、メッセージ フレーム全体が受信されるまで、処理されずにバッファに直接送られます。

長さプレフィックス付きのメッセージ フレームは、メッセージ自体の前に送信されるメッセージ プレフィックスとして、送信ルーチン中の効率が低くなります。


私が考えることができる他の要因は次のとおりです。

  • 小さなメッセージ フレームが多数あると、Length-Prefixed 構造で送信されるパケットが多くなります。
  • デリミタをチェックするために各バイトが読み取られないため、Length-Prefixed 構造を使用すると、多くの大きなメッセージ フレームがはるかに効率的に処理されます。

このトピック全体の光は素晴らしいでしょう。TCP のメッセージ フレーム構造の違いに関する適切なリソースを見つけるのは非常に難しいと思います。

4

1 に答える 1

7

私の経験からすると、長さのプレフィックスが好まれ、メッセージの解析コードが書きやすくなる傾向があります。

さらに、メッセージの区切り文字を使用すると、メッセージ ペイロードに区切り文字が含まれている可能性がある場合、エスケープ スキームを理解する必要があります。

ペイロードに依存しない 3 番目のスキームに遭遇しました。既知の形式でさまざまなメッセージ タイプを定義します。メッセージのさまざまな部分は、固定長または可変長のいずれかです。(単純な型と変数は配列と文字列に固定されています)。構造はクライアントとサーバー間で事前に共有されます。メッセージを送信するとき、メッセージにはメッセージ タイプ番号がプレフィックスとして付けられます。メッセージ タイプ番号から、受信側はメッセージの解析方法を推測できます。
この例は、LysKOM メッセージング システムのプロトコルです。
このプロトコルには、パーサー コードの生成に使用できる正式な仕様があります。

于 2012-08-17T04:51:58.553 に答える