.net – 如何避免因2x反向代理网络中的非关闭套接字导致的端口耗尽?

我开发了一个名为
PortFusion的分布式反向代理.它的最初目标是通过防火墙建立长时间,最小开销,高吞吐量的TCP隧道,特别是对于RDP – 很少有长期连接.

现在,为了满足用户对安全性和帮助活动家的需求,我将其扩展到支持加密并支持大量短期连接.

网络:

          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属性,例如一个Hx从Firefox @Ax:1001接受的属性,将闭包传播到Cu用来与Squid通信的相应镜像套接字.

但他们总是保持联系!

>为什么Firefox套接字始终保持连接?
>一旦获得响应,Firefox不负责关闭它为HTTP请求打开的套接字吗?
>我是否还有其他外部触发器,我可以感知并用于关闭套接字?

关于公认答案的信息

使用套接字的Connected属性是错误的.按照接受的答案提示,我读了this postMSDN 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’属性指的是套接字,而不是连接.连接没有连接状态.它们是连接的,直到您在阅读时获得EOS,或在阅读或写入时获得错误.您应该传播的是EOS条件.您可以通过关闭下游套接字的输出在代理中执行此操作.您正在使用的代理基础产品应该已经完成​​了所有这些.

点赞