Почему socat нужен «форк» при подключении к веб-серверу? - PullRequest
15 голосов
/ 07 марта 2012

Я пытаюсь понять TCP-соединения между браузером и веб-сервером. У меня есть веб-сервер, работающий на моей локальной машине, и я могу нормально просматривать его, как и ожидалось, используя localhost: 3000 или 127.0.0.1:3000. (Я использую "rails s" и WEBrick.)

Я хотел установить программное посредничество между браузером и веб-сервером и начал экспериментировать с socat. Следующее работает просто отлично:

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

Я могу перейти к localhost: 8080 и все работает как положено. Однако, если я опущу аргумент ", fork", например,

socat TCP-LISTEN:8080 TCP:localhost:3000

веб-сайт местных рельсов совершенно не работает, если смотреть в браузере.

Зачем нужен этот аргумент fork? Почему не работает браузер <-> подключение к веб-серверу без него?

1 Ответ

29 голосов
/ 08 марта 2012

Без fork, socat примет одно TCP-соединение, переадресует данные в двух направлениях между двумя конечными точками, пока это соединение остается открытым, а затем завершается.Вы можете легко это увидеть:

  • Запустите socat в одном окне терминала
  • Telnet к localhost 8080 в другом окне терминала.Он подключается к экземпляру socat.
  • Telnet к localhost 8080 в третьем окне терминала.Вы получаете сообщение об отказе в соединении, потому что socat больше не прослушивает новые соединения: он перешел к обслуживанию уже полученного.
  • Введите запрос HTTP во втором окне терминала.Вы получите HTTP-ответ, а затем socat выйдет, когда соединение будет закрыто.

Опция fork просто заставляет форка нового потомка обрабатывать вновь принятое соединение, покаparent возвращается к ожиданию новых подключений.

socat Использование fork(), а не что-то более сложное, такое как предварительная обработка или пул соединений, является причиной, по которой вы не захотите внедрять высокопроизводительное промежуточное ПО сsocat!

...