19

我正在尝试了解浏览器和 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 网站在浏览器中看起来很糟糕。

为什么那个 fork 参数是必要的?没有它,为什么浏览器 <--> Web 服务器连接不能工作?

4

1 回答 1

37

如果没有fork,socat将接受单个 TCP 连接,只要该连接保持打开状态,就会在两个端点之间双向转发数据,然后退出。您可以自己轻松地看到这一点:

  • socat在一个终端窗口中运行
  • 在另一个终端窗口中 Telnet 到 localhost 8080。它连接到socat实例。
  • 在第三个终端窗口中 Telnet 到 localhost 8080。你得到一个连接被拒绝的错误,因为socat它不再监听新的连接:它已经开始为它已经得到的连接提供服务。
  • 在第二个终端窗口中键入 HTTP 请求。您将收到 HTTP 响应,然后socat在连接关闭时退出。

fork选项只是使它派生一个新的孩子来处理新接受的连接,而父母则回到等待新的连接。

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

于 2012-03-08T17:16:06.613 回答