前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Http协议的keep-alive

Http协议的keep-alive

作者头像
灰子学技术
发布2021-02-05 11:00:11
9460
发布2021-02-05 11:00:11
举报
文章被收录于专栏:灰子学技术

本篇文章算是一篇知识普及篇,对于对http协议不熟悉的同学应该有些帮助,本作者会从下面几个问题来介绍这个知识点,如果你有兴趣,笔者觉得下面的参考文档还是很有必要一起看一看的。

代码语言:javascript
复制
1.http的keep-alive是干什么的?
2.http的keep-alive如何使用?
3.http设置了keep-alive之后,如何判断发送的是哪一个http request消息?

问题1: http的keep-alive是干什么的?

在早期–HTTP1.0的协议都是建立在TCP协议基础上,其特点就是传输完数据后,立马就释放掉该TCP链接,也就是短连接。

随着技术的发展,一个网页需要建立很多次短连接,这大大影响了消息的处理,所以Http就提出了持续连接的概念,也就是让连接保存一段时间,后续的Http消息可以复用这个连接继续传输消息,也就是Keep-Alive模式。

当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

备注:持久连接的主要好处是避免了短连接的每次连接的三次握手和四次挥手的网络交互。

问题2: http的keep-alive如何使用?

在Http协议的Header头,有两个Tag可以控制这个keep-alive, Connection: Keep-Alive 和 Keep-Alive:timeout,它们表示的是保持持续连接状态的时间为timeout秒。

http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

介绍:

1.keepalive可以由双方共同控制,需要双方都开启才能生效,客户端想关闭可以通过设置Connection: Close,服务端同样想关闭可以设置Connection: Close。双方哪方先收到Connection: Close 则由收到方关闭。

2.keepalive时间主要还是由服务端控制,时间一到由服务端主动关闭,当然客户端如果有实现设置一定时间后,由客户端主动关闭也可以。

问题3:http设置了keep-alive之后,如何判断发送的是哪一个http request消息?

Keep-Alive模式发送完数据HTTP服务器不会自动断开连接,不能再使用返回EOF(-1)来判断响应数据已经接收完成,它通过下面的两种方式来判断。

1.使用消息首部的Content-Length

对于静态资源,例如图片和静态页面,服务器可以很清楚的知道内容大小,然后通过Content-length消息首部字段告诉客户端 需要接收多少数据。客户端可以根据这个值来判断数据是否接收完成。

2.使用消息的首部Transfer-Encoding

对于无法知道Content-Length的资源,例如:动态页面,服务器是不可能预先知道内容大小,这时就可以使用Transfer-Encoding:chunk模式来传输 数据了。服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。

Chunked编码将使用若干个Chunk串连而成,由一个标明长度为0 的chunk标示结束。

代码语言:javascript
复制
Chunked-Body = *<strong>chunk </strong>
"0" CRLF
footer
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
 
hex-no-zero = &lt;HEX excluding "0"&gt;
 
chunk-size = hex-no-zero *HEX
chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
chunk-ext-name = token
chunk-ext-val = token | quoted-string
chunk-data = chunk-size(OCTET)
 
footer = *entity-header

Chunk编码由四部分组成:

代码语言:javascript
复制
 1、<strong>0至多个chunk块</strong> ,
 2、<strong>"0" CRLF </strong>,
 3、<strong>footer </strong>,
 4、<strong>CRLF</strong> <strong>.</strong> 
备注:每个chunk块由:chunk-size、chunk-ext(可选)、
 CRLF、chunk-data、CRLF组成。

参考文档:

1.wireshark抓包简单查看HTTP keep-alive原理 https://blog.csdn.net/kingson_wu/article/details/72512825

2.继续深入理解HTTP keepalive https://blog.csdn.net/Kingson_Wu/article/details/80102077?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control

3.HTTP协议头部与Keep-Alive模式详解 https://blog.csdn.net/moonpure/article/details/52992986?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase

4.HTTP的长连接和短连接 https://www.cnblogs.com/cswuyg/p/3653263.html

https://cloud.tencent.com/developer/article/1683247

https://blog.csdn.net/yscoder/article/details/77663435

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档