Node.js HTTP/NET Разница между соединением и запросом

Этот вопрос касается общих концепций, связанных с протоколом tcp/ip, для которых уже есть хорошие ответы на So, но я надеюсь получить некоторое представление об особенностях http/net-библиотек node.js.

Экземпляр http-сервера node позволяет регистрировать обратные вызовы для двух типов событий: события «запрос» и события «подключение». Последний из них наследуется от сетевой библиотеки вместе с полем '_connections', которое подсчитывает количество одновременных подключений, которые в настоящее время имеет сервер.

Теперь мне кажется, что, поскольку http является протоколом без сохранения состояния, должно быть соответствие 1-1 между событиями запроса и соединения, но это не так. Проходя простой сервер «hello-world» в своем отладчике, я увидел, что количество событий запроса превышает количество событий подключения. Я также видел, что даже когда на сервер не поступали вызовы (и процесс не был приостановлен), поле .connections никогда не обнулялось. Почему количество запросов не равно количеству соединений, и почему сервер должен держать соединение открытым после последнего вызова response.end() (когда буфер ответа должен быть очищен и соединения завершены?).

Кроме того, как количество одновременных подключений для http-сервера (который ничего не делает с поддержкой активности) может быть больше 1? Разве запросы в основном не ставятся в очередь на сокете и не обрабатываются один за другим? Я понимаю, что Node асинхронный, но я также думал, что он ведет себя как однопоточный.

Заранее спасибо!


person Pseudo-Gorgias    schedule 03.09.2012    source источник
comment
Вы уверены, что поддержка активности не включена? Это по умолчанию в Node.js. Также помните, что в то время как запросы обрабатываются один за другим, асинхронные события могут переплетаться, что означает, что полный цикл запрос-ответ может не быть синхронным на 100%.   -  person Michelle Tilley    schedule 03.09.2012


Ответы (1)


HTTP не имеет состояния, но работает поверх TCP, который не имеет состояния.

Установив заголовок HTTP-запроса Connection: keep-alive, можно (и часто используется) сохранить базовое TCP-соединение открыто. Это оптимизация производительности, поскольку многократная установка и разрыв TCP-соединений может быть дорогостоящей. .

person Matt Ball    schedule 03.09.2012
comment
Спасибо за ответ - это, вероятно, объясняет то, что я видел. - person Pseudo-Gorgias; 03.09.2012