Http 2.0 了解

Http2.0 特点:

不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。

总之:不改变上一代http的语义,但是却能突破上一代标准的性能限制。

实现方法:二进制分帧

将传输信息分为两个帧,分别是Headers帧和Data帧。

在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。

HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。

HTTP 首部压缩

HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型)只 需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。

所以通过首部开销的零字节实现首部压缩。

web端性能优化使用文件合并和sprite(雪碧图)就是为了减少网络请求次数,减少协议的开销。从而加快网站加载的速度。

HTTP 2.0 所有请求在一个TCP 连接上完成

HTTP 2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应 着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。

HTTP性能的关键在于低延迟而不是高带宽!大多数HTTP 连接的时间都很短,而且是突发性的,但TCP 只在长时间连接传输大块数据时效率才最高。HTTP 2.0 通过让所有数据流共用同一个连接,可以更有效地使用TCP 连接,让高带宽也能真正的服务于HTTP的性能提升

同时,单链接多资源的方式,使到至上而下的层面都得到了好处:

  • 可以减少服务链接压力,内存占用少了,连接吞吐量大了
  • 由于 TCP 连接减少而使网络拥塞状况得以改观,同时减少了服务器的端口的使用。
  • 慢启动时间减少,拥塞和丢包恢复速度更快。

请求一个页面http://www.qq.com。页面上所有的资源请求都是客户端与服务器上的一条TCP上请求和响应的!

资源合并减少请求”的优化手段对于HTTP2.0来说是没有效果的,

并行双向字节流的请求和响应

客户端和服务器可以把HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。

总结就是:分解为帧 — 乱序发送 —重新组合

HTTP2.0的请求优先级

每个HTTP2.0流里面有个优先值,这个优先值确定着客户端和服务器处理不同的流采取不同的优先级策略,高优先级的流都应该优先发送,但又不会绝对的遵守,可能又会引入首队阻塞的问题:高优先级的请求慢导致阻塞其他资源交付。分配处理资源和客户端与服务器间的带宽,不同优先级的混合也是必须的。

HTTP2.0的服务器推送

HTTP 2.0 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。
当浏览器请求一个html,服务器其实大概知道你是接下来要请求资源了,而不需要等待浏览器得到html后解析页面再发送资源请求。我们常用的内嵌图片也可以理解为一种强制的服务器推送。

使用HTTP 2.0:
HTTP1.0 的前端优化:Sprite图,文件合并,域名分区都不需要了

转载自AlloyTeam:http://www.alloyteam.com/2015/03/http2-0-di-qi-miao-ri-chang/

<think>好的,我现在需要帮助用户解决关于易语言实现HTTP/2.0协议的问题。首先,我要确认用户的需求是什么。用户可能希望用易语言编写一个支持HTTP/2.0的客户端或服务器,但不太清楚如何入手。 首先,我应该考虑易语言本身的特性。易语言是一种中文编程语言,主要面向Windows平台,其标准库对网络通信的支持可能有限。HTTP/2.0相比HTTP/1.1有较大的改进,比如多路复用、头部压缩等,这些都需要底层库的支持。 接下来,我需要确认易语言是否有现成的库支持HTTP/2.0。查阅资料发现,易语言的标准网络库通常基于WinHTTP或WinINet,这些库可能只支持到HTTP/1.1。要实现HTTP/2.0,可能需要调用更底层的API,或者使用第三方库。例如,libcurl是一个支持HTTP/2.0的C库,如果易语言能够调用DLL,那么或许可以通过封装libcurl来实现。 用户可能需要一个示例教程,但直接实现HTTP/2.0在易语言中可能比较复杂。我应该建议用户先了解HTTP/2.0的基础,比如帧结构、流控制等,然后考虑如何通过外部库进行集成。同时,提醒用户注意易语言在高级网络协议支持上的限制,可能需要借助其他工具或语言。 另外,用户提到了OAuth 2.0的引用,虽然这和HTTP/2.0不同,但可能用户有身份验证的需求。需要区分两者,确保回答专注于HTTP/2.0的实现。 总结步骤:1. 分析易语言的网络支持能力;2. 探讨调用外部库的可能性;3. 提供替代方案或建议;4. 给出学习资源和参考资料。</think>要实现HTTP/2.0协议需要理解其帧结构、流控制、头部压缩等核心特性。易语言由于其原生网络库的限制,建议通过以下两种方式实现: 1. **调用外部DLL方案** - 使用libcurl(需7.33.0+版本)的DLL封装 ```easy-language DLL命令 curl_easy_init, 整数型, "libcurl-x64.dll", "curl_easy_init" DLL命令 curl_easy_setopt, 整数型, "libcurl-x64.dll", "curl_easy_setopt", <参数略> ``` 2. **协议帧构造示例** HTTP/2.0数据帧基础结构: $$ \text{Frame格式} = \text{Length(24bit)} + \text{Type(8bit)} + \text{Flags(8bit)} + \text{StreamID(31bit)} + \text{Payload} $$ **实现步骤**: 1. 建立TLS连接(HTTP/2强制加密) ```easy-language 连接 = 连接SSL服务器("example.com",443) ``` 2. 发送连接前言 ```easy-language 发送数据(连接,"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n") ``` 3. 构造HEADERS帧: ```easy-language .局部变量 头部块, 字节集 头部块 = HPACK编码(":method GET\r\n:path /index.html") 帧数据 = 构造帧(类型=0x1,流ID=1,标志=0x5,数据=头部块) ``` **注意事项**: 1. 必须实现HPACK压缩算法(RFC7541) 2. 需要处理流优先级和依赖关系 3. 建议使用Wireshark抓包验证协议交互过程[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值