Почему "вилка" требуется сотату при подключении к веб-серверу?

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

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

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

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

socat TCP-LISTEN:8080 TCP:localhost:3000

веб-сайт локальных рельсов в браузере довольно разбит.

Зачем нужен аргумент fork? Почему веб-сервер не работает без браузера?

Ответ 1

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

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

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

socat использование fork(), а не нечто более сложное, например, предпродача или объединение пулов, является причиной того, что вы не захотите внедрять высокопроизводительное промежуточное программное обеспечение с помощью socat!