关于http-2:HTTP20的二进制是什么

这篇纯正满足本人的好奇心 我如同是一个在海边游玩的孩子,不断为拾到比通常更润滑的石子或更漂亮的 贝壳而欢欣鼓舞,而展示在我背后的是齐全未探明的真谛之海。牛顿 写本文的时候,想起高中物理课本的一句话: 我如同是一个在海边游玩的孩子,不断为拾到比通常更润滑的石子或更漂亮的贝壳而欢欣鼓舞,而展示在我背后的是齐全未探明的真谛之海。那个时候不懂这句话,忙于刷分,现在纯正是为了本人的好奇心而探索一些问题,脑海中又开始复现这句话。本文的问题来自于后面的一篇文章:《HTTP学习笔记(三) HTTP/2》, 这篇文章里咱们提到了HTTP/2的几个特点: is binary, instead of textual二进制代替了文本is fully multiplexed, instead of ordered and blocking多路复用can therefore use one connection for parallelism并行申请uses header compression to reduce overhead压缩申请头,缩小耗费allows servers to “push” responses proactively into client caches容许服务器被动推送响应进入客户端的缓存中其实对于1我是不了解的,毕竟在计算机的世界都是“二进制”嘛,过后我的想法是难道是跟JDK解决String一样的操作,在JDK8之前,String自身是借助于char来存储的: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];}到了JDK 8之后, JDK借助byte来存储字符串: public final class String implements java.io.Serializable, Comparable<String>, CharSequence, Constable, ConstantDesc { @Stable private final byte[] value;} 毕竟一个char占两个字节, 一个byte只占一个字节,因为我之前用程序连贯过充电桩,接管充电桩的报文,给的报文都是byte类型的,byte更小,像String就带了一些额定的信息,所以我猜测,是这个意义上的二进制,然而这只是猜测,我想过用抓包工具去验证我的猜测,然而发现抓包工具我用的并部署,再加上HTTP/2.0都是加密报文,抓包挺麻烦的,我也想过看HTTP Client的源码,然而这两个奏效都太慢了,最近偶尔翻看MongDB的文档,翻到了这方面的阐明,这个问题就有了答案。其实HTTP也对下面的二进制进行了解释: ...

June 23, 2023 · 2 min · jiezi

关于http-2:HTTP面试题-HTTP2-面试题

