インスタントメッセージング用にTCPの上に独自のアプリケーション層プロトコルを定義したとします。私はメッセージのパケット構造を使用しました。対称型(AES)と非対称型(RSA)の暗号化を使用しているので、さまざまなメッセージタイプに異なる パケットサイズを取得します。今私の質問に。アプリケーション層プロトコル - パケットのサイズが異なる
ソケットから1つのアプリケーション層パケットを受け取る方法は? 指定する必要があるサイズは?
ありがとうございます。
私は2つのアプローチを念頭に置いています。 TCPから
読むには 実際のパケットサイズを表しバイトの固定量をストリーミングし、最終的にストリームからバイトの元集まっサイズを再読み込み。
ストリームから最大パケットサイズを読み取ります。得られたバイトの実際のサイズが であることを確認し、どのメッセージタイプであったかを決定します。
ここでは、より一般的な質問です。パケットサイズ、暗号化方法、受信者、送信者などのメタデータを提供する必要がありますか?はいの場合、これらのメタデータも暗号化する必要がありますか?
しかし、明確にするために、パケットサイズをメタデータとして事前に送信し、ペイロードを送信するのではなく実際のペイロードに分割するのが一般的ですか? – auermich
パケットのサイズが可変であれば(多くの場合)、パケットサイズ(固定長の値)を「プレフィックス」として送信することは非常に一般的です。 _E.g._「最初の4バイトを次のパケットの長さを示すビッグエンディアン番号として読み取ってから、「バイト数を読み取ってから、パケットを解読/解析する」。 –
Castaglia
予想よりも少ないバイト数を受信した場合、またはヘッダー情報が不正な場合は、タイムアウト(クライアント側)に実行するか、サーバーからクライアントに明示的なエラーメッセージを送信することをお勧めしますか?ご協力いただきありがとうございます。 – auermich