2012-03-07 78 views
11

我想了解瀏覽器和Web服務器之間的TCP連接。我有一臺運行在本地機器上的web服務器,可以按照預期使用localhost:3000或127.0.0.1:3000瀏覽它。 (我正在運行「rails s」和WEBrick。)爲什麼socat在連接到Web服務器時需要「fork」?

我想在瀏覽器和Web服務器之間放置一個軟件中介,於是開始嘗試使用socat。以下工作就好了:

socat TCP-LISTEN:8080,fork TCP:localhost:3000 

我可以瀏覽到localhost:8080,事情按預期工作。但是,如果我省略這樣的「,fork」參數,

socat TCP-LISTEN:8080 TCP:localhost:3000 

本地導軌網站在瀏覽器中顯得很破碎。

爲什麼fork參數是必需的?爲什麼瀏覽器< - > Web服務器連接沒有它的工作?

回答

23

如果沒有forksocat將接受單個TCP連接,只要該連接保持打開狀態,然後退出,就會在兩個端點之間雙向轉發數據。你可以看到這個自己輕鬆:

  • 運行在socat一個終端窗口
  • 的Telnet在另一個終端窗口爲localhost 8080。它連接到socat實例。
  • 在第三個終端窗口中Telnet到localhost 8080。您會收到拒絕連接的錯誤消息,因爲socat不再監聽新的連接:它已經開始維護已經獲得的連接。
  • 在第二個終端窗口中鍵入HTTP請求。您將得到一個HTTP響應,然後socat將在連接關閉時退出。

fork選項只是讓它分叉一個新的孩子來處理新接受的連接,而父母又回到等待新的連接。

socat的使用fork(),而不是像preforking或連接池更復雜的原因是你不想實現與socat高性能中間件!

+0

非常感謝Celada。這很有道理。 – user691307 2012-03-09 18:34:49

+0

我實際上想要做的是在瀏覽器和Web服務器之間編寫我自己的「in-between」程序。它打開到Web服務器的客戶端TCP連接,並在另一個端口上「偵聽」TCP服務器。瀏覽器打開一個到監聽端口的客戶端連接。所以在一個瀏覽器端,有一系列打開和關閉的TCP會話序列。但在Web服務器端,只有一個建立的TCP連接。那失敗了。我想我的自制軟件中介可以在每次客戶端啓動和停止TCP連接時關閉並重新打開Web服務器連接。聲音好嗎? – user691307 2012-03-09 18:50:56

+0

聽起來不錯,也是最簡單的事情。每次HTTP用戶代理都會打開一個到服務器的新連接,並且同時關閉它們。與解釋HTTP請求的內容相比,這樣做的工作量要少得多,以確定何時可以調整內容,以便將來自客戶端的多個連接聚合到一個連接到服務器的連接上。這種方式就是實現一個完整的HTTP代理服務器! – Celada 2012-03-10 15:46:05

相關問題