- Keep-Alive模式
- Keep-Alive的应用
- Http1.0和Http1.1中
- 如何获知数据传输结束
- 非Keep-Alive模式
- Keep-Alive模式
- 静态响应数据
- 动态数据
- 注意
- 短连接和长连接
- 短连接
- 长连接
- 长连接的建立
Keep-Alive模式
HTTP协议采用请求-应答模式
- 非KeepAlive模式:每个请求客户端和服务器都要新建一个连接,完成后立即断开连接(HTTP协议是无连接的协议)。
- KeepAlive模式:使客户端到服务器的连接持续有效,当出现对服务器的后继请求时,Keep-Alive避免了从新建立连接。
Keep-Alive的应用
- Keep-Alive: timeout=5, max=100
- timeout=5表示这个TCP通道可以保持5秒
- max=100,表示这个长连接最多接收100次请求就断开。
Http1.0和Http1.1中
- Http1.0:默认Keep-Alive时关闭的,需要在Header头中添加
Connection: Keep-Alive
启用。 - Http1.1:默认启用Keep-Alive,加入
Connection: close
才关闭。
目前大部分浏览器都是Http1.1协议,默认发起Keep-Alive连接请求。
如何获知数据传输结束
非Keep-Alive模式
客户端发送一个请求,服务器响应请求,服务器在返回手机的时候关闭连接。客户端读取数据会返回EOF(结尾),知道数据读取完了。
Keep-Alive模式
静态响应数据
通过判断响应头中的Content-Length
字段,判断数据达到大小就知道数据传输结束。
动态数据
数据时动态的就不能来判断长度。通常情况服务器时分块传输数据的Transfer-Encoding:chunk
,这是就要根据传输的数据块chunk
来判断,数据传输结束的时候,最后一个数据库chunk长度是0。
注意
为了兼容HTTP1.0,HTTP1.1消息请求体中必须包含Content-Length
头字段。
如果Content-Length字段没有给定,服务器返回400。
如果COntent-Length不合法,服务器返回401
HTTP1.1必须接受Transfer-Encoding:chunk
传输编码,因此当不能事先知道消息长度,必须使用该机制来传输消息。如果一个消息同时包含Transfer-Encoding:chunk
和Content-Length
,则忽略Content-Length
。
短连接和长连接
短连接
短连接:保持在数据传输过程,请求发起,连接建立,数据返回,连接关闭。适用于实时请求数据。
长连接
长连接:客户端在连接发起后,在请求关闭连接前客户端和服务器都保持连接,保持这个通信管道,之后就可以进行复用。
适用于消息推送、请求频繁的场景直播。建立连接后,该连接下所有请求都可以重用这个长连接管道,避免频繁连接请求,提升了效率。
长连接的建立
- 建立HTTP长连接,HTTP请求头包含如下内容:
Connection:Keep-Alive
- 服务端同意建立长连接,HTTP响应头包含如下内容:
Connection:Keep-Alive
- 关闭连接时,HTTP头包含:
Connection:Close