プロキシにおける不定サイズの応答の処理
クライアントとサーバー間でデータをプロキシしているときに、1 つの課題が発生します。サーバーが完全な応答を送信しました。 TCP 通信には個別のメッセージという固有の概念がないため、目的のデータがすべて受信されたことを識別するのが難しい場合があります。
メッセージの完了の指標として読み取りゼロを想定する方法には、潜在的に欠陥があります。 、小さじ1杯の例えでわかるように。読み取りサイズが 0 であるかどうかを常に確認すると、メッセージが完全に受信されたと早期に判断して、不完全な応答がクライアントに送信される可能性があります。
同様に、メッセージの EOF (End-of-File) に依存する場合も同様です。完了は信頼できません。 TCP は明確な EOF 指示を提供せず、その動作は基礎となるシステムと実装によって異なります。
サイズが不定の応答を処理する 1 つのアプローチは、プロキシ ループに遅延メカニズムを導入することです。各読み取り操作の前に短時間待機することで、プロキシはデータ バッファーを使い果たさず、完了を途中で判断することがなくなります。ただし、この方法は、すべてのシナリオで確実に実行できるわけではありません。特に、ネットワーク遅延が大きい場合や、サーバーが意図的にデータの送信速度を遅くしている場合には当てはまります。
別のアプローチは、より高いレベルのプロトコルまたはアプリケーション固有の知識を活用して定義することです。メッセージの境界。たとえば、サーバーが JSON や XML などの特定の形式で応答を送信する場合、プロキシは定義された構文に基づいてメッセージの終わりを識別できます。
デッドロックのリスク
提供されたコードは、クライアントとサーバーの両方の接続を処理するために単一のプロキシを使用しているため、デッドロックの潜在的なリスクが生じます。読み取りまたは書き込み操作中にクライアントとサーバーの両方の接続がブロックされると、プロキシ自体もブロックされ、デッドロック状況が発生します。
このリスクを軽減するには、通常、それぞれに別個の goroutine を使用することをお勧めします。メイン プロキシ ループのブロックを避けるための接続。
以上がプロキシはどのようにして不定サイズのサーバー応答を確実に処理できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。