本篇文章算是一篇知识普及篇,对于对http协议不熟悉的同学应该有些帮助,本作者会从下面几个问题来介绍这个知识点,如果你有兴趣,笔者觉得下面的参考文档还是很有必要一起看一看的。
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标示结束。
Chunked-Body = *<strong>chunk </strong>
"0" CRLF
footer
CRLF
chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
hex-no-zero = <HEX excluding "0">
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编码由四部分组成:
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