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

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

节点http服务器实例允许为两种types的事件,“请求”事件和“连接”事件注册callback。 后者是从networking库inheritance而来的,同时还有一个字段“_connections”,用于统计服务器当前拥有的并发连接数。

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

另外,一个http服务器的并发连接数量(对keep-alive没有任何影响)如何高于1? 不要求基本上在sockets上排队,并逐个处理? 我明白Node是asynchronous的,但我也认为它是以单线程方式运行的。

提前致谢!

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

通过设置HTTP请求标头 Connection: keep-alive ,可以(并经常使用)保持底层TCP连接的打开状态。 这是一个性能优化 ,因为TCP连接的重复build立和拆除可能是昂贵的。