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

Pse*_*ias 7 javascript tcp http tcp-ip node.js

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

节点http服务器实例允许为两种类型的事件注册回调,'request'事件和'connection',event.其中后者继承自网络库,以及字段"_connections",它计算服务器当前具有的并发连接数.

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

另外,http服务器的并发连接数(对keep-alive没有任何作用)怎么会高于1?请求基本上没有在socket上排队并逐个处理?我知道Node是异步的,但我也认为它的行为是单线程的.

提前致谢!

Mat*_*all 8

HTTP是无状态的,但它通过TCP运行,而TCP不是无状态的.

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