Node.js HTTP/NET -- 连接和请求之间的区别。

8
这个问题涉及到TCP/IP协议的一般概念,对于这些概念,So上已经有了很好的回答,但我希望了解特定于node.js http/net库的细节。
一个节点http服务器实例允许为两种类型的事件注册回调函数,“请求”事件和“连接”事件。后者是从net库继承而来的,连同一个字段“_connections”,该字段计算服务器当前拥有的并发连接数。
现在,我认为由于http是一种无状态协议,应该存在请求和连接事件之间的一一对应关系--但事实并非如此。当我在调试器中执行一个简单的“hello-world”服务器时,我看到请求事件的数量多于连接事件。我还看到,即使没有任何调用被作用于服务器(而进程未暂停),.connections字段也永远不会归零。为什么请求数量不等于连接数量,为什么服务器保持连接开放,直到最后一次响应结束(响应缓冲区被清除并关闭连接)?
另外,一个不使用keep-alive的http服务器的并发连接数怎么可能超过1?请求基本上是在套接字上排队并逐个处理的吗?我知道Node是异步的,但我也认为它以单线程方式运行。
提前感谢!

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

9

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

通过设置 HTTP 请求头 Connection: keep-alive,可以保持底层的 TCP 连接处于打开状态。这是一种性能优化,因为重复建立和拆除 TCP 连接可能很昂贵。


谢谢你的回答 - 这可能解释了我所看到的。 - Pseudo-Gorgias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接