V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wysnylc
V2EX  ›  问与答

HTTP2 奇思妙想

  •  
  •   wysnylc · 2019-03-05 12:01:35 +08:00 · 2015 次点击
    这是一个创建于 2067 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. http2 有并发。它支持多路复用,并行双向字节流的请求和响应,它以“流”的形式在客户端和服务器间独立的双向的交换的帧序列。流具有一些重要的特性:
    • 单个的 HTTP/2 连接可以包含多个并发打开的流,各个终端多个流的帧可以交叉。
    • 流可以单方面地建立和使用,或由客户端或服务器共享。
    • 流可以被任何一端关闭。
    • 流中帧的发送顺序是值得注意的。接收者以它们收到帧的顺序处理。特别的,HEADERS 帧和 DATA 帧在语义上是非常重要的。
    • 流由一个整数标识。流标识符由发起流的一端来赋值。

    虽然只有一个 TCP 连接,却能够在这个连接同时处理客户端和服务端的多个数据传输。

    1. HTTP2 只有一个 TCP 连接,它并不像 http1.1 中的 TCP 连接一样,在处理当前传输数据后就关闭,而是一直连通的,客户端和服务端可以通过它持续往返传输数据。这个 TCP 流的传输通道,是可以被任何一端给关闭的。

    按照以上所述,HTTP2 是用 UDP 实现的 TCP 实现了 UDP?我的想法是对的吗?

    13 条回复    2019-03-05 18:53:23 +08:00
    514146235
        1
    514146235  
       2019-03-05 12:20:19 +08:00
    当然不对啊,udp 根本不需要建立连接,就是无脑直接发,到没到根本不管。所以才会说 udp 是不可靠协议,但是因为没有握手的过程,从而 udp 通常表现的比 tcp 协议更快。
    wysnylc
        2
    wysnylc  
    OP
       2019-03-05 12:25:08 +08:00
    @514146235 #1 感谢回答,但是你有点偏题.其实我想说的的是多路复用的帧是无序发送和 UDP 发包也是无序到达是一个概念
    rrfeng
        3
    rrfeng  
       2019-03-05 12:46:32 +08:00 via Android
    一点都不是。
    lhx2008
        4
    lhx2008  
       2019-03-05 12:55:16 +08:00
    不是,TCP 本来就是流,在流上发包很正常,基本上所有 TCP 协议都是流上发包,至于无序到达,HTTP/2 的意思应该是来自不同服务器的包可以无序到达,没说来自同一个服务器的包可以无序。
    msg7086
        5
    msg7086  
       2019-03-05 12:59:11 +08:00
    可以说是把 TCP 链路给 UDP 化了。但是也不完全是 UDP 化,因为上层只管乱序,不管丢包重发。
    以后 HTTP/3 可能就要全面 UDP 了。

    另外,TCP 并不是 UDP 实现的。
    orangeade
        6
    orangeade  
       2019-03-05 13:10:25 +08:00
    你说的是 HTTP/3 HTTP/2 还是有 TCP 的队头阻塞的
    gamexg
        7
    gamexg  
       2019-03-05 13:55:23 +08:00
    不是,
    http2 还是基于 tcp 的,建简易理解可以认为底层 tcp 连接里面都是这样的包

    流 id | 流数据

    接受方根据 流 id 重组为多个子流就实现了单连接多路复用。当然实际不是这样简单,还有一些其他细节。
    wysnylc
        8
    wysnylc  
    OP
       2019-03-05 16:43:53 +08:00
    @msg7086 #5 之前一直以为 TCP 是基于 UDP 实现的,原来两个是同级别的. http2 的确像 udp 的模式啊~
    wysnylc
        9
    wysnylc  
    OP
       2019-03-05 16:44:55 +08:00
    @gamexg #7 就多路复用会导致流无序达到,这和 UDP 很像呀
    gamexg
        10
    gamexg  
       2019-03-05 16:47:54 +08:00
    @wysnylc #9 不会无序到达,tcp 协议可以保证发送什么顺序接收时就是什么顺序。
    那么每个 “流 id + 数据 ” 就会按照发送的顺序到达接收端,不会出现无序的情况。
    mritd
        11
    mritd  
       2019-03-05 17:57:14 +08:00   ❤️ 1
    首先声明,利益无关,今天 Harbor 群里看到的,刚看完推荐楼主看一下 https://mp.weixin.qq.com/s/bD8C0oR34ZKUEZjN9yBSJg
    wysnylc
        12
    wysnylc  
    OP
       2019-03-05 18:44:06 +08:00
    @gamexg #10 发送无序,接受有序是因为服务端会根据"流 id"在缓存区重排
    wysnylc
        13
    wysnylc  
    OP
       2019-03-05 18:53:23 +08:00
    @mritd #11 看完了,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:29 · PVG 10:29 · LAX 19:29 · JFK 22:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.