2012-09-03 16 views
6

To pytanie dotyczy ogólnych pojęć związanych z protokołem tcp/ip, dla których istnieją już dobre odpowiedzi na temat So, ale mam nadzieję uzyskać wgląd w szczególne cechy bibliotek http/net node.js.Node.js HTTP/NET - różnica między połączeniem a żądaniem

Węzeł instancji serwera HTTP umożliwia rejestrowanie wywołań zwrotnych dla dwóch typów zdarzeń, zdarzenia "żądanie" i zdarzenia "połączenie". Późniejsza z nich jest dziedziczona z biblioteki sieciowej wraz z polem "_connections", które zlicza liczbę równoczesnych połączeń, jakie aktualnie posiada serwer.

Teraz wydaje mi się, że ponieważ http jest protokołem bezstanowym, powinno być 1-1 do zgodności między zdarzeniami i zdarzeniami połączenia - ale tak nie jest. Podczas przechodzenia przez prosty serwer "helo-world" w debugerze zobaczyłem, że liczba zdarzeń żądań przewyższa liczbę zdarzeń związanych z połączeniem. Zobaczyłem również, że nawet jeśli nie było żadnych połączeń z serwerem (a proces nie został wstrzymany), pole .connections nigdy nie wyzeruje się. Dlaczego liczba żądań nie byłaby równa liczbie połączeń i dlaczego serwer utrzymywałby połączenie otwarte również po ostatnim wywołaniu funkcji response.end() (kiedy bufor odpowiedzi powinien zostać przepłukany, a połączenia zakończone?).

Ponadto, w jaki sposób liczba równoczesnych połączeń dla serwera http (który nie robi nic z utrzymaniem aktywności) nigdy nie będzie większa niż 1? Czy żądania nie są po prostu umieszczane w kolejce na gnieździe i przetwarzane jeden po drugim? Rozumiem, że Węzeł jest asynchroniczny, ale pomyślałem także, że zachowuje się w sposób jedno wątkowy.

Z góry dziękuję!

+2

Czy jesteś pewien, że funkcja keep-alive nie jest włączona? Jest domyślnie w Node.js. Pamiętaj również, że podczas przetwarzania żądań jeden po drugim zdarzenia asynchroniczne mogą być przeplatane, co oznacza, że ​​pełny cykl żądanie-odpowiedź może nie być w 100% synchroniczny. –

Odpowiedz

7

HTTP jest bezpaństwowcem, ale działa pod numerem TCP, który nie jest bezpaństwowcem.

Po ustawieniu HTTP request headerConnection: keep-alive możliwe jest (i często używane) utrzymanie otwartego połączenia TCP. This is a performance optimization, ponieważ połączenia TCP mogą być kosztowne w konfiguracji i wielokrotnym rozłączaniu.

+0

Dzięki za odpowiedź - to prawdopodobnie wyjaśnia, co widziałem. –

Powiązane problemy