相信每个接触过node的人,都写过类似的代码,启动一个最基本的http服务器:
var http = require('http')
http.createServer(function (req, res) {
res.send('hello world')
}).listen(8888)
想想这样一个场景,通常响应不是即时的,会有一定的阻塞,稍微改造一下上面的代码,延迟2秒返回响应:
http.createServer(function (req, res) {
setTimeout(function () {
res.end("hello world")
},2000)
}).listen(8888)
这样,如果通过浏览器访问127.0.0.1:8888,会发现两秒后页面才打印出hello world,与我们设想的一致。 以上是背景介绍,下面是我发现的几个问题:
- 如果这个时候,浏览器开多个标签页(假设十个),同时访问这个地址,那这十个不是并发处理的,而是按照先后顺序处理,也就是说第一个标签页得到helloworld之后,第二个标签页才开始处理…依次类推,第十个需要等待20s,而不是2s。 如果按照上面这个情况观察的话,每次只能处理一个请求,那如何并发呢?
- 但是这时候又发现,同一个标签页不停刷新,则停下刷新之后,只需要等待2s就能获取结果!如果按照上面的观察,那不停刷新时发出去的请求肯定还没处理完,那如何能做到停下刷新2s后就能获取结果呢?
- 这个时候又发现,如果我打开另一个浏览器b,不管a浏览器的请求是否完成,b浏览器无需等待a的请求是否完成,例如:a有十个标签页正在发请求,则需要20s才能处理完,此都但是此时b浏览器发请求,能两秒就能获取响应,这又是为什么呢?
我又考虑,会不会是和keep-alive响应头有关,毕竟平常也没怎么注意过这个响应头,然后尝试设置connection:close:
http.createServer(function (req, res) {
setTimeout(function () {
res.setHeader("connection","close")
res.end("hello world")
},2000)
}).listen(8888)
但是问题的表现依然和之前的一样,我觉得应该是有某个我不知道的知识盲点,想不通这个问题,还请指教