19

ブラウザとWebサーバー間のTCP接続を理解しようとしています。ローカルマシンでWebサーバーを実行していて、localhost:3000または127.0.0.1:3000を使用して、期待どおりにWebサーバーを正常に参照できます。(私は「rails」とWEBrickを実行しています。)

ブラウザとWebサーバーの間にソフトウェアの仲介をしたかったので、socatの実験を始めました。以下は問題なく動作します。

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

localhost:8080を参照でき、期待どおりに機能します。ただし、このように「、fork」引数を省略すると、

socat TCP-LISTEN:8080 TCP:localhost:3000

ローカルのRailsWebサイトは、ブラウザーで見るとかなり壊れています。

なぜそのフォーク引数が必要なのですか?ブラウザ<->Webサーバー接続がそれなしでは機能しないのはなぜですか?

4

1 に答える 1

37

がない場合forksocatは単一のTCP接続を受け入れ、その接続が開いたままである限り2つのエンドポイント間で双方向にデータを転送してから終了します。あなたはこれを自分で簡単に見ることができます:

  • socat1つのターミナルウィンドウで実行
  • 別のターミナルウィンドウでローカルホスト8080にTelnetで接続します。インスタンスに接続しsocatます。
  • 3番目のターミナルウィンドウでローカルホスト8080にTelnetで接続します。socat新しい接続をリッスンしていないため、接続拒否エラーが発生します。すでに取得している接続のサービスに移行しました。
  • 2番目のターミナルウィンドウにHTTPリクエストを入力します。HTTP応答を受け取り、socat接続が閉じられると終了します。

このforkオプションは、親が新しい接続の待機に戻る間に、新しく受け入れられた接続を処理するために新しい子をフォークするだけです。

socatプリフォークや接続プールなどのより洗練されたものではなく、を使用するfork()ことが、高性能ミドルウェアを実装したくない理由ですsocat

于 2012-03-08T17:16:06.613 に答える