序文#
スティッキーパケットとは何ですか?なぜ発生するのですか?そして、どのように解決しますか?
1. スティッキーパケットとは何ですか#
- スティッキーパケットは、トランスポート層とアプリケーション層の間で発生します。これらは一つずつ転送されますが、TCP はこれらのデータを構造のないバイトストリームとして扱い、境界がありません。
- TCP のフレーム構造からわかるように、ヘッダにはデータの長さを示すフィールドがありません。
上記からわかるように、スティッキーパケットとは、1 つのデータパケットが 2 つのデータパケットの情報を含んでいる状態です。
受信側は 2 つのデータパケットを受信しますが、これらのパケットは不完全な場合がありますし、余分な部分が含まれている場合もあります。これがパケットの分割とスティッキーパケットの問題です。パケットの分割とスティッキーパケットの問題により、受信側は完全なデータパケットを区別することができません。
2. スティッキーパケットが発生する理由#
スティッキーパケット現象は、トランスポート層の TCP で発生します。
- 送信側でのスティッキーパケットの発生
クライアントとサーバーの間で TCP プロトコルを使用して長時間の接続を維持する場合(もちろん、最初の接続で最初のリクエストを送信する場合はスティッキーパケットは発生しません)、送信されるデータパケットが非常に小さい場合、TCP プロトコルはデフォルトで Nagle アルゴリズムを使用してこれらの小さなデータパケットを結合して送信します(バッファデータの送信はプッシュダウンのプロセスです);この結合プロセスは送信バッファで行われるため、データが送信されるとすでにスティッキーパケットの状態になっています。 - 受信側でのスティッキーパケットの発生
受信側が TCP プロトコルを使用してデータを受信するプロセスは次のようになります:データが受信側に到着し、ネットワークモデルの下部からトランスポート層に渡され、トランスポート層の TCP プロトコル処理はそれを受信バッファに配置し、アプリケーション層がアクティブに取得します。このときに問題が発生します。プログラムで呼び出すデータの読み取り関数がバッファ内のデータを適時に取り出せないため、次のデータが到着し、一部がバッファの末尾に追加されると、読み取りデータはスティッキーパケットになります。(データの配置速度 > アプリケーション層のデータ取得速度)
3. パケットの分割とスティッキーパケットの解決方法#
パケットの分割メカニズムには、一般的に 2 つの一般的な解決方法があります:
- 特殊文字の制御
- パケットのヘッダにデータパケットの長さを追加する。
Netty を使用する場合、パケットの分割とスティッキーパケットの問題を解決するための専用のエンコーダーとデコーダーがあります。
注意:UDP にはスティッキーパケットの問題はありませんが、パケットの損失と順序の乱れがあります。不完全なパケットは存在しませんが、受信したパケットはすべて正確なパケットです。データの送信単位プロトコルは UDP パケットまたはユーザーデータグラムであり、送信時には結合も分割も行われません。