关于HTTP1.1的长连接

HTTP是一个构建在传输层的TCP协议之上的应用层的协议,在这个层的协议,是一种网络交互需要遵守的一种协议规范。 HTTP1.0的短连接HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。这个过程大概可以描述为:1、建立连接:首先DNS解析过程。如把域名变成一个ip,如
摘要由CSDN通过智能技术生成

HTTP是一个构建在传输层的TCP协议之上的应用层的协议,在这个层的协议,是一种网络交互需要遵守的一种协议规范。

 

HTTP1.0的短连接

HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。这个过程大概可以描述为:

1、建立连接:首先DNS解析过程。如把域名变成一个ip,如果url不包含端口号,则会使用该协议的默认端口号,HTTP协议的默认端口号为80。然后三次握手建立一个TCP连接;

2、请求:连接成功后,开始向web服务器发送请求,这个请求一般是GET或POST请求。

3、应答:web服务器收到这个请求,进行处理。web服务器会把文件内容传送给响应的web浏览器。包括:HTTP头信息,体信息。

4、关闭连接:当应答结束后,web浏览器与web服务器必须四次握手断开连接,以保证其它web浏览器能够与web服务器建立连接。

 

HTTP1.1的长连接

但是HTTP1.1开始默认建立的是长连接,即一旦浏览器发起HTTP请求,建立的连接不会请求应答之后立刻断掉。

 

1、 一个复杂的具备很多HTTP资源的网页会建立多少TCP连接,如何使用这些连接?

2、 已经建立的TCP连接是否会自动断开,时间是多久?

 

对于第一个问题。现在浏览器都有最大并发连接数限制,应该说如果需要,就会尽量在允许范围内建立更多的TCP持久连接来处理HTTP请求,同样滴,一个TCP持久连接可以不断传输多个HTTP请求,但是如果上一个请求的响应还未收到,则不能处理下一个请求(Pipeling管道技术可以解决这个问题从而进一步提升性能),所以说很多浏览器其实都可以修改允许最大并发连接数以提升浏览网页的速度。

 

对于第二个问题。问题在于服务器端对于长连接的实现,特别是在对长连接的维护上。FTP协议及SMTP协议中有NOOP消息,这个就可以认为是心跳报文,但HTTP协议没有类似的消息,这样服务器端只能使用超时断开的策略来维护连接。设想超时时间非常短,那么有效空闲时间就非常短,换句话讲:一旦链路上没有数据发送,服务器端很快就关闭连接。

也就是说其实HTTP的长连接很容易在空闲后自动断开,一般来说这个时间是300s左右。

 

 

参考资料

=====================================================================

1、HTTP1.1提升性能的手段

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Saviio
链接:http://www.zhihu.com/question/36469741/answer/67608570
来源:知乎

HTTP1.1里大概规范了几项提高性能的手段:

  1. 持久连接 (keep-alive/persistent connection)
  2. 并行连接
  3. Pipelining

第一点之前已经说过了,所以不表。

第二点,由于现代网页通常包含了复数个(>=10)资源,而按照默认设定,一个连接中的每一个请求必须等待收到响应后才能发送下一个请求,所以如果复数的资源请求全部在一个连接one by one发送给服务器显然会很慢,而为了弥补这一缺陷,浏览器通常会默认开启多个TCP连接,然后再根据每个连接的状态在其中依次发送数据请求,而且客户端有权任意关闭超发的连接。各个浏览器允许的并行连接数大致是这样的(From SO):

Firefox 2:  2

Firefox 3+: 6

Opera 9.26: 4

Opera 12:   6

<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个 HTTP/1.1 长连接的前后端示例: 前端(JavaScript): ```javascript // 创建一个 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 打开一个 GET 请求,指定 URL 和是否使用异步请求 xhr.open('GET', '/api/data', true); // 设置 HTTP 头部,指定请求的数据类型 xhr.setRequestHeader('Accept', 'application/json'); // 监听请求状态的变化 xhr.onreadystatechange = function() { // 判断请求是否完成 if (xhr.readyState === XMLHttpRequest.DONE) { // 判断响应是否成功 if (xhr.status === 200) { // 处理响应数据 var data = JSON.parse(xhr.responseText); console.log(data); } else { // 处理响应错误 console.error('Request failed: ' + xhr.statusText); } } }; // 发送 HTTP 请求 xhr.send(); ``` 后端(Node.js): ```javascript var http = require('http'); // 创建一个 HTTP 服务器 var server = http.createServer(function(req, res) { // 判断请求的 URL 是否为 /api/data if (req.url === '/api/data') { // 设置 HTTP 头部,指定响应的数据类型 res.setHeader('Content-Type', 'application/json'); // 发送响应数据 res.write(JSON.stringify({ message: 'Hello, World!' })); // 结束响应 res.end(); } else { // 发送 404 错误 res.statusCode = 404; res.end(); } }); // 监听 8080 端口 server.listen(8080); ``` 在这个示例中,前端通过 XMLHttpRequest 对象向后端发送一个 GET 请求,请求的 URL 为 /api/data。后端判断请求的 URL 是否为 /api/data,如果是则返回一个 JSON 格式的响应数据,否则返回一个 404 错误。由于 HTTP/1.1 支持长连接,因此在前端发送第一个请求后,该连接会保持打开状态,以便在稍后的时间内可以继续使用该连接发送和接收数据。如果需要关闭连接,可以使用 XMLHttpRequest 对象的 abort() 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值