3

TCP セグメントの再構成について質問があります。パケットが複数のセグメントに分割される可能性があることを知りました (これは MSS と関係があります)。

ie) メッセージ フロー (仮定):

  1. クライアントは、アプリケーション層から渡されたパケットを送信します
  2. クライアント側の TCP 層で、パケットは 3 つのセグメントに分割されます。
  3. クライアントの IP 層に渡されるセグメント。
  4. サーバーの IP レイヤーがセグメントを受信します。
  5. サーバー側の TCP 層では、3 つのパケットを受け取り、1 つのパケットとして再構成します。
  6. サーバーのアプリケーション層は 1 つのパケットを受け取ります。

私の理解では、TCP レイヤーは、分割されたセグメントが再構築される場所です。私が間違っている場合は修正してください。

ここが私が本当に明確にしたいことです。

Netty を使用すると、サーバー側の「messageReceived()」メソッドが 1 回または 3 回だけ呼び出されますか? 分割されたセグメントを再構築する場所が TCP 層である場合、「messageReceived()」メソッドは 1 回だけ呼び出されますよね?

それでは、サーバーが受信するバイト数を保証するために「ReplayingDecoder」のようなものを使用することは本当に必要ですか?

よろしくお願いいたします。


追加の質問:

サーバーがセグメントの1つが失われたか何かのために再構築に失敗した場合、TCP層は不完全なパケットをアプリケーション層に渡しますか?

4

1 に答える 1

3

パケットは複数のセグメントに分割できます

逆さま、または悪い用語。TCP は、パケットに分割されたセグメントを送信し、途中でさらにサブパケットに分割される可能性があります。

私の理解では、TCP レイヤーは、分割されたセグメントが再構築される場所です。

パケットの再構成は、アプリケーション (または TCP 層) ではなく、IP 層で行われます。セグメントの再構成は TCP 層で行われます。

「messageReceived()」メソッドは 1 回または 3 回だけ呼び出されますか?

これは、1 から N までの任意の回数呼び出されます。ここで、N はバイト ストリームの長さです。送信者の送信と受信者の受信の間に 1::1 の対応が保証されているわけではありません。

サーバーがセグメントの1つが失われたか何かのために再構築に失敗した場合、TCP層は不完全なパケットをアプリケーション層に渡しますか?

絶対違う。TCP はパケットをアプリケーション層にまったく渡しません。そのままの、正しく順序付けられたバイト ストリームを渡すか、何も渡しません。

セグメントの再構築を自分で処理する必要があるかどうか疑問に思っています

あなたはそれを自分で処理することはできません。TCP は、セグメントやパケットではなく、バイト ストリームをアプリケーションに提供します。

于 2013-02-12T20:25:49.483 に答える