美文网首页IT干货程序员
http协议里的keep-alive

http协议里的keep-alive

作者: hello_steam | 来源:发表于2018-11-27 22:16 被阅读68次

    http是现在web领域极其普遍的应用层传输协议, 目前常见的使用版本则是http1.1, 当然最先版本是http2.0。

    传统的Http应用里都是一次TCP连接一次request。


    image

    这种情况下效率有点低:

    • 服务端负载增加,每个请求过来都得占用端口
    • 客户端或服务端对客户端连接数的限制(chrome 限制是6个)
      这种情况很多,比如网页加载对于这个case的处理就是使用将静态资源放置到不同Domain或者压缩打包减少数量来提高效率

    http1.1 协议里增加了 keepalive的支持, 并且默认开启。

    image

    客户端和服务端在建立连接并完成request后并不会立即断开TCP连接,而是在下次request来临时复用这次TCP连接。但是这里也必须要有TCP连接的timeout时间限制。不然会造成服务端端口被长期占用释放不了。

    对于不适用keepalive的request来说,不管是客户端还是服务端都是通过TCP的链接的断开知道request的结束(TCP 挥手时会check 数据包的 seq, 保证数据完整性)。
    支持keepalive后,如何知道request结束了呢?
    在Http1.1的版本里, 解决方案是request 和reponse里使用contentLength来帮助确认是否收到全部数据。

    另一个问题就是在使用keepalive的情况,客户端依然有同时发送多个请求的情况,比如网页加载是需要同时load多个静态资源。比如 浏览器默认最大连接数是6,现在有十个资源同时加载,那么这十个里会有6个并行,4个与前6个串行。

    在keepalive里有个问题就是如果能知道每个repose与其对应的request的话,并发的请求可以只需要一次TCP连接,这也就是http2.0实现的多路复用。

    image

    相关文章

      网友评论

        本文标题:http协议里的keep-alive

        本文链接:https://www.haomeiwen.com/subject/wixoqqtx.html