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

问题描述:

这个问题涉及tcp/ip协议的一般概念,对此已经有很好的答案,但我希望能够深入了解一些node.js http/net库的特殊性。Node.js HTTP/NET - 连接和请求之间的区别

节点http服务器实例允许为两种类型的事件,'请求'事件和'连接'事件注册回调。后者是从网络库继承而来的,同时还有一个字段'_connections',用于统计服务器当前拥有的并发连接数。

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

另外,http服务器的并发连接数(与keep-alive没有任何关系)的数量怎么会高于1?请求基本上不在socket上排队并逐个处理?我明白Node是异步的,但我也认为它是以单线程方式运行的。

在此先感谢!

+2

你确定保持活着没有启用?它在Node.js中是默认的。另请记住,虽然请求是逐个处理的,但异步事件可能会交织在一起,这意味着完整的请求响应循环可能不是100%同步的。 –

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

通过设置HTTP request headerConnection: keep-alive,它是可能的(并且经常使用的),以保持潜在的TCP连接打开。 This is a performance optimization,因为重复建立和拆除TCP连接可能是昂贵的。

+0

感谢您的答案 - 这可能解释了我所看到的。 –