http HTTP面试题 - HTTP2 面试题 引言依据网络上的常见面试题进行收集,根本能应酬大部分的场景,HTTP大部分是八股,所以间接开始背书即可。 关联文章关联:HTTP - HTTP2 知识点 根底问题为什么要批改 HTTP?HTTP 1.X 自呈现以来便统治整个互联网15年以上,然而它的历史包袱也慢慢变大,高效加载资源的需要日趋显著,解决队头阻塞、头部臃肿等问题也逐步被摆上台面。 HTTP1.X 的版本遗留了两个比较严重的问题: 连贯过多导致TCP梗塞的管制变得有效化,网络拥塞造成不必要的带宽占用。浏览器因为梗塞占用本不属于它的资源,同时会呈现大量“反复”申请的资源数据。业界已经呈现了大量计划尝试解决这些问题,比方: spriting 图片合并data: inlining 内联数据Domain Sharding 域名分片Concatenation 文件合并然而无论如何优化,HTTP1.X 协定自身造成的网络拥塞是无奈防止的,作为极客公司的Google为了推动本人的产品和业务须要更加高速的WEB互联网环境,推动HTTP的改革势在必行,Google自身也有足够的用户量和技术实力推动。 推动HTTP/2IETF的HTTP工作组是HTTP/2的理论推动者,这个工作组保护了HTTP协定,而组织的成员由HTTP实现者、用户、网络运营商以及HTTP专家等组成。 除开IETF这个非盈利的神奇组织之外,还有各大支流浏览器的一些专家比方Firefox,Chrome,Twitter,Microsoft 的 HTTP stack,Curl 和 Akamai 等“大型”我的项目的工程师,以及诸如 Python、Ruby 和 NodeJS 之类的 HTTP 实现者。 留神HTTP协定是通过“邮件”沟通探讨进行欠缺和制订的,所有的探讨尽管构建在W3C的邮件服务商上,然而W3C自身对于HTTP推动没多大的帮忙。 咱们能够这么了解,IETF 是协定的真正推进者,也是协定规范的发布者,然而具体的协定制订可能来自各种团队和组织或者能够是集体,协定制订的日常工作是在邮件进行细节探讨,当然邮件探讨不能是聊闲话,每次邮件探讨只有存在产出的才算是合格,于是HTTP2协定就这样一步步欠缺并且最终实现。 服务器怎么样晓得客户端须要 HTTP2 连贯?HTTP2和HTTP的申请协定都是http结尾,普通用户个别是不晓得客户端是否反对HTTP的(或者连HTTP是啥都不晓得),那么客户端是如何在地址都是以Http结尾的状况下辨认申请是一个HTTP2的连贯的呢? 这个知识点考查的是 连贯前言,这个前言是 设计如此,无需过多纠结。 “连贯前言”是规范的 HTTP/1 申请报文,应用纯文本的 ASCII 码格局,申请办法是特地注册的一个关键字“PRI”,全文只有 24 个字节。 In HTTP/2, each endpoint is required to send a connection preface as a final confirmation of the protocol in use and to establish the initial settings for the HTTP/2 connection. The client and server each send a different connection preface. The client connection preface starts with a sequence of 24 octets, which in hex notation is: 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a That is, the connection preface starts with the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence MUST be followed by a SETTINGS frame ([Section 6.5](https://datatracker.ietf.org/doc/html/rfc7540#section-6.5)), which MAY be empty. The client sends the client connection preface immediately upon receipt of a 101 (Switching Protocols) response (indicating a successful upgrade) or as the first application data octets of a TLS connection. If starting an HTTP/2 connection with prior knowledge of server support for the protocol, the client connection preface is sent upon connection establishment.下面一大段话其实都是围绕 PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n这一串作为外围,依据HTTP定义规定如果客户端发送了这一串字符,并且通过 SETTINGS 帧告知服务端本人冀望HTTPS2 连贯,服务端就晓得客户端须要的是TLS的HTTP2连贯。 ...

October 22, 2022 · 5 min · jiezi

关于http-2:HTTP学习笔记三-HTTP2

这里简略的介绍一下HTTP 2.0。由HTTP 1.1 走向 HTTP 2.0写这篇文章的时候我在听B站UP主翻唱的歌曲,而后我灵机一动打算看看B站当初用的是HTTP的哪个版本,于是我摁下了F12键。 这个h2和h3代表的是HTTP 2.0 和3.0? 这版本号刷的这么快的吗? 不应该是2.1==>2.5 ==>3.0这样吗?为了验证我的想法,我关上了火狐浏览器。 所以就很忽然,原本依照打算只介绍HTTP/2.0的,而后HTTP/3.0也只得退出到学习打算中,所以每次学习一个知识点的时候,总会碰到新的,生也有涯,知也无涯的感觉,在后面两篇文章了,咱们曾经大抵的介绍HTTP 0.9 、1.0、1.1。 2.0 与1.1的不同1.1 的新个性咱们这里来再度介绍一下HTTP 1.1带来的改良: 连贯能够复用,节俭了屡次关上 TCP 连贯加载网页文档资源的工夫。HTTP 1.1 之前的连贯模型使短连贯,也是HTTP/1.0是短连贯,每一个HTTP申请都由它本人独立的连贯实现;这意味着发动每一个HTTP申请之前都会有一次TCP握手。 TCP协定自身握手自身就是消耗工夫的,所以TCP能够放弃更多的热连贯来适应负载。 火狐开发者文档是如是吐槽这个模型的: 除非是要兼容一个十分古老的,不反对长连贯的零碎,没有一个令人信服的理由持续应用这个模型。为了缓解这些问题,长连贯的概念便被设计进去了,甚至在HTTP/1.1之前。或者这被称为一个keep-alive连贯。 一个长连贯会放弃一段时间,反复用于发送一系列申请,节俭了新建TCP连贯握手的工夫,还能够利用TCP性能加强能力。当然这个连贯也不会始终保留着: 连贯在闲暇一段时间后会被敞开(服务器能够应用Keep-Alive协定头来指定一个最小的连贯放弃工夫) 然而长连贯也不是白璧无瑕的;就算是在闲暇状态,它还是会耗费服务器资源,而且在重负载时,还有可能蒙受Dos attacks攻打。在这种场景下,能够应用非长连贯,既尽快敞开那些闲暇的连贯,也能对性能有所晋升。 减少管线化技术,容许在第一个应答被齐全发送之前就发送第二个申请,以升高通信提早。管线化的英文是pipelining,pipelining还有另一个意思是流水线。我看火狐开发者文档的时候,中文版将pipelining在介绍HTTP的演变为翻译为管线化,然而在介绍连贯治理的时候,由将其译为流水线。我刚看的时候还认为是两种技术,事实上是一个名词的翻译。 然而火狐的开发者文档评估管线化技术,比拟难用,古代浏览器默认不会启用此个性。这个个性被更好的算法所代替,也就是HTTP/2 反对响应分块。简略的说这个代表分块传输,通常状况下,HTTP应答音讯中发送的数据是整个发送的,Content-Length音讯头部示意数据的长度,客户端须要直到那里是应答音讯的完结,以及后续应答音讯的开始。一个比拟常见的利用是断点续传,实现H5页面的大视频播放,实现渐进式播放,不须要将整个文件加载到内存中。 值得注意的是此个性在HTTP/2.0中并不反对,HTTP/2.0提供了一种更加有效率的数据流形式。 引入额定的缓存管制机制。简略的说就是引入了Cache-Control, 用Cache-control辨别了缓存的类型,制订了缓存过期策略。引入内容协商机制,包含语言,编码,类型等,并容许客户端和服务器之间约定以最合适的内容进行替换。凭借Host头, 可能使不同域名配置在同一个ip地址的服务器上。 有的同学看到这里会问,家喻户晓,HTTP用的是TCP协定,发送HTTP申请的时候,IP地址和端口必然是已知的,那么HOST的意义在哪里呢?举一个理论的例子是,Tomcat中部署多个服务,事实上一个Tomcat能够对应多个服务,当初是Spring Boot时代,Tomcat曾经默认集成在外面,是一个利用对一个Tomcat。如果你开发过Servlet,还没到Spring Boot,那个时候是打war包的,war被放在webapps上面,咱们在Tomcat中能够配置Host头,Tomcat会依据不同的host头转发到对应的服务上。关上Tomcat的server.xml: ### 流水线(pipelining)的设计问题 下面咱们提到了HTTP 1.1引入了流水线,容许第一个响应被齐全返回前,客户端发送第二个申请,我认为这是正当的设计,然而为什么古代浏览器大多没启用此个性吗? I would always recommend going to the authoritative source when trying to understand the meaning and purpose of HTTP headers. 如果你在尝试了解HTTP头的含意和用头时,我总是倡议你去原始权威文档. ...

July 23, 2022 · 2 min · jiezi

关于http-2:记录-http2-四个难以理解的疑惑点

文章基调不是科普类文章,不是科普 http2 性能的文章记录 http2 中难以了解的点,系作者在学习 http2 时的困惑,曾经最终的了解是集体的了解,可能有不谨严的中央,欢送探讨 如何了解 TCP 分帧 与 http2 分帧 的区别假如「传输残缺的数据」是「运输一个订单货物」,每「订单中的一个货物」占满「一个货车厢」TCP 位于传输层,能够了解为运输的货车 TCP 中的每一帧都是有序的,按发车工夫标记趟次,第一趟次,第二趟次,第三趟次,第 N 趟次TCP 能够同时发若干辆车,假如 4 辆车,则一次发车就有,第一趟次,第二趟次,第三趟次,第四趟次每辆车有些提前达到,有些很慢才到,不肯定依照发车的程序达到目的地当其中一个趟次的车回来了,才发下一趟车次。趟次的作用,是为了货品送到目的地的时候能够从新按顺序排列,能够将每趟次的货了解为高达模型的整机(一车只运送一个整机),有程序,能力辨认从新拼装起来将一个订单中的货,别离通过不同的趟次运输,就是「TCP 二进制分帧」,将订单的货(残缺的数据)分成每一车(帧)进行运输HTTP 处于应用层,一个 http 申请及响应,能够了解为下订单(申请)购买一批货(响应)的过程,(留神是一批,有若干个货物)而这批货并没有货品名称(无奈对应这批货对应的是哪个订单,无奈将响应与申请关联起来) 这时 http 还没有分帧化,粒度是以订单为单位,一个订单就是一个 http将一个 TCP 链接了解为一个运输合同 http0.9,1.0【问题】每一次订单都签一次运输合同,很麻烦 签一次运输合同(三次握手)下订单(申请)生产货物(服务器计算结果)发动运输(TCP 传输内容)收货物(响应)结一次运输合同的账(四次挥手)签一次运输合同(三次握手)下订单(申请)生产货物(服务器计算结果)发动运输(TCP 传输内容)收货物(响应)结一次运输合同的账(四次挥手)http1.1 keep-alive【改良】运输合同改成月结,复用 TCP 链接【问题】工厂无奈同时生产多个订单的货物,须要上一个订单收货 签一次运输合同(三次握手)下订单(申请)生产货物(服务器计算结果)发动运输(传输内容)收货物(响应)下订单(申请)生产货物(服务器计算结果)发动运输(传输内容)收货物(响应)结一次运输合同的账(四次挥手)http1.1 pipeline【改良】能够同时发多个订单了,通过收货程序,来辨认货物对应的是那一次订单的内容【改良】工厂能够同时生产多个订单的货【问题】订单存在依赖关系,即便第二次订单的货物生产好了,也得等第一次订单的货物生产好并全副传输完,能力发货。否则会被当做第一个订单的货 签一次运输合同(三次握手)下订单(第一个申请)下订单(第二个申请)同时生产第一个批和第二批货物(服务器计算结果)按程序发第一个订单的运输(传输内容)按程序收货物(响应,对应第一个响应)按程序发第二个订单的运输(传输内容)收货物(响应,对应第二个响应)结一次运输合同的账(四次挥手)http2 【改良】将一个订单的货拆分成多个批次,为每个批次标识上是哪个订单的货【改良】因为能辨认一批次货品所属订单,最小粒度从一个订单的货,改为一批次的。本来按订单运输,当初改为按批次运输,这个最小颗粒度的变动就是 http2 分帧:将一个响应或申请拆分成多个分帧片段【改良】最小粒度变成了批次,生产完一批次的货品,就能够马上传输,不须要等整个订单的货全副生产完才传输 签一次运输合同(三次握手)下订单(第一个申请)下订单(第二个申请)同时生产第一个订单和第二订单的货物(服务器计算)每生产批次货物,就给这批次的货打上标签,标识是哪个订单的货(分帧)筹备好了一批次货物,就发运输,不须要管是哪个订单的(传输)收货,从新分拣是哪个订单的货(依据分帧标识对应是那一次申请的响应)每生产批次货物,就给这批次的货打上标签,标识是哪个订单的货(分帧)筹备好了一批次货物,就发运输,不须要管是哪个订单的(传输)收货,从新分拣是哪个订单的货(依据分帧标识对应是那一次申请的响应)直到所有货物都传输实现结一次运输合同的账(四次挥手)总结 能够看出,tcp 的分帧与 http2 的分帧是不同维度的辨别tcp 的分帧维度是一个趟次运输(一个趟次运输一个货物),http2 的分帧维度是 一批货物(可能是一个货物,也可能是若干个货物)http2 分帧的实质是将本来一个订单(一个申请或响应),拆分成多个批次(多个帧),放大数据颗粒度,减少灵活性参考资料 https://segmentfault.com/q/1010000005167289https://blog.csdn.net/u598975767/article/details/112788129https://blog.wangriyu.wang/2018/05-HTTP2.html 为什么要分帧实质上,只有给一个订单的货(响应)打上订单(申请)标识,就能够标识是哪个订单的,就能够解决先订单依赖的问题(后一个订单不须要等前一个订单传输完),为什么须要将订单拆散为批次呢? 车的数量(TCP 通道宽度,流量宽度)是无限的,拆散了并不是放慢运输过程拆成批次(分帧)是为了从本源反对数据的调配传输,如果一个订单的量很大,按订单发货,就得等整个订单的货生产实现能力运输。而拆成批次(分帧)就能够将粒度减低,生产一个批次就运输一个批次,不须要等整个订单的货生产实现。如何了解 http1.1 是文本协定,http2 是二进制协定stackoverflow 中对应的探讨,对应国内论坛文本协定,信息传输过程经验以下步骤 编写文本,因为规定比拟涣散,可能存在多余的前后空格,多余的换行等状况传输文本,传输的是 ASCII,即文字对应的编码读取文本,了解文本,辨认 ASCII 码组合起来的单词,再通过字符串匹配的形式匹配意义二进制协定 这里的二进制,次要体现在两个方面「二进制帧封装」及「头部压缩」「二进制帧封装」行将数据打散,外包一层二进制帧数据(用于标识以后帧的个性) 所以是这一分帧层进行了二进制封装,而不是 http 的内容二进制,所以更适合的称说应该是「减少了二进制分帧层」这里的二进制帧数据,是用二进制为颗粒度代表数据的含意,每个 0 和 1 代表非凡的含意而文本协定,是通过 ASCII 对应的单词来表白含意,即代表数据的颗粒度不一样了,本来是有若干个字母,当初是由若干个比特「头部压缩」 ...

March 3, 2022 · 1 min · jiezi

关于http-2:HTTPHTTP2

HTTP/1.1 vs. HTTP/2 协定HTTP/2 以多种形式在 HTTP/1.1 的根底上进行了改良,以实现更快的内容交付和改良的用户体验,包含: 二进制协定:与 HTTP/1.1应用的文本协定相比,二进制协定耗费更少的带宽,更无效地解析并且更不容易出错。 此外,它们能够更好地解决空格、大写和行尾等元素。多路复用:HTTP/2是多路复用的,即它能够通过单个 TCP 连贯并行发动多个申请。后果,蕴含多个元素的网页通过一个 TCP 连贯传送。这些性能解决了 HTTP/1.1 中的行首阻塞问题,其中行前的数据包会阻止其余数据包的传输。头部压缩:HTTP/2 应用头部压缩来缩小 TCP 慢启动机制带来的开销。服务器推送:HTTP/2 服务器将可能应用的资源推送到浏览器的缓存中,甚至在它们被申请之前。 这容许浏览器在没有额定申请周期的状况下显示内容。进步安全性:Web 浏览器仅通过加密连贯反对 HTTP/2,从而进步了用户和应用程序的安全性。

December 5, 2021 · 1 min · jiezi

关于http-2:Go发起HTTP20请求流程分析后篇标头压缩

来自公众号:新世界杂货铺浏览倡议这是HTTP2.0系列的最初一篇,笔者举荐浏览程序如下: Go中的HTTP申请之——HTTP1.1申请流程剖析Go发动HTTP2.0申请流程剖析(前篇)Go发动HTTP2.0申请流程剖析(中篇)——数据帧&流控制回顾在前篇(*http2ClientConn).roundTrip办法中提到了写入申请header,而在写入申请header之前须要先编码(源码见https://github.com/golang/go/...)。 在中篇(*http2ClientConn).readLoop办法中提到了ReadFrame()办法,该办法会读取数据帧,如果是http2FrameHeaders数据帧,会调用(*http2Framer).readMetaFrame对读取到的数据帧解码(源码见https://github.com/golang/go/...)。 因为标头压缩具备较高的独立性,所以笔者基于下面提到的编/解码局部的源码本人实现了一个能够独立运行的小例子。本篇将基于本人实现的例子进行标头压缩剖析(残缺例子见https://github.com/Isites/go-...)。 单刀直入HTTP2应用 HPACK 压缩格局压缩申请和响应标头元数据,这种格局采纳上面两种技术压缩: 通过动态哈夫曼代码对传输的标头字段进行编码,从而减小数据传输的大小。单个连贯中,client和server独特保护一个雷同的标头字段索引列表(笔者称为HPACK索引列表),此列表在之后的传输中用作编解码的参考。本篇不对哈夫曼编码做过多的论述,次要对双端独特保护的索引列表进行剖析。 HPACK 压缩上下文蕴含一个动态表和一个动静表:动态表在标准中定义,并提供了一个蕴含所有连贯都可能应用的罕用 HTTP 标头字段的列表;动静表最后为空,将依据在特定连贯内替换的值进行更新。 HPACK索引列表意识静/动静表须要先意识headerFieldTable构造体,动静表和动态表都是基于它实现的。 type headerFieldTable struct { // As in hpack, unique ids are 1-based. The unique id for ents[k] is k + evictCount + 1. ents []HeaderField evictCount uint64 // byName maps a HeaderField name to the unique id of the newest entry with the same name. byName map[string]uint64 // byNameValue maps a HeaderField name/value pair to the unique id of the newest byNameValue map[pairNameValue]uint64}上面将对上述的字段别离进行形容: ...

October 26, 2020 · 8 min · jiezi

关于http-2:query-params过大引发的failed-to-load-response

概述http2 web server 在query params过大时,服务端会返回错误码ENHANCE_YOUR_CALM。因为chrome浏览器在version: 86.0.4240.111中的调试窗口没有显示具体的错误码。定位起来没那么间接。 定位过程有反馈在大量勾选指标时, 执行指令失败. inspect如图: 无业务日志. 在业务容器抓包, 申请没到业务容器.查看access.log, 包体达到了tengne.在客户端抓包. 如图:能够看到, GOAWAY后, 服务端断开了链接. 具体谬误如下:查阅rfc7540 The endpoint detected that its peer isexhibiting a behavior that might be generating excessive load.既然是query param过大引发的服务器断开链接, 从nginx中的文档找到了可能的参数:http2_max_field_size改为16k后问题解决. 其它切换到 http1.1 有相似的谬误http 414

October 24, 2020 · 1 min · jiezi

关于http-2:HTTP2-协议常见疑问译

为什么订正 HTTP 协定HTTP/1.1 利用于 Web 已有15年的历史,协定的缺点和有余开始浮现。 比照过来,当初的 web 页面须要加载更多资源,HTTP1.x 协定规定一个 TCP connection 不能并行发动多个 request 申请,这使得页面在疾速加载大量资源时变得艰难。 为解决上述问题,HTTP1.1 协定容许浏览器应用多个 TCP connection 来并行发动多个 request 申请。这种解决形式存在缺点,应用太多的 connection 会事与愿违(TCP 拥塞管制会导致网络效率低下),同时也会呈现不偏心景象(浏览器都设法占用超出它本该调配的网络资源)。 HTTP/2 跟 SPDY 有什么关系在 SPDY 协定被 Mozilla 和 nginx 等厂商实现后,绝对于 HTTP/1.x 展现出了显著的性能晋升,这时 HTTP/2 协定的探讨和指定开始提上议程。 通过一轮提议和投票,最被抉择了 SPDY/2 作为 HTTP/2 协定的根底。尔后,在工作组和实现者的探讨下 HTTP/2 协定又做出了一系列变更。在这个过程中,SPDY 协定的外围开发者参加了 HTTP/2 协定的开发,这其中包含 Mike Belshe 和 Roberto Peon。 2015年9月,Google 发表为了反对 HTTP/2 协定,未来不再反对 SPDY 协定。 HTTP/2 跟 HTTP/1.x 的区别总体来说区别有以下几点: 应用二进制来代替文本格式应用多路复用来代替有序和阻塞应用一个 connection 来解决并行申请应用 header 压缩来减小 header 大小容许服务端应用 push 来事后推送客户端须要的 cache为什么 HTTP/2 是二进制的二进制协定解析效率更高,更节俭网络资源,绝对于 HTTP/1.1 协定应用文本格式的空格或空行来解析数据,二进制协定更不容易出错 ...

October 12, 2020 · 1 min · jiezi