当前位置: 首页 > Linux

HTTP-2服务器(nginx-tomcat)配置与测试

时间:2023-04-06 01:22:09 Linux

HTTP/2协议介绍HTTP/2起源于SPDY,主要目标是解决HTTP1.x的性能问题。与HTTP/1.1在连接明文请求上不同,HTTP/2和SPDY一样,将一个TCP连接分成若干个流(Stream),每个流可以传输若干条消息(Message),每条消息由若干个最小的二进制组成框架(Frame)。这也是HTTP/1.1和HTTP/2最大的区别。新特性:标头数据压缩HTTP标头的数据压缩服务器推送HTTP/2服务器推送流水线请求请求流水线多路复用用于在同一个TCP连接中组合多个请求在单个TCP连接上多路复用多个请求此外,HTTP/2使用二进制而不是纯文本来打包和传输客户端和服务器之间的数据。名词解析:队头阻塞(Head-of-lineblocking或简称HOL阻塞)是计算机网络领域的一种性能受限现象。其原因是一列的第一个数据包(队列的头部)被阻塞导致整个列的数据包被阻塞。例如,它可能出现在带有缓冲输入的开关中,可能由于乱序传输而出现,也可能出现在HTTP管道中有多个请求时。流水线请求流水线请求(英文:HTTPpipelining)是一种批量提交多个HTTP请求(request)的技术,在发送过程中无需等待服务器的响应。流水线请求结果允许动态改进HTML页面加载时间,尤其是在特定的高延迟连接(例如卫星互联网)上。在宽带连接中,加速不是那么明显,因为需要在服务器端应用HTTP/1.1协议:服务器端必须按照客户端请求的顺序恢复请求,这样整个连接还是先-in-first-out,可能会出现HOL阻塞,造成延迟。HTTP/2.0或SPDY中的异步操作将解决这个问题。因为可以将多个HTTP请求填充到一个TCP数据包中,所以HTTP流水线需要在网络上传输的TCP数据包更少,从而降低了网络负载。流水线机制必须通过持久连接来完成,只有GET、HEAD等请求可以流水线,非幂等方法,如POST,不会流水线。连续的GET和HEAD请求总是可以流水线处理。GET、HEAD、PUT、DELETE等一系列幂等请求是否可以流水线化取决于请求序列是否相互依赖。另外,在最初创建连接时不应启动管道机制,因为交易对方(服务器)不一定支持HTTP/1.1版本的协议。HTTP管道依赖于客户端和服务器的支持。符合HTTP/1.1的服务器支持流水线。这并不意味着服务器需要提供流水线回复,只是它不会无法接收流水线请求。多路复用多路复用(Multiplexing,又称“多路复用”)是通信和计算机网络领域的一个专业术语。在没有歧义的情况下,“多路复用”也可以称为“多路复用”。”。多路复用一般是指在一个信道上传输多个信号或数据流的过程和技术。由于多路复用可以将多个低速信道集成到一个高速信道中进行传输,从而有效地利用了高速信道。通过使用复用,通信运营商可以避免维护多条线路,从而有效节省运营成本。)根据使用的技术,HTTP/2Multiplexing是指将一个TCP连接分成若干个流(Stream)HPACK算法HPACK算法是HTTP/2新引入的一种算法,用于压缩HTTP头,其原理是:客户端和服务端根据RFC7541的附录A维护一个公共静态字典(StaticTable),其中包含公共头名称的代码以及公共头名称和值的组合;服务端按照先进先出的原则维护一个通用的动态字典(DynamicTable),可以动态添加内容;客户端和服务端根据RFC7541编码(HuffmanCoding)附录B的静态霍夫曼码表支持霍夫曼编码。服务器推送网站以减少请求次数,通常通过简化页面上的图片和脚本来实现。但是这种措施非常不方便且效率低下,仍然需要很多HTTP链接来加载页面和页面资源。HTTP/2引入了服务器推送,即服务器向客户端发送的数据多于客户端请求的数据。这使得服务器可以直接提供浏览器渲染页面所需的资源,而不需要浏览器在接收和解析页面后进行一轮请求,从而节省了加载时间。服务器支持Web服务器HTTP/2自2015年5月4日RFC7540发布以来,大多数主流Web服务器都支持HTTP/2。从nginx1.9.5开始支持HTTP/2。配置也很简单listen443sslhttp2default_server;从Tomcat-8.5开始,支持HTTP/2。更多参考https://tomcat.apache.org/tom...来测试你的服务器是否支持HTTP/2,可以用这个地址:https://tools.keycdn.com/http...(看来需要科学上网)大部分主流浏览器浏览新版浏览器增加了对HTTP/2的支持2015年底在线测试:点此测试您的浏览器是否支持HTTP/2。另外加载一张破碎的地球图片,Chromium64的测试结果并不理想,HTTP/2明显比HTTP/1.1快,但延迟更多,有时还不够稳定。Firefox59版本好像没有默认开启HTTP/2,需要手动开启。这个地址也可以类似测试https://http2.golang.org/client组件OkHttp是Android下常用的HTTP客户端,支持HTTP和HTTP/2协议。版本协商升级协议ALPNOpenSSL1.0.2开始支持ALPN,nginx需要OpenSSL的ALPN实现HTTP/2相关功能。默认支持Ubuntu16.04。如果浏览器支持HTTP/2,请求服务器时会有Upgrade头:GET/HTTP/1.1Host:server.example.comConnection:Upgrade,HTTP2-SettingsUpgrade:h2cHTTP2-Settings:如果服务不支持,则不会有对应的响应:(即响应中没有“Upgrade”头)HTTP/1.1200OKContent-Length:243Content-Type:text/html...比如服务器需要忽略Upgrade中的"h2"词素,因为"h2"是指HTTP/2overTLS,所以会有如下不同的解析:服务端支持HTTP/2接受升级,并在响应中返回101状态码(切换协议)响应。然后以空行结束101响应,服务器就可以开始发送HTTP/2数据帧了。这些帧必须包含响应以响应协议初始化请求。例如:HTTP/1.1101SwitchingProtocolsConnection:UpgradeUpgrade:h2cHTTP/2connection...对HTTP/2的批评违反了协议分层原则,应用层重复流控(TCP层已经有流控)不一致并且过于复杂。时间短,好久没有完善。主要特征来自对SPDY安全和加密问题的总结。虽然HTTP/2标准已经发布三年,但并不是所有的浏览器都默认支持它。目前,在用户可以自己控制的客户端中,更容易成为客户端和服务器之间的协议。否则必须优雅降级,在不支持HTTP/2的场景下可以通过HTTP/1.1完成同样的功能。参考开发调试,curl和h2c编译支持HTTP/2:https://blog.cloudflare.com/t...HTTP/2代码库:https://nghttp2.org/说明:https://en.wikipedia.org/wiki…