Почему fork нужен socat при подключении к веб-серверу?

Я пытаюсь понять 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

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

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


person user691307    schedule 07.03.2012    source источник


Ответы (1)


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

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

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

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

person Celada    schedule 08.03.2012
comment
На самом деле я пытаюсь написать свою промежуточную программу между браузером и веб-сервером. Он открывает клиентское TCP-соединение с веб-сервером и прослушивает TCP-сервер на другом порту. Браузер открывает клиентское соединение с прослушиваемым портом. Таким образом, с одной стороны браузера существует последовательность нескольких сеансов TCP, которые открываются и закрываются. Но на стороне веб-сервера установлено только одно TCP-соединение. Это не удается. Я думаю, что мой доморощенный посредник может закрывать и снова открывать соединение с веб-сервером каждый раз, когда клиент запускает и останавливает соединение TCP. звук в порядке? - person user691307; 09.03.2012
comment
Звучит нормально, а также самое простое, что можно сделать. Ваш код открывает новое соединение с сервером каждый раз, когда это делает пользовательский агент HTTP, и одновременно закрывает их. Это намного меньше работы, чем интерпретация содержимого HTTP-запросов, чтобы выяснить, когда вы можете или не можете настроить содержимое для объединения нескольких соединений от клиента в одно соединение с сервером. Таким образом, реализуется полноценный HTTP-прокси-сервер! - person Celada; 10.03.2012
comment
Спасибо за объяснение. Означает ли это, что сокат с вилкой и трубопроводом для тройника в один файл будет забивать выходные данные? - person eigenfield; 24.02.2019