パケットはフラグメント化され、順不同で到着する可能性があります。それらを受信する TCP スタックは、データを着信ストリームとしてアプリケーション層に提示する前に、それらをバッファリングして並べ替える必要があります。
私の問題は、同じパケット内のメッセージ 1 の終了後であるため、表示されないメッセージ B にあります。
「パケット」への 1 対 1 のマッピングを持つ「メッセージ」に依存することはできません。アプリケーションにとって、TCP (UDP ではない) は「ストリーミング」プロトコルのように見えます。
TCP 経由で送信するアプリケーションには、メッセージを分離する別の方法が必要です。場合によっては、各メッセージの終わりをマークすることでそれが行われます。たとえば、SMTPはメッセージの終わりを次のようにマークします。
メールメッセージの本文の送信は、DATA コマンドで開始され、その後、行ごとに逐語的に送信され、データの終わりのシーケンスで終了します。このシーケンスは、改行 ()、単一のピリオド (ピリオド)、およびそれに続く別の改行で構成されます。メッセージ本文にはテキストの一部としてピリオドのみを含む行を含めることができるため、クライアントは行がピリオドで始まるたびに 2 つのピリオドを送信します。それに応じて、サーバーは行頭の 2 つのピリオドのすべてのシーケンスを 1 つのピリオドに置き換えます。このようなエスケープ方法は、ドット スタッフィングと呼ばれます。
あるいは、プロトコルは各メッセージの開始時にプレフィックスを指定する場合があり、これはメッセージの長さをバイト単位で示します。
TCP スタックをコーディングしている場合は、 TCP メッセージ ヘッダーにアクセスできます。「データ オフセット」フィールドは、各メッセージの長さを示します。