| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> HTTP进化史 -> 正文阅读 |
|
[网络协议]HTTP进化史 |
引言 应用层协议是网络面试中比较热门的考点,而HTTP协议又是应用层中比较常考的点,毕竟现在做web端开发的是比较流行的,今天我们就来聊一下现在的HTTP协议是怎样一步步过来的,我们主要分成HTTP1.1之前,HTTP1.1,HTTP2.0,HTTP3这四个部分来聊。 HTTP 1.1以前 这个版本的HTTP协议是久远一点的,它比较出名的特点是使用短连接, 大名鼎鼎的HTTP1.1 时间来到了HTTP1.1,这个版本是97年发布了,距今也过去很长时间了,不过目前广泛使用的还是它,我们来看一下它相比于以前的版本多了那些新特新。
我们重点来聊一下第一点和第三点。 先看第一点,顺便也解答一下上面留下的问题 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。 然后我们结合一下当时的历史场景,其实当时的用户上网就是单纯的浏览一个网页,以浏览为主,当时用户其实不需要发送太多的请求,而不是像现在交互场景很多,登录上B站后需要点赞和发弹幕各种操作。所以如果当时使用长连接的话,其实是很浪费资源的行为。而现在为什么适用呢,就是因为现在的网站操作变得更加频繁了,如果给用户的每次操作都进行三次握手和四次挥手,那么用户的时延就很高了,所以换成了长连接用以改善用户的体验 说完了第一点,我们在来看一下第三点,什么叫做 在一个TCP连接上可以传送多个HTTP请求和响应,但服务器必须按照客户端请求的先后顺序依次回送响应的结果(不允许同时存在两个并行的响应),以保证客户端能够区分出每次请求的响应内容。 在以前,HTTP的请求和响应是串行进行的,也就是B端发送一个请求,等待S端返回响应后,B在发送一个请求,等待S返回响应后再发送请求。不过再HTTP1.1出现了Pipelining 技术,这个技术其实是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应;只不过,客户端还是要按照发送请求的顺序来接收响应。) 至于标准为什么这么设定,我们可以大概推测一个原因:由于 HTTP 1.1 是个无状态的文本协议,同时返回的内容也并不能区分对应于哪个发送的请求,所以顺序必须维持一致。 比如你向服务器发送了两个请求 GET /query?q=A 和 GET /query?q=B,服务器返回了两个结果,浏览器是没有办法根据响应结果来判断响应对应于哪一个请求的。 理想情况下这样确实可以优化HTTP的请求响应所花费的时间,不过显示很骨感
按照标准,服务器应该按照收到请求的顺序返回结果,假设服务器在处理首个请求时花费了大量时间,那么后面所有的请求都需要等着首个请求结束才能响应。 所以现代浏览器默认是不开启 HTTP Pipelining 的。 不过问题还是要解决的,这就有了我们的HTTP2.0 HTTP2.0 我们先看一下HTTP2.0相比于HTTP1.1有什么改进 流:可以承载双向的消息(双向指响应和请求,如http请求是一个流,响应是一个流)。每个流有唯一的整数标识符,为了防止两端流id冲突,客户端发起的流具有奇数ID,服务端发起的流具有偶数ID; 我们重点看一下(1)(2)也是HTTP2.0的所重点解决的问题。 先来解释一下多路复用,这里要区别长连接,长连接是实际上同一时间内还是只能由一个HTTP连接使用,而多路复用指的是同一时间有多个HTTP连接使用同一个TCP连接。 现在看来应用层的阻塞暂时解决了,不要忘了运输层的阻塞,因为HTTP使用的是TCP。 HTTP3.0 由于HTTP协议使用TCP作为运输层,自然而然避免不了tcp的队头阻塞问题,在3.0中弃用了TCP改用了由UDP改进而来的QUIC(谷歌做的)。
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 21:06:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |