博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
长连接及在Node中的应用——HTTP/1.1 keep-alive
阅读量:6501 次
发布时间:2019-06-24

本文共 2612 字,大约阅读时间需要 8 分钟。

HTTP请求都要经过TCP三次握手建立连接,四次分手断开连,如果每个HTTP请求都要建立TCP连接的话是极其费时的,因此HTTP/1.1中浏览器默认开启了Connection: keep-alive

请求头中的这个属性的作用可以在请求完成后,保持TCP连接一段时间而不关闭,如果这个期间又有HTTP请求的话,直接使用这个TCP连接,省去了建立新的连接的时间。由于是浏览器默认添加的,所以经常没有关注。接下来看下在Node服务中发起HTTP请求是什么样子。

let request = require('request');router.get('/http1', (req, res, next) => {    request({        method: 'GET',        uri: 'http://xxx:8887/xxx'    }, (error, response, body) => {        console.log('response', response);    });});复制代码

在Node中我们经常使用是request模块来发送HTTP请求,那么就做一个实验,先向这个8887端口发送请求,结束后再看下这个连接是否还在。

...

可以看到,请求完成后被请求的8887端口已经没有连接了。也就是,如果再次请求还需要建立TCP连接,那么就像浏览器一样在请求头中设置一下
Connection: keep-alive

request({    method: 'GET',    uri: 'http://xxx:8887/xxx',    headers: {        Connection: 'keep-alive'    }}, (error, response, body) => {    console.log('response', response);});复制代码

结果还是和上面一样,连接数还是0,翻看request的文档,原来并不是这么设置,而是使用forever这个配置

request({    method: 'GET',    uri: 'http://xxx:8887/xxx',    forever: true // 这个很重要 开启keep-alive}, (error, response, body) => {    console.log('response', response);});复制代码

这次,在请求结束后,8887端口还存在一个连接,
keep-alive已经生效了,这个连接会保持多久?一般在nginx中有设置,默认65s。
接下来看下,使用长连接后,是否省去了TCP的时间。
串行上面的请求10次来实验。

router.get('/http1', (req, res, next) => {    async function fn() {        for (let i = 0; i < 10; i ++) {            await new Promise((resolve, reject) => {                request({                    method: 'GET',                    uri: 'http://xxx:8887/xxx',                    time: true, // 配置这个属性可以看到时间信息                    forever: true                }, (error, response, body) => {                    console.log('timingPhases', response.timingPhases);                    resolve();                });            });        }        return 'success';    }    fn().then(()=>{        res.json({            msg: 'end'        });    });});复制代码

可以看到只有第一次的请求消耗了tcp的时间,之后的都是复用了之前建立的TCP连接,至于dns为0是因为没有使用域名。
以上就是在Node中如何使用
keep-alive及验证。
顺便看下,如果是并行请求,会建立多少个TCP连接呢?

router.get('/http1con', (req, res, next) => {    let promiseArr = [];    for (let i = 0; i < 10; i ++) {        let newP = new Promise((resolve, reject) => {            request({                method: 'GET',                uri: 'http://xxx:8887/xxx',                time: true,                forever: true            }, (error, response, body) => {                resolve();            });        });        promiseArr.push(newP);    }    Promise.all(promiseArr).then(() => {        res.json({            'msg': 'end'        });    });});复制代码

可以看到HTTP/1.1并行请求的时候会建立多个TCP连接,在浏览器中针对同一域名只可以同时建立6个连接,虽然Node中没有这个限制,但如何让多个同时的请求也使用同一个TCP连接呢?当然是有办法的,这就需要使用到HTTP/2.0中的单一长连接了,之后再来分析HTTP/2.0。

转载地址:http://qytyo.baihongyu.com/

你可能感兴趣的文章
POJ2478 Farey Sequence
查看>>
使用editcap命令将ERF格式转换为pcap格式
查看>>
Xcode 创建.a和framework静态库(转)
查看>>
解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/
查看>>
POJ1386 Play on Words
查看>>
bootstrap轮播如何支持移动端滑动手势
查看>>
python爬虫 智联招聘 工作地点
查看>>
使用hql动态创建对象问题
查看>>
Hadoop基础-网络拓扑机架感知及其实现
查看>>
运维开发笔记整理-前后端分离
查看>>
【OSX】build AOSP 2.3.7时的build error解决
查看>>
那些按烂的Linux命令集合贴
查看>>
MySQL 语句整理 2019-5-3
查看>>
html5新标签使用
查看>>
compass安装使用960 Grid System
查看>>
关于小数的精确运算
查看>>
20175203 2018-2019 实验五《网络编程与安全》
查看>>
Eureka服务注册中心
查看>>
轻松记账工程冲刺第二阶段10
查看>>
分离导航模块
查看>>