-
test.html
<img src='/test1.jpg'>
<img src='/test2.jpg'>
<img src='/test3.jpg'>
<img src='/test4.jpg'>
<img src='/test5.jpg'>
<img src='/test6.jpg'>
<img src='/test7.jpg'>
-
server.js
const http = require('http');
const fs = require('fs');
http.createServer((req, res) => {
console.log('req come: ', req.url);
if(req.url === '/') {
const html = fs.readFileSync('test.html', 'utf8');
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(html);
} else {
const img = fs.readFileSync('test.jpg');
res.writeHead(200, {
'Content-Type': 'image/jpg'
});
res.end(img);
}
}).listen(8000, () => {
console.log('server is running on port 8000');
});
-
随便准备一张图片:test.jpg,启动程序 $ node server.js
-
访问:http://localhost:8000/
-
将浏览器模拟网络调整为较慢速的网络,设置Online -> Fast 3G
-
打开浏览器Network中的Connection ID
-
刷新页面,可以看到除了html页面的加载和第一张图片复用了一个ID
-
其他的5张图片都是不同的Connection ID,说明浏览器进行了6个并发请求
-
然后从Waterfall列(网络分时请求)中可见第7张图片是要等待的
-
等待请求传输完成后发现它复用了第一张图片的Connection ID
-
这就是TCP的并发
-
我们可以把长连接修改成短链接,修改程序示例:
const http = require('http');
const fs = require('fs');
http.createServer((req, res) => {
console.log('req come: ', req.url);
if(req.url === '/') {
const html = fs.readFileSync('test.html', 'utf8');
res.writeHead(200, {
'Content-Type': 'text/html',
'Connection': 'close'
});
res.end(html);
} else {
const img = fs.readFileSync('test.jpg');
res.writeHead(200, {
'Content-Type': 'image/jpg',
'Connection': 'close'
});
res.end(img);
}
}).listen(8000, () => {
console.log('server is running on port 8000');
});
-
重启程序并刷新浏览器后可发现,每一个Connection ID都是不同的,而且ID序号递增
-
这就是没有重复利用TCP的链接,每次请求后链接就会被关闭
-
我们在开发服务器时,可以合理利用这个Connection: Keep-Alive
-
可以给当前TCP链接设置一个自动关闭的时间,这是服务端的设置和HTTP协议没有太大关系
-
在HTTP2版本中, 有了一个信道复用的概念, 在TCP链接上可以并发的发送HTTP请求
-
这表示着我们在访问网站时,可以使用一个TCP链接就可以了,这样就可以极大的降低开销
-
可以打开谷歌网站查看HTTP2版本的使用,在同域下基本都是使用同一个Connection ID
-
此时,开销会被降至最低,而且速度有一个本质的提升
-
同时HTTP2有服务端自动推送的功能,此处不再赘述