.net 在2x反向代理网络中,如何避免由于未关闭套接字而导致端口耗尽?
我正在开发一个分布式反向代理,名为。它最初的目标是通过防火墙建立长时间、最小开销、高吞吐量的TCP隧道,特别是对于RDP——很少的、长寿命的连接 不过现在,为了满足用户对安全性的需求和帮助活动家,我将其扩展到支持加密和支持大量短期连接 网络:.net 在2x反向代理网络中,如何避免由于未关闭套接字而导致端口耗尽?,.net,sockets,proxy,network-programming,reverse-proxy,.net,Sockets,Proxy,Network Programming,Reverse Proxy,我正在开发一个分布式反向代理,名为。它最初的目标是通过防火墙建立长时间、最小开销、高吞吐量的TCP隧道,特别是对于RDP——很少的、长寿命的连接 不过现在,为了满足用户对安全性的需求和帮助活动家,我将其扩展到支持加密和支持大量短期连接 网络: Hu 1000 <============ Cx 1000 Au [ 1001 1001=Ax:1000 ^
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
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
后面的代码:
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
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
试试看
请求服务器端口cl[||]
传输时(&&read()>0 do)
让长度=!长度
LogFlow“”读取“serverPort”许多HTTP请求都是在启用了保持活动状态的情况下完成的,因为您可能知道建立TCP连接需要花费大量时间。任何浏览器都可以这样做,而不仅仅是Firefox
如果套接字长时间处于打开状态,我不会感到惊讶,只要它们在Firefox关闭时关闭。它们是这样的,不是吗?connected属性指的是套接字,而不是连接。CononActions没有连接状态。它们是连接的,直到您在读取时获得EOS,或者在读取或写入时出现错误。什么您应该在EOS条件下进行传播。您可以通过关闭下游套接字的输出在代理中进行传播。您正在使用的代理基础产品应该已经完成了所有这些工作。是吗?嗯,让我检查一下。顺便说一句,面对保持活动状态,我如何处理端口耗尽问题?对于单个PC/机器,端口数不会超过2或3个(默认情况下)每个服务器/站点的连接都保持打开状态。通过这种方式很难接近限制-但如果有100个用户,显然要容易得多。HTTP代理将是控制它的一种方式;在发送响应后,您可以简单地终止连接。或者干脆不支持保持活动状态。这将迫使浏览器手动操作。PortFusion也被设计成不了解协议。我不想让不同的代码处理各种协议的不同行为而弄脏它。我可以让感兴趣的插件开发人员在绝对最坏的情况下使用钩子。不过,在这之前,我想先学习/找到并尝试解决方案不要只针对一个协议。感谢您提供有关“保持活力”
的提示!您关于“已连接”的性质的提示帮助我解决了问题!!我正在通过相关文章的链接更新问题,以及我做错了什么。