HTTP 1.1 中,持久连接是默认的
- 可以通过发送
Connection: closed
来表示要断开连接 - Web服务器可以随时断开连接,不一定要等待
Connection: closed
头部 - 只有实体部分的长度与相应的
Content-Length
头一致,或者是使用 分块传输编码方式编码的,连接才能持久保持 - 一个客户端对任意一个服务器或代理只能保持 2条持久连接 防止服务器过载
HTTP 管道化连接
- 在响应还没到之前,将多条请求放入队列中
- 必须确认 连接是持久的
- 做好服务器随时关闭连接的准备,服务器在关闭连接的时候,永远不会知道客户端还有多少数据没发送
- 副作用:如果发送了一些请求,在收到结果之前,连接关闭了,客户端是无法知道服务器到底接受或处理了多少请求的。
- 对于GET请求一个静态HTML页面,可以反复执行多次,也不会有什么问题
- 而其他一些事务,如POST一张订单,是不能重复执行的,不然就会有下多张订单的危险
- 所以HTTP客户端不应该用管道的方式发送一些有副作用的请求,如POST
关闭连接时应该注意的问题
- 服务器关闭 输出信道(即向客户端发送数据的信道)总是安全的
- 客户端会在从其缓冲区读完所有数据后收到一条通知,说明流结束了,它就知道你将连接关闭了
- 而关闭 输入信道 比较危险
- 客户端向你已经关闭的输入信道发送数据时会收到服务器操作系统返回的 "TCP连接被对端重置" 的报文,大部分操作系统认为这是很严重的错误,所以客户端的OS会清空缓冲区,如果此前客户端还有数据未从缓冲区取走,就会丢失这部分数据
- 总之,应用程序应该先关闭输出信道,等待对方关闭其输出信道,然后再关闭输入信道
网友评论