作者回复: 是的,不过动态表也有淘汰机制,服务器可以自己定制策略,不会过度占用内存。
作者回复: good。
作者回复: 是的,客户端和服务器维护各自的动态表,收发各一张表,但字典里的内容必须是一致的,否则索引号就对不上了。
作者回复: 对,虽然是部分解决,但对于http/1来说已经是一个很大的进步了。
作者回复: 指的是协议本身的数据格式,而不是负载(payload)的格式。
你看http/1,请求行、头、body里的分隔符,都是ASCII码。
而http/2,是二进制帧,用字节、位来表示信息,没有ASCII码。
你可以把自己想象成协议的解析器,你看到的协议头是什么格式,文本还是二进制。
作者回复: 我个人认为小帧比较好,当然如果在某些特定场景里,比如下载大文件,可以适当加大。
作者回复: http/1里的请求都是排队处理的,所以有队头阻塞。
http/2的请求是乱序的,彼此不依赖,所以没有队头阻塞。
作者回复: Nginx作为代理,实际上就把传输链路拆分成了两个部分,下游因为使用了http/2,所以肯定会有性能提升。
而上游还是http/1,所以瓶颈就在这里,但因为后台系统的服务能力都很强,网络也好,所以不会有太大影响。
当然,如果全用http/2就更好了。
作者回复: 如果有可能就尽量用http/2,HPack、流都可以提升性能,具体能提升多少就要看应用场景了,需要做测试。
作者回复: 说的很好,也可以这么表述“语法上有状态,语义上无状态”。
作者回复: 是的,会发生tcp层的队头阻塞,下一次http/3会讲。
作者回复:
问题2,不是buffer的原因,而是因为小帧更容易在网络不稳定的时候重发,比如1k,那么丢失只要重发1k,而大帧就要重发大量的数据,导致带宽浪费。
问题3,因为http/2使用流来发送请求,而流在连接上是并发的,彼此没有阻塞关系,所以就不会导致队头阻塞。
作者回复: 总结的不错。
1.可以说是语义无状态,语法有状态。
2.通常都认为较小的帧比较好,粒度小,流的并行度就高。
3.http/2在tcp层有队头阻塞,所以就出了http/3。
作者回复: 这个你不用担心,下层的程序会自动做处理。
当然,现在我们应该都尽量小写字段名。
作者回复: http/2采用是的加密通信,不解密是看不了的,需要在wireshark里指定SSLKEYLOGFILE,可参考“安全篇”。
只要指定了对应的log文件,例如31-1.log,就能看到明文了。
作者回复:
1.由tcp保证帧是顺序到达的,因为tcp是有序的字节流。
2.同样是由tcp实现,具体细节就太底层了,有兴趣可以研究tcp协议。
作者回复: great。
作者回复: 我在自己的实验环境又试了一下uri“http://www.chrono.com/18-1?dst=/15-1?name=a.json”
会跳转,而且是两个请求,304和200。你的请求是访问的本地OpenResty吗?
这里回复说不清楚,可以去GitHub上提issue。
作者回复: 这个话题有点大,单就Web服务来说,应该上https,然后加上waf安全防护,其他的还有防火墙、访问控制、身份认证、备份、审计什么的。
作者回复: great。