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

时间:2012-09-03 03:41:40

标签: javascript http node.js tcp tcp-ip

这个问题涉及围绕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是异步的,但我也认为它的行为是单线程的。

提前致谢!

1 个答案:

答案 0 :(得分:8)

HTTP是无国籍的,但它会在TCP上运行,而不是无国籍。

通过设置HTTP request header Connection: keep-alive,可以(并且经常使用)保持底层TCP连接打开。 This is a performance optimization,因为TCP连接的设置和重复拆卸费用可能很高。