这个问题涉及围绕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是异步的,但我也认为它的行为是单线程的。
提前致谢!
答案 0 :(得分:8)
通过设置HTTP request header Connection: keep-alive
,可以(并且经常使用)保持底层TCP连接打开。 This is a performance optimization,因为TCP连接的设置和重复拆卸费用可能很高。