Tommy

Tommy

写代码是热爱,但也是生活 !
github

粘り付きパケットとは何ですか?なぜ発生するのですか?そして、どのように解決するのですか?

序文#

スティッキーパケットとは何ですか?なぜ発生するのですか?そして、どのように解決しますか?

1. スティッキーパケットとは何ですか#

  1. スティッキーパケットは、トランスポート層とアプリケーション層の間で発生します。これらは一つずつ転送されますが、TCP はこれらのデータを構造のないバイトストリームとして扱い、境界がありません。
  2. TCP のフレーム構造からわかるように、ヘッダにはデータの長さを示すフィールドがありません。

上記からわかるように、スティッキーパケットとは、1 つのデータパケットが 2 つのデータパケットの情報を含んでいる状態です。
受信側は 2 つのデータパケットを受信しますが、これらのパケットは不完全な場合がありますし、余分な部分が含まれている場合もあります。これがパケットの分割とスティッキーパケットの問題です。パケットの分割とスティッキーパケットの問題により、受信側は完全なデータパケットを区別することができません。

2. スティッキーパケットが発生する理由#

スティッキーパケット現象は、トランスポート層の TCP で発生します。

  1. 送信側でのスティッキーパケットの発生
    クライアントとサーバーの間で TCP プロトコルを使用して長時間の接続を維持する場合(もちろん、最初の接続で最初のリクエストを送信する場合はスティッキーパケットは発生しません)、送信されるデータパケットが非常に小さい場合、TCP プロトコルはデフォルトで Nagle アルゴリズムを使用してこれらの小さなデータパケットを結合して送信します(バッファデータの送信はプッシュダウンのプロセスです);この結合プロセスは送信バッファで行われるため、データが送信されるとすでにスティッキーパケットの状態になっています。
  2. 受信側でのスティッキーパケットの発生
    受信側が TCP プロトコルを使用してデータを受信するプロセスは次のようになります:データが受信側に到着し、ネットワークモデルの下部からトランスポート層に渡され、トランスポート層の TCP プロトコル処理はそれを受信バッファに配置し、アプリケーション層がアクティブに取得します。このときに問題が発生します。プログラムで呼び出すデータの読み取り関数がバッファ内のデータを適時に取り出せないため、次のデータが到着し、一部がバッファの末尾に追加されると、読み取りデータはスティッキーパケットになります。(データの配置速度 > アプリケーション層のデータ取得速度)

3. パケットの分割とスティッキーパケットの解決方法#

パケットの分割メカニズムには、一般的に 2 つの一般的な解決方法があります:

  • 特殊文字の制御
  • パケットのヘッダにデータパケットの長さを追加する。

Netty を使用する場合、パケットの分割とスティッキーパケットの問題を解決するための専用のエンコーダーとデコーダーがあります。

注意:UDP にはスティッキーパケットの問題はありませんが、パケットの損失と順序の乱れがあります。不完全なパケットは存在しませんが、受信したパケットはすべて正確なパケットです。データの送信単位プロトコルは UDP パケットまたはユーザーデータグラムであり、送信時には結合も分割も行われません。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。