• magicnum
    2019-08-05
    h2c优点是性能,不需要TLS握手以及加解密。可以通过curl工具构造h2c请求;
    h2的流是虚拟的因为它是使用帧传输数据的,相同streamid的帧组成了虚拟消息以及流;
    相同点:都是基于tcp或TLS,并且是基于请求-响应模型,schema还是http或https不会有http2。
    不同点:h2使用二进制传输消息并且通过HPACK压缩请求头,实现流多路复用、服务器推送

    作者回复: great!

    
     6
  • -W.LI-
    2019-08-05
    课后习题出的很好。可惜我不会坐等答案
    1.内网用h2c会比https快么?
    2.感觉回答虚拟流之前给先回答啥是真真的流。我对流的理解是有序,切只能读一次。http2支持乱序发,我猜也支持,部分帧重发,所以就是虚拟的了。
    3.共同,都是应用层协议,传输成都用的TCP。
    不同:https=TLS+HTTP/HTTP2,安全。
    http2:二进制传输,对header压缩,通过二进制分帧解决了队头阻塞,传输效率更高,服务端可推数据
    http:明文,队头阻塞,半双工。
    问题1:一个TCP链接可以打开很多channel是吧,每一个channel都可以传输数据。底层具体怎么实现的啊,是怎么区分channel里的数据谁是谁的?
    问题2:我之前看见TPC好像是通过服务端IP,服务端端口号,客户端端IP,客户端端口号。来唯一标识一个链接的。http1的时候队头阻塞,继续要多建http链接。每建立一个链接客户端就用一个不同的端口号么?
    展开

    作者回复:
    1.当然,省去了加密的成本。

    2.所谓“虚拟的流”,是指流实际上是多个同一序号的帧,并没有真正的流数据结构,这与连接不同。

    3.正确。

    4.你说的channel应该是http/2里的“流”吧,http/2里没有channel。流是由帧组成的,帧头里有流id标记所属的流,马上会讲具体的细节。

    5.标记一个tcp连接要用四元组(客户端ip端口+服务器ip端口),所以肯定要用一个新的端口号,在客户端这是临时分配的,而服务器是固定的端口。

     2
     4
  • 阿锋
    2019-08-05
    突然想起了一个问题,get和post请求其中一个区别是,post请求会把请求的数据放入请求体(body)中,而get请求是拼接到url后面。get请求是不是一定不能往请求体(body)中放入数据。还是这些都只是客户端和服务端的约定,可以灵活的自定义,没有强制的要求。

    作者回复: get也可以有body,post也可以用query参数,区别的关键在于动作语义,一个是取一个是存。

     1
     2
  • nb Ack
    2019-08-05
    老师好。我想问一下,http2的多路复用和http的长连接效果不是一样吗?

    作者回复: 完全不一样。

    多路复用多个请求没有顺序,而长连接多个请求必须排队,就会队头阻塞。

    可以再看看示意图体会一下。

    
     2
  • 渴望做梦
    2019-08-29
    老师,我有个疑问,既然http2是二进制的格式,那我们还能用chrome自带的工具调试吗?

    作者回复: 可以的,Chrome会把二进制解码,还原为http/1的文本形式,你可以自己试一下。

    
     1
  • 俊伟
    2020-01-19
    1.h2c使用明文传输,速度更快,不需要TLS握手。
    2.客户端将多个请求分成不同的流,然后每个流里面在切成一个个帧,发送的时候是按帧发送的。每个帧存着一个流ID来表示它属于的流。服务端收到请求的时候将帧按流ID进行拼接。从传输的角度来看流是不存在的,只是看到了一个个帧,所以说流是虚拟的。
    3.相同点:都是基于TCP和TLS的,url格式都是相同的。都是基于header+body的形式。都是请求-应答模型。
    4.不同点: 1.使用了HPACK进行头部压缩。
                    2.使用的是二进制的方式进行传输。
                    3.将多个请求切分成帧发送,实现了多路复用。这个感觉上利用了多道程序设计的思想。
                    4.服务器可以主动向客户端推送消息。充分利用了TCP的全功双通道。
    展开

    作者回复: 总结的非常好,great。

    
    
  • 夏目
    2019-12-09
    流就是逻辑上将数据帧按id分组了,同组有序,组间无序,本质就是id相同的几个数据帧所以流是虚拟的。在tcp层面还是队首阻塞的吧?需要等待ack

    作者回复: 是的,理解的非常正确。

    
    
  • Geek_007
    2019-10-13
    老师,新版nginx已经支持同端口,不同域名根据配置开启h2了。另外h2不支持CBC吗?CBC只是加解密效率低,没有安全性问题吧,况且的确CBC还是很常见的加密模式呢。

    作者回复:
    1.我测试是不行的,也许新的有变化,有空再试试。

    2.cbc不安全,http/2已经禁用了,可以参考rfc。

    
    
  • 谢一
    2019-09-09
    老师,既然在连接层,是无序的,那在http/2中是怎么保证frame的有序性的呢?

    作者回复: tcp层是有序的,所以一个流里的多个帧会按照顺序依次到达,接收方只要依次接收就可以了。

    
    
  • 猫王者
    2019-08-09
    http1中消息的内容不也通过一定的编码比如utf8,将文本转成二进制,然后在网络上传输吗?http2和它又能有什么区别呢

    作者回复: 头部压缩,多路复用,优先级,服务器推送,优点太多了,这些都是http/1不具备的。

    
    
  • -W.LI-
    2019-08-06
    老师好。之前用MQ的时候,AMPT协议说是只打开一个长链接TCP链接。然后AMPT协议每次都是在这个链接里打开信道进行传输。队列和client(服务器)IP和端口基本固定,如果以TCP链接形式会占用很多端口号,还影响性能,所以就采用了信道。可是信道和信道之间如何实现数据隔离和马上要讲的http2的channel原理差不多么?

    作者回复: 不太了解AMPT,所以无法做比较,等讲http/2流细节的时候你可以对比一下。

     1
    
  • レイン小雨
    2019-08-05
    真好

    作者回复: thanks。

    
    
我们在线,来聊聊吧