ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 介绍 ### HTTP 超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应用层协议。它被设计用于Web浏览器和Web服务器之间的通信,但它也可以用于其他目的。 ## 1. HTTP0.9 * 仅支持GET请求方法,并且仅能请求访问HTML格式的资源。用于网页内容获取。 ~~~ get index.html ~~~ ## 2. HTTP1.0 * 支持GET, POST 和 HEAD请求方法 * 请求与回应格式发生更改,除了传输数据外,每次通信包含头信息(header),用于描述一些信息 * 支持设置 `Content-Type` 请求访问多种数据格式; * 新增状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。 > 在1.0版本中,浏览器每次请求都需要建立新的TCP连接,服务器完成请求后关闭这次连接。也就是说不支持 keep alive > > 由于TCP连接的新建成本高,所以1.0版本性能较差。 ## 3. HTTP1.1 * 在1.0基础上,新增OPTIONS, PUT, DELETE, TRACE 和 CONNECT请求方法 * 支持长连接,TCP连接默认不关闭(可在客户端发送总后一个请求时,发送 `Connection: close`),可以被多个请求复用,即一个TCP连接可允许多个HTTP请求 * 加入管道机制:客户端可同时发送多个请求,服务器会根据接收的顺序,依次回应。(容易出现队头堵塞的问题:需要返回的数据过大时,后续请求得等待回应完成) * 增加状态码100,客户端事先只发送一个只带头域的请求,服务器接收此请求则返回100,客户端还需发送带实体的完整请求。 ## 4. HTTP2.0 > https支持的基础上,增加的一些内容、复杂度 * 增加双工模式,即不仅客户端可同时发送多个请求,服务端也能同时处理多个请求。 * 新的二进制格式:http1.0、1.1的解析是基于文本,2.0引进二进制分帧(在应用层与传输层间增加二进制分帧层),将所有数据进行分割,并采用二进制格式编码。改进传输性能,实现低延迟高吞吐量 * 支持多路复用:同一个链接可并发处理多个请求 * 压缩header,从1.0开始添加header每次通信时传递,压缩后header数据体积更小,传输更快。 ## 5. HTTP1.1 与 HTTP2.0 测试结果 >[success] 说明: > 测试 http2.0 的前端服务器配置在上面两个章节已做说明,另外: > 1. 受网络硬条件限制,测试结果可能有所偏差,但可通过比较其他因素,判断最终测试结果 > 2. http2.0 测试需要前后端都配置以支持 http2 ,两者缺一不可 > 3. post 测试请求时上传数据到服务器并再由服务器返回上传完成的数据 ### 5.1 HTTP1.1 get 请求测试 HTTP1.1 get 请求三次的结果图 ![](https://img.kancloud.cn/96/63/966333f74a0f78b03aa4a2a1235bd028_874x286.png) #### 5.1.1 请求耗时分析 HTTP1.1 第一次 get 请求,与 HTTP2.0 相比,在初始化连接时,因不含有 SSL 握手,响应速度略快 ![](https://img.kancloud.cn/9f/cc/9fccd8a2a525f9fa0a68368e0a47c613_864x369.png) 第二次 get 请求耗时相对较少,不再有 DNS Lookp、initial connection,同样的第三次亦如此 ![](https://img.kancloud.cn/e5/f4/e5f468ed627aa0dc8b7bf4c960907988_857x347.png) ### 5.2 HTTP2.0 get 请求测试 HTTP2.0 get请求三次的结果图 ![](https://img.kancloud.cn/9a/d6/9ad62fb444cf68de98c1fc7826c44e50_1152x352.png) #### 5.2.1 请求耗时分析 HTTP2.0 第一次 get 请求耗时较久,除网络因素外,是由于 DNS Lookp(域名解析)、initial connection(初始化连接)、SSL(SSL握手,属于初始化连接) ![](https://img.kancloud.cn/a2/5b/a25bc6e800912c16360278143e9d14f5_1209x422.png) 第二次 get 请求耗时相对较少,不再有 DNS Lookp、initial connection,同样的第三次亦如此 ![](https://img.kancloud.cn/68/4c/684c6d3c605e2dc92a37b10ab7a6814d_1205x375.png) ### 5.3 http1.1 多次 post 请求测试 ![](https://img.kancloud.cn/cb/f3/cbf3c9ad52ab19a15f4e89b85469e8b8_1174x555.png) ### 5.4 http2.0 多次 post 请求测试 ![](https://img.kancloud.cn/04/d8/04d88dfb6eeaf2e788e9a71da8ef43ee_1121x513.png) ### 5.5 测试结果表格展示 >[warning] post 请求测试结果截图说明与get请求基本相似,不再详细说明。受网络环境因素影响,所有测试数据仅供参考 | | http1.1 | http2.0 | | --- | --- |--- | | 测试请求次数 | 3次 | 3次 | | get 请求时长 | 17ms 8ms 9ms | 66ms 11ms 10ms | | get 请求数据量 | 34.3kb | 34.3kb | | post 请求时长 | 17ms 2ms 2ms | 62ms 7ms 5ms | | post 请求上传数据量 | 43.8kb | 43.8kb | ### 5.6 结论: * HTTP2.0 在第一次数据请求时,会因为初始化连接(TCP握手+SSL握手),响应速度会慢于HTTP1.1,但在之后,同一连接再次请求数据时,不再会有初始化连接以及域名解析,HTTP1.1 亦如此,两者响应速度相差不多,但这与预期所想不一致,预想的是 http2.0 快于 http1.1