8

这个问题涉及围绕 tcp/ip 协议的一般概念,So 上已经有很好的答案,但我希望能够深入了解 node.js http/net 库的特殊性。

节点 http 服务器实例允许为两种类型的事件注册回调,“请求”事件和“连接”事件。后者是从 net 库继承的,还有一个字段“_connections”,它计算服务器当前拥有的并发连接数。

现在,在我看来,由于 http 是一个无状态协议,请求和连接事件之间应该有 1-1 的对应关系——但事实并非如此。在我的调试器中单步执行一个简单的“hello-world”服务器时,我看到请求事件的数量超过了连接事件的数量。我还看到,即使没有对服务器进行调用(并且进程没有暂停),.connections 字段也永远不会归零。为什么请求数不等于连接数,为什么服务器会在最终调用 response.end() 后保持连接打开(当应该刷新响应缓冲区并且连接结束时?)。

此外,http 服务器的并发连接数(不使用 keep-alive 做任何事情)怎么会高于 1?请求基本上不会在套接字上排队并一一处理吗?我知道 Node 是异步的,但我也认为它以单线程方式运行。

提前致谢!

4

1 回答 1

9

HTTP是无状态的,但它运行在TCP上,它不是无状态的。

通过设置HTTP 请求标头 Connection: keep-alive,可以(并且经常使用)保持底层 TCP 连接打开。这是一种性能优化,因为反复建立和断开 TCP 连接的成本很高。

于 2012-09-03T03:44:08.750 回答