【问题标题】:Node.js HTTP/NET -- Difference Between A Connection and A RequestNode.js HTTP/NET——连接和请求的区别
【发布时间】:2012-08-27 19:53:05
【问题描述】:

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

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

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

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

提前致谢!

【问题讨论】:

  • 你确定没有启用keep-alive吗?默认情况下它在 Node.js 中。另请记住,虽然请求是逐个处理的,但异步事件可能会交织在一起,这意味着完整的请求-响应周期可能不是 100% 同步的。

标签: javascript http node.js tcp tcp-ip


【解决方案1】:

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

通过设置HTTP request headerConnection: keep-alive,可以(并且经常使用)保持底层 TCP 连接打开。 This is a performance optimization,因为反复建立和拆除 TCP 连接的成本很高。

【讨论】:

  • 感谢您的回答——这可能解释了我所看到的。
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 2013-02-08
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多