HTTP基础之六(keep-alive、persistent)

Keep-Alive来历

许多HTTP/1.0的浏览器和服务器扩展了一个实验性的属性Keep-Alive来支持持久连接(1996年开始),HTTP/1.0版本里的Keep-Alive有一些交互性上的问题。这些问题在HTTP/1.1里面得到了调整。

Keep-Alive操作

Keep-Alive是被废弃了,在HTTP/1.1规范文档也没有列出来,然后Keep-Alive已经被广泛使用了。客户端需要Keep-Alive可以在Connection头里面包含“Keep-Alive”值,服务器端在接收以后,如果也愿意保持当前连接,则返回在Connection头里面一个“Keep-Alive”。客户端在接收到以后,如果Connection头里面有“Keep-Alive”则认为服务器端不支持Keep-Alive,从而在请求完成以后就关闭连接了;如果有则保持连接。

 

Keep-Alive选项

Keep-Alive指的是keep the connection alive。客户端和服务器端不需要一直保持Keep-Alive连接,同意可以在空闲时关闭Keep-Alive的连接,并且限制Keep-Alive的连接数。Keep-Alive可以作为头指定它的一些选项值:

timeout:在Keep-Alive响应头里面设置,表示大概服务器可能保持连接的时间,不是一定的

max:在Keep-Alive响应头里面设置,表示大概服务器保持连接的事务数

支持其它自定义的值格式一样

Connection: Keep-Alive
Keep-Alive: max=5, timeout=120

 

Keep-Alive连接的限制和规则

①Keep-Alive在HTTP/1.0里面不是默认开启的,需要客户端发送一个Connection:Keep-Alive

②Keep-Alive需要在所有的HTTP消息里面都添加(如果要保持连接),如果有一个没有发送,则服务器默认会关闭连接。

③消息body必须有一个正确的Content-Length头,具有一个MIME类型,或者是Transfer-Encoding。

④代理或网关必须在转发消息前移除Connection头

 

Keep-Alive与愚蠢的代理

很多时候,客户端发送的请求都是经过代理到达最终的服务器。对于代理而言,它不知道Keep-Alive。只是原样传递出来,而且Keep-Alive只能在相邻的之间建立,不能插足第三者,这就导致了很多挂起的连接,不愉快的事情就会发生。

为了避免这种情况的发生,代理遇到Connection:Keep-Alive的请求不能代理。总之,我个人觉得不要期望Keep-Alive能在有代理的情况下使用持久化连接。

 

HTTP/1.1 持久连接(Persistent)

HTTP/1.1会逐渐淘汰对keep-alive的支持,用了一种更好的设计Persistent Connection,作用跟keep-alive一样,只是机制更好。HTTP/1.1跟1.0+最大的不同就是:默认开启持久化连接,无需添加一个Connection:Keep-Alive头,并且客户端和服务器端都可以在空闲的时候关闭连接,如果不想启用,需要设置响应头Connection:close。任何一个连接都不是永远保持连接而不关闭。

 

持久化连接(Persistent)的限制和规则

①如果设置了请求头Connection:close,客户端就不能在当前连接继续发送请求

②连接能被持久化的条件:所有在连接上面的消息必须有正确的Content-Length或使用分块编码了

③HTTP/1.1的代理必须分开管理两边的持久化连接

④不能使用HTTP/1.0的客户端建立持久化连接

⑤单个用户应该最多保持2个持久化连接,防止服务器超载。

 

ps:我曾经被问到一个问题:HTTP/1.0和1.1有什么区别?现在看来,最大的区别就是在持久化上的处理方式了。

作者:张雪飞
出处:https://zhangxuefei.site/p/1055
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注