作者回复: 对的,因此http/1.1不支持并发,这种复用价值非常有限
作者回复: 好问题! 通过TCP来保证有序的,因为同个stream中的frame是有序发送的,这样TCP的seq就能保证多个frame间不乱序,这样就带来了队头阻塞问题。 你可以参考HTTP3,它在UDP上通过QUIC FRAME头部中设立的offset,实现了TCP中sequence的同样功能,以此实现有序。
作者回复: 是的,这就是head of block队头阻塞问题,HTTP3就是解决这个问题的
作者回复: client端决定,比如浏览器解析完HTML DOM树后,发现有访问CDN上的外部链接,包括JS、图片、CSS等,于是就会按照规则,发起多个stream,而且会设定不同的优先级(抓包可以看,通常图片优先级较低)。 不需要确认,TCP层有确认功能。
作者回复: 我猜你是想问,还没有关闭的stream的数量吧?这受制于server的内存,因为还没有关闭的stream,意味着必须全部用内存存放已经接收到的部分消息,如果是高并发server,它能够为一个连接分配的内存是很有限的,通常是可配的,从这个值可以反推出stream的并发数
作者回复: 呃,这个是“传输中”无序,传输层TCP是有序的。 你的理解没问题,同一个stream内是有序的,多个stream间是并发的,因为message可能会分片为多个frame,所以多个message间在字节有序的TCP之上frame必然是交错的
作者回复: 2^31
作者回复: 是的