• https 多路复用的理解~转载


    https://segmentfault.com/q/1010000005167289

    这里面的http/2连接是指tcp/ip层的连接还是http应用层(也就是我们平常在chrome F12 network面板看到的那些请求)的?

    如果是前者,那么这个跟以前keep-alive 有什么区别吗?

    上面这张图中,右边的情况是说到,客户端同时发起css和js的请求,然后服务端同时响应,这种方式难道在http1.x中没有吗?比如我同时放两个script标签在html中,并且加上async标识,chrome是会一并发起http请求的。

    上面的图的情景跟和我说的情景有什么区别吗?

    1个回答

    4

    已采纳

    图上的连接就指的是TCP连接,HTTP连接本质也是TCP连接。keep-alive是指服务器和客户端的多个请求响应共用一个TCP连接,而不是每次请求响应都新建一个连接完了后关闭。

    不知道题主有没有做过TCP相关的开发,认为同时发生两个请求响应好像很简单的样子。的确,同时发送两个请求响应是很简单,开两个线程开两个TCP连接就行了,但是,如果想在同一个TCP连接里面同时发生两个请求响应就不是那么简单了,注意是在同一个TCP连接里。

    首先你要知道,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。

    例如客户端要向服务器发送Hello、World两个单词,只能是先发送Hello再发送World,没办法同时发送这两个单词。不然服务器收到的可能就是HWeolrllod(注意是穿插着发过去了,但是顺序还是不会乱)。这样服务器就懵b了,“发的这是啥玩意我不认识”。

    所以在很长一段时间即HTTP/1.1,请求响应只能依次发送,而不能同时。

    接上面的问题,能否同时发送Hello和World两个单词能,当然也是可以的,可以将数据拆成包,给每个包打上标签。发的时候是这样的①H ②W ①e ②o ①l ②r ①l ②l ①o ②d。这样到了服务器,服务器根据标签把两个单词区分开来。这样就强行将一个独木桥转换成多个队列,实际上还是独木桥,但是独木桥上的每个人举了个牌子,上面写着①②...。这就是HTTP/2.

    逻辑上是这样的:

    但实际上是这样的:

    图来源于:http://www.blogjava.net/yongboy/archive/2015/03/19/423611.html

  • 相关阅读:
    Eclipse集成Maven的Web工程demo(独立及Maven集成tomcat)
    Spring Boot的常见配置项解析
    SpringBoot入门demo
    简单句障碍的解决
    阅读理解(2000年统考)
    Java Web项目实战第1篇之环境搭建
    [STM32F10x] 利用定时器测量脉冲宽度
    [STM32F10x] 利用定时器测量频率
    STM32 输入捕获的脉冲宽度及频率计算
    RT-Thread—STM32—在线升级(Ymodem_OTA、HTTP_OTA)
  • 原文地址:https://www.cnblogs.com/sanghai/p/8276980.html
Copyright © 2020-2023  润新知