2016-05-04 4 views
0

インスタントメッセージング用にTCPの上に独自のアプリケーション層プロトコルを定義したとします。私はメッセージのパケット構造を使用しました。対称型(AES)と非対称型(RSA)の暗号化を使用しているので、さまざまなメッセージタイプに異なる パケットサイズを取得します。今私の質問に。アプリケーション層プロトコル - パケットのサイズが異なる

ソケットから1つのアプリケーション層パケットを受け取る方法は? 指定する必要があるサイズは?

ありがとうございます。

私は2つのアプローチを念頭に置いています。 TCPから

  1. 読むには 実際のパケットサイズを表しバイトの固定量をストリーミングし、最終的にストリームからバイトの元集まっサイズを再読み込み。

  2. ストリームから最大パケットサイズを読み取ります。得られたバイトの実際のサイズが であることを確認し、どのメッセージタイプであったかを決定します。

ここでは、より一般的な質問です。パケットサイズ、暗号化方法、受信者、送信者などのメタデータを提供する必要がありますか?はいの場合、これらのメタデータも暗号化する必要がありますか?

答えて

0

TCPを使用すると、ネットワークから読み取るときに、その時点で受け取ったバイト数が保証されないことに注意してください。つまり、クライアントはwrite()、しかしでフルパケットを送信する可能性があります。つまり、read()が同じバイト数を受け取るわけではありません。したがって、あなたのコードは、常にを読み取る必要があります。バイト数をネットワークから取得し、必要なバイト数を受け取ったことを(累積データに基づいて)確認してから、パケット(タイプ、内容、)そこから。

一部のアプリケーションでは、ネットワークデータの読み書きにステートマシンのエンコーダ/デコーダと固定サイズのバッファを使用しています。他のアプリケーションは、 "フルパケット"に十分な大きさのバッファを動的に割り当て、 "フルパケット"バッファがいっぱいになるまでネットワークからバイトを読み続ける。どのアプローチをとるかは、アプリケーションによって異なります。したがって、読み込みに使用するサイズは、コードが完全なパケットを受け取ることを保証する方法ほど重要ではありません。

脅威モデル(、つまりのプロトコルが守るべき脅威、プロトコルがクライアント/ユーザーに提供する必要がある保証)に応じて、追加のメタデータを暗号化する必要があるかどうかについては、より多くの文脈/詳細なしでその質問に答える簡単な方法はありません。

希望すると便利です。

+0

しかし、明確にするために、パケットサイズをメタデータとして事前に送信し、ペイロードを送信するのではなく実際のペイロードに分割するのが一般的ですか? – auermich

+0

パケットのサイズが可変であれば(多くの場合)、パケットサイズ(固定長の値)を「プレフィックス」として送信することは非常に一般的です。 _E.g._「最初の4バイトを次のパケットの長さを示すビッグエンディアン番号として読み取ってから、「バイト数を読み取ってから、パケットを解読/解析する」。 – Castaglia

+0

予想よりも少ないバイト数を受信した場合、またはヘッダー情報が不正な場合は、タイムアウト(クライアント側)に実行するか、サーバーからクライアントに明示的なエラーメッセージを送信することをお勧めしますか?ご協力いただきありがとうございます。 – auermich

関連する問題