概念
TCPはストリーム内のデータを処理するため、スティッキー/アンパックされたパケットが発生します。
-
開梱:TCPで送信するために、完全なパケットを複数のパケットに分割できます。
-
スティッキーパケット:小さなパケットを大きなパケットにカプセル化して送信することもできます。
理由
-
アプリケーションによって書き込まれたバイトサイズは、ソケット送信バッファーのサイズよりも大きく、アンパックが発生します。アプリケーションによって書き込まれたデータはソケットバッファサイズよりも小さく、ネットワークカードはアプリケーションによって書き込まれたデータをネットワークに複数回送信するため、パケットがスタックします。
-
送信するデータがMSS(最大メッセージ長)より大きい場合、TCPは送信前に解凍します。
-
イーサネットフレームのペイロードは、IPフラグメンテーションおよびアンパック用のMTU(デフォルトは1500バイト)よりも大きくなっています。
-
受信データ側のアプリケーション層が受信バッファ内のデータを時間内に読み取れない場合、スティッキーパケットが発生します。
解決する
Nettyでは、次のように複数のデコーダー解析クラスが提供されています。
-
①FixedLengthFrameDecoder、スティックおよびアンパック処理用の固定長メッセージに基づいています。
-
②長さFieldBasedFrameDecoder、スティックおよびアンパック処理のために指定されたメッセージヘッダーのメッセージ長に基づきます。
-
③LineBasedFrameDecoder、実行メッセージが付着して処理開梱に基づいてラインブレイク。
-
④DelimiterBasedFrameDecoder、スティックおよびアンパック処理のために指定されたメッセージ境界メソッドに基づきます。
実際、上記の4つのFrameDecoder実装は正規化できます。
-
①は②の特殊なケースであり、固定長はメッセージヘッダーでメッセージ長を指定する形式です。
-
③は④の特殊なケースであり、改行はメッセージ境界を指定する形式です。
本番環境では、カスタムプロトコルを介して処理されます。プロトコルの最初にstartTagフィールドがあり、最後にendTagフィールドがあります。