zoukankan      html  css  js  c++  java
  • http1.1线头阻塞

    HTTP1的效率低,问题在于他是半双工的。什么叫做半双工?说白了就是发送和接受只能同时做一个,协议要么是发送状态,要么是接受状态。TCP好歹是全双工的,收发可以同时进行,HTTP1是对TCP的传输能力的浪费。所以后来有个模式,叫做pipeline,这个勉强成为了一种低效率的全双工模式,但是请求和响应顺序必须完全相同。而且请求和响应都还是单向串行的。造成队头阻塞有两个场景,第一个场景,服务器处理一个请求太慢,这样,即使用pipeline模式把第二个请求也发送过去了,第二个请求比第一个请求先ready了,这个响应也不能发送,需要等到第一个完成后才行。这时候如果有一个序号机制,可以把第二个先发出去,这样的确会快一些。但是还有第二个场景。服务器响应不慢,但是第一个请求太大了,传输很慢。这样pipeline也还是有问题,第二个请求虽然很小,但是还是得等第一个传输完了,响应完了才行。这时候你的序号机制就没用了。所以要想让这两个情况都能让第二个请求不被第一个请求阻塞,最好的办法就是来两个TCP连接。传统上浏览器也是这么干的。但是TCP要握手,这个效率低,所以HTTP2把多个这种请求流塞到一个TCP连接里面,这样的连接复用方式就提高了效率,又节省了连接握手。需要注意HTTP2没有完全解决队头阻塞问题,因为实际中TCP的连接buffer有限,一个响应又慢,又大的请求会把链接buffer完全占满,导致buffer阻塞,从而导致跟队头阻塞一样的效果。

  • 相关阅读:
    python 小兵(4)之文件操作 小问题
    python 小兵(4)之文件操作
    排序
    Java的数据结构
    基本数据操作
    部署tomcat到Linux
    找工作的一些知识积累
    BootStrap
    操作系统
    做Global Admin
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14139486.html
Copyright © 2011-2022 走看看