当前位置: 首页 > 网络应用技术

http2服务呼叫坑

时间:2023-03-06 19:47:36 网络应用技术

  时代正在开发,越来越多的人使用HTTP协议。HTTP1.1的缺点逐渐出现。

  1)浏览器方法经常从某些网站发送请求,从而导致唯一网站不可用。或所有网站经常发送请求以引起差的用户体验和其他问题。同时限制每个URL的复杂性数量。

  2)提高请求的响应速度。只有一个连接,只有一个TCP握手或七个TL握手。对于HTTP1.1请求的时间,HTTP2.0可以处理三到四个请求。

  3)提高服务器和客户服务的性能(尤其是大型互联网公司的流量很多。如果使用HTTP2.0,则可以减少HTTP服务器的一半)。

  HTTP客户服务不知道HTTP服务器是否支持http2.0.在转弯,HTTP服务器不知道HTTP客户服务是否支持http2.0。从http1.1到http2.0的过度是不可能的。直接从HTTP1.1直接从HTTP1.1直接从HTTP2.0上方直接超过http2.0也是一件不现实的事情。然后,HTTP1客户服务和HTTP2客户服务有一件麻烦的事情。有HTTP2服务器和HTTP1服务器。这两个维度,四个情况的共存。

  有人会问,支持http1.1?http2的客户,.0的客户绝对不会放弃http2.0的出色性能和特征。它可以使用HTTP2.0并使用它。

  然后是HTTP2.0的设计师来解决此问题。打开解决方案:谈判。

  HTTPS1.1和HTTPS2.0协商基于ALPN机制。ALPNS基于TLS。当建立TLS链接时,客户服务方面将为TLS协议添加自己的支持协议。服务器将选择客户服务方面支持的最合适的协议之一。然后将所选协议通知到客户服务结束。如果客户端未发送支持的HTTP协议,则服务器将默认使用HTTP1.1。

  HTTP没有TLS协议,也无法基于TL传输协议。协议制造商使用升级机制。客户端发送空请求,并且该请求包含升级,连接,http2-settings的请求标题。服务器。从升级中获取支持的协议,然后响应请求。响应请求头包含升级,连接。成功的谈判。

  以下是HTTP1.1和HTTP2.0的谈判过程。

  如果服务器不支持HTTP/2,则它将忽略升级字段并直接返回HTTP/1.1响应,例如:

  如果服务器支持HTTP/2,则可以响应101状态代码和相应的头部:

  概括:

  1)HTTPS 1.1和HTTPS.2.0和HTTP1.1和HTTP2.0之间的谈判是两组设计解决方案。HTTPS1.1和HTTPS.2.0 TLS自动实施。通过它自己。

  2)在当前趋势中,客户服务方面和服务器需要支持HTTP1.1,HTTP2.0,HTTPS1.1,HTTPS2.0,并且技术实施更为复杂。

  2.1。

  该项目的问题是,当调用华为通过Java端提供的H2服务时,请返回protocol_error错误;可以使用它,但是为什么华为返回错误?以下是Huawei side的内容回复:

  这意味着客户端调用期间使用的协议不正确,并且服务器无法分析。我们需要在消息标题中添加协调参数。根据需要修改客户端,但问题仍然存在;发现服务器不支持谈判,并按照以下方式获取:

  2.2。其他工具验证:

  2.3。JDK版本支持H2说明:

  原始链接:Java对HTTP2的支持

  最初支持TLS 1.2,客户端默认使用TLS 1.2。

  但是,为了支持HTTP2,还需要码头ALPN模块的ALPN靴子。

  下载alpn -boot jar,并添加参数Java -xbootClassSpath/p:...

  最初支持TLS 1.2,客户端默认使用TLS 1.2。

  使用JEP 244,TLS ALPN扩展,ALPN完全支持HTTP2。

  与Java 9相同。

  与Java 9相同,并支持TLS 1.3。

  到这个时候,发现根据第二部分,以下两种调用HTTP2的方法无法通过:

  3.1。更改罐装包

  反复尝试在此过程中尝试多种方法:

  1)升级到JDK11,通过本机HTTPCLEINT致电,问题仍然是:

  2)通过okhttpclient 3.2致电。问题仍然是:

  3)通过Netty致电,问题仍然存在。

  4)协调客户侧网络专家以帮助分析。该问题仍然通过curl -HTTP2调用。

  3.2。分析C ++成功案例

  背景C ++开发客户端可以正常调用。通过理解,C ++指定了H2协议的强制使用,请抓取包裹以进行比较,并发现在客户端发送请求时存在差异:

  确定问题:

  Java侧是否也有类型的参数,您可以指定使用H2方法的使用;

  3.3。尝试卷曲命令

  首先尝试通过卷发反复:

  仅当HTTP2参数不成功时,才设置卷曲。

  我在https://curl.haxx.se/docs/http2.html上找到了参数-HTTP2-PRIOR-知识描述。

  curl被迫使用H2协议通过HTTP2-PRIOR-知识验证以成功验证。

  3.4。找到以解决问题的先验知识参数

  在https://www.jianshu.com/p/9530D58250C7中找到解决方案:

  尝试验证:

  第一步是将Okhttpclies升级到4.1.0:

  步骤2,编写测试程序:

  第三步是获取包裹验证并成功:

  4.1。加密电话

  HTTPS1.1和HTTPS2.0协商基于ALPN机制。ALPNS基于TLS。当建立TLS链接时,客户服务方面将为TLS协议添加自己的支持协议。服务器将选择客户服务方面支持的最合适的协议之一。然后将所选协议通知到客户服务结束。如果客户端未发送支持的HTTP协议,则服务器将默认使用HTTP1.1

  4.2。咨询电话

  开源地址:https://http2.github.io/http2-pec/#discover-http:

  4.3。要求强制性H2方法

  原始作者:陈你

  资料来源:NGINX开源社区