8

この質問は、tcp/ip プロトコルを取り巻く一般的な概念に関するものであり、So には既に適切な回答がありますが、node.js http/net ライブラリの特殊性について洞察を得たいと思っています。

ノードの http サーバー インスタンスでは、「要求」イベントと「接続」イベントの 2 種類のイベントにコールバックを登録できます。これらの後者は、サーバーが現在持っている同時接続の数をカウントするフィールド「_connections」とともに、ネット ライブラリから継承されます。

ここで、http はステートレス プロトコルであるため、要求イベントと接続イベントの間には 1 対 1 の対応が必要だと思われますが、そうではありません。デバッガーで単純な「hello-world」サーバーをステップ実行すると、要求イベントの数が接続イベントの数を上回っていることがわかりました。また、サーバーへの呼び出しが行われていない (そしてプロセスが一時停止していない) 場合でも、.connections フィールドがゼロになることはありませんでした。リクエストの数が接続の数と等しくないのはなぜですか?また、サーバーが response.end() への最後の呼び出しの後も接続を開いたままにしておくのはなぜですか?

また、HTTP サーバー (keep-alive では何もしない) の同時接続数が 1 よりも多くなる可能性はありますか? リクエストは基本的にソケットでキューに入れられ、1つずつ処理されませんか? Node が非同期であることは理解していますが、シングルスレッドで動作するとも思っていました。

前もって感謝します!

4

1 に答える 1

9

HTTPはステートレスですが、ステートレスではないTCPで実行されます。

HTTP リクエスト ヘッダー を設定するConnection: keep-aliveことで、基礎となる TCP 接続を開いたままにしておくことができます (そしてよく使用されます)。これはパフォーマンスの最適化です。TCP 接続はセットアップと切断を繰り返すとコストがかかる可能性があるためです。

于 2012-09-03T03:44:08.750 に答える