Tcp 为什么是;叉子;socat在连接到web服务器时需要什么?

Tcp 为什么是;叉子;socat在连接到web服务器时需要什么?,tcp,webserver,socat,Tcp,Webserver,Socat,我试图了解浏览器和web服务器之间的tcp连接。我在本地机器上运行了一个web服务器,可以像预期的那样使用localhost:3000或127.0.0.1:3000浏览到它。(我正在运行“rails s”和WEBrick。) 我想在浏览器和web服务器之间放置一个软件中介,因此开始试验socat。以下几点效果不错: socat TCP-LISTEN:8080,fork TCP:localhost:3000 我可以浏览到localhost:8080,一切正常。但是,如果我像这样省略“fork”参

我试图了解浏览器和web服务器之间的tcp连接。我在本地机器上运行了一个web服务器,可以像预期的那样使用localhost:3000或127.0.0.1:3000浏览到它。(我正在运行“rails s”和WEBrick。)

我想在浏览器和web服务器之间放置一个软件中介,因此开始试验socat。以下几点效果不错:

socat TCP-LISTEN:8080,fork TCP:localhost:3000
我可以浏览到localhost:8080,一切正常。但是,如果我像这样省略“fork”参数

socat TCP-LISTEN:8080 TCP:localhost:3000
本地rails网站在浏览器中的外观非常糟糕


为什么有必要这样争论?为什么浏览器web服务器连接没有它就不能工作?

如果没有
fork
socat
将接受单个TCP连接,只要该连接保持打开,就在两个端点之间双向转发数据,然后退出。你可以很容易地看到这一点:

  • 在一个终端窗口中运行
    socat
  • Telnet到另一个终端窗口中的本地主机8080。它连接到
    socat
    实例
  • 在第三个终端窗口中Telnet到本地主机8080。您会收到一个连接被拒绝错误,因为
    socat
    不再侦听新的连接:它已转到为已获得的连接提供服务
  • 在第二个终端窗口中键入HTTP请求。您将得到HTTP响应,然后当连接关闭时,
    socat
    将退出
fork
选项只会使它分叉一个新的子节点来处理新接受的连接,而父节点返回等待新连接


socat
使用
fork()
而不是像预处理或连接池这样更复杂的东西,这是您不想用
socat
实现高性能中间件的原因

我实际上想做的是在浏览器和web服务器之间编写自己的“中间”程序。它打开与web服务器的客户端TCP连接,并在另一个端口上打开“侦听”TCP服务器。浏览器打开到侦听端口的客户端连接。因此,在一个浏览器端,有一系列打开和关闭的多个TCP会话。但是在web服务器端,只有一个已建立的TCP连接。这是失败的。我认为我的自制中介可以在每次客户端启动和停止tcp连接时关闭并重新打开web服务器连接。听起来不错?听起来不错,也是最简单的事情。每次HTTP用户代理打开到服务器的新连接时,您的代码都会打开,同时也会关闭它们。这比解释HTTP请求的内容要少得多,以确定何时可以或不可以调整内容以将多个连接从客户端聚合到一个连接到服务器。这样就实现了一个成熟的HTTP代理服务器!谢谢你的解释。这是否意味着将带有分叉和管道的socat连接到单个文件将破坏输出?