PortFusionと呼ばれる分散リバースプロキシを開発しました。その最初の目標は、特にRDPのためのファイアウォールを介して、長期間、最小オーバーヘッド、高スループットのTCPトンネルを確立することでした。2xリバースプロキシネットワークでクローズしていないソケットによるポートの枯渇を回避するにはどうすればよいですか?
しかし、セキュリティに対するユーザーの要求に応え、活動家を助けるために、私は暗号化をサポートし、短命の接続をたくさんサポートするように拡張しています。
ネットワーク:
Hu 1000 <============ Cx 1000 Au
[ 1001 1001=Ax:1000
^ |
| |
| |
| v
Cu 1001 Au Hx 1000
Squid <----- 1001=Au:3128 [ 1001 <----- Firefox
Legend:
u you
x person x
A address
H PortFusionHost
[ hosted service
C PortFusionClient
< establish bidirectional link
= encrypted, secure, bidirectional link
- localhost-only, normal, bidirectional link
Notes:
- Squid as a forward HTTP proxy
- Connection between two parties (===) are secure and encrypted
- Cu is in complete control of what services are shared with Hx
- A single Hu and a single Cu can handle multiple persons x y z
質問:セットアップ上記のネットワークで
、私はソケットのConnected
プロパティをチェックし、例えば1 Hx
は、Ax:1001
@ Firefoxのから受け付けSquidと通信するために、Cu
によって使用される対応するミラーリングソケットにクロージャを伝播させる。
しかし、は常に接続されたままです!
- Firefoxのソケットは常に接続されたままですか?
- レスポンスを受け取ったHTTPリクエストに対して開くソケットをFirefoxが閉じるのは責任を負いませんか?
- 他の外部トリガーがありますが、私は閉鎖ソケットに感知して使用することができませんか?
ソケットのConnected
プロパティを使用して受け入れ答え
に関する情報が間違っていました。受け入れられた答えの先端に続いて、私はthis postとこれをMSDN articleと読みます。
以下に変更を加えたら、要求が完全に応答され、クロージャ伝播が期待どおりに機能するとすぐに両端がとなります。が通知されます。 (過去に存在し、最終的に非アクティブなソケットをクリアするに蹴る異なるメカニズムがいたが、それは十分に速くはなかった。)
コード(F#)と前:
try
request serverPort cl [||]
while transmitting && socket.Connected do
if socket.Available = 0
then Thread.Sleep Wait
else let length = read()
LogFlow "<:>" "Read" serverPort "<-" client length
request serverPort cl <| Array.sub buffer 0 length
with
コードの後:
try
request serverPort cl [||]
while transmitting && read() > 0 do
let length = !lengthR
LogFlow "<:>" "Read" serverPort "<-" client length
request serverPort cl <| Array.sub buffer 0 length
with
read
にはSocket.Receive
を呼び出し、lengthR
を呼び出します。
「Connected」の性質に関するあなたのヒントは、私が問題を解決するのを助けました!!私は関連する記事へのリンクと私が間違っていたことを質問で更新しています。 –