长连接及在Node中的应用——HTTP/1.1 keep-alive

news/2024/7/7 19:06:19

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://lihuaxi.xjx100.cn/news/235242.html

相关文章

iOS使用Charts框架绘制—饼状图

作者&#xff1a;jianshu_wl 原文地址&#xff1a;http://www.jianshu.com/p/45194d861b21 首先先看一下效果: 一、创建饼状图对象 创建饼状图对象用到类是PieChartView.h, 代码如下: self.pieChartView [[PieChartView alloc] init]; self.pieChartView.backgroundColor Bg…

iOS封装HTTPS双向和单向验证

1.HttpsUtil (1) 对双向和单向验证的封装 #import <Foundation/Foundation.h> #import "AFNetworking.h" interface HttpsUtil : NSObject // 双向认证 (void)configHTTPSessionManager:(AFHTTPSessionManager *)manager serverCers:(NSArray *) serverCerNam…

乐视云计算被列入失信名单;三星华为达成和解;Python3 采用率超 84%丨Q新闻

本周要闻&#xff1a;三星华为达成和解&#xff1b;乐视云计算被列入失信名单&#xff1b;小米宣布成立技术委员会&#xff1b;支付宝小程序向个人开发者开放公测&#xff1b;Flutter 1.2 发布&#xff1b;Python3 采用率超 84%&#xff1b;调查称最受雇主欢迎的语言是 Go&…

做一款仿映客的直播App?看我就够了

来源&#xff1a;JIAAIR 链接&#xff1a;http://www.jianshu.com/p/5b1341e97757 一、直播现状简介 1.技术实现层面&#xff1a; 技术相对都比较成熟&#xff0c;设备也都支持硬编码。IOS还提供现成的 Video ToolBox框架&#xff0c;可以对摄像头和流媒体数据结构进行处理&am…

OC封装时间选择器

#import <UIKit/UIKit.h> protocol TimeDatePickerViewDelegate <NSObject> //必须实现的两个协议 required - (void)changeTime : (NSDate *)date;//当时改变时出发 - (void)daterMine : (NSDate *)date;//更确定时间 end interface TimeDatePickerView :UIView /…

蓝桥杯 扑克序列(全排列)

扑克序列 A A 2 2 3 3 4 4&#xff0c; 一共4对扑克牌。请你把它们排成一行。要求&#xff1a;两个A中间有1张牌&#xff0c;两个2之间有2张牌&#xff0c;两个3之间有3张牌&#xff0c;两个4之间有4张牌。 请填写出所有符合要求的排列中&#xff0c;字典序最小的那个。 例如&a…

runLoop和runtime的分析

一.RunLoop: Runloop是事件接收和分发机制的一个实现。 Runloop提供了一种异步执行代码的机制&#xff0c;不能并行执行任务。 在主队列中&#xff0c;Main RunLoop直接配合任务的执行&#xff0c;负责处理UI事件、定时器以及其他内核相关事件。 (1).RunLoop的主要目的&#…

iOS弹幕(源码)实现原理解析

弹幕&#xff0c;国内流行于视频网站A站和B站。网上关于弹幕的实现方法有很多&#xff0c;目前Android平台已经有比较成熟的解决方案DanmakuFlameMaster 。而iOS平台尚无比较成熟的开源库&#xff0c;在借鉴DanmakuFlameMaster的实现思想后&#xff0c;特分享iOS平台弹幕解决方…