原文始发于:https://mp.weixin.qq.com/s/5Y8XD_T4F0U7SsDahc6nww
http是什么
http是超文本传输协议,也就是Hyper Text Transfer Protocol,是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
先看一下http名字:超文本传输协议。顾名思义,它可以拆成三部分,分别为:超文本、传输、协议。那我们接下来去聊一聊每部分的含义。
首先http是一个协议,那么协议到底是什么?
其实"协议"并不仅仅局限在计算机世界里,在现实生活中"协议"也是无处不在的,比如租房时会签订一个租房合同、刚毕业的大学生会和公司签订一个三方协议、员工入职时会签订一个保密协议等等,协议渗透到生活的方方面面。
之所以出现"协议",也是对参与者的一种行为约定和规范。俗话说:"没有规矩,不成方圆",也体现出了协议的重要性。
http是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。
协议聊完了,那接下里看看http第二组成部分:传输
所谓的传输,就是把一大推东西从A点搬到B点,或者从B点搬到A点,即"A<==>B"。
就拿网络冲浪举例子吧,迈莫在手机上浏览公众号<<迈莫coding>>,发现一篇文章<<http到底是有什么魔性,备受青睐>>对自己帮助更大,随手点了个赞。
拿点赞这一操作来说,客户端需要将点赞人的ID、文章ID等必备数据给到服务器,服务器拿到这些数据去更新数据库,更新完成之后,将现有的点赞数通知客户端,客户端拿到服务器发送过来的数据后,将点赞数更新。
说到这里,你也差不多理解了http的第二层的含义了吧。
说完"协议"和"传输",现在我们终于到了http的第三部分:超文本
既然http是"传输协议",那么它传输的"超文本"到底是什么?它为什么是超文本而不是文本?超文本和文本区别是什么?接下来,我们慢慢聊。
先说文本是什么。文本表示http传输的是完整的、有意义的数据,可以被浏览器、服务器这些上层应用程序处理。不是tcp/udp这些底层协议里被切分的杂乱无章的二进制包。
超文本就是"超越了普通文本的文本",不再局限于简单的文字,而是文字、图片、音频和视频等的混合体,最关键的是“超链接”,能够从一个"超文本"跳跃到另一个"超文本",形成复杂的非线性、网状的机构关系。
到这里,我们详细解释了http是超文本传输协议,最后用一句话来概括:http是一个计算机世界里专门在两点之间传输文字、图片、音频和视频等超文本数据的约定和规范。
http特点
上述聊完了http的含义,接下来一起看看http为什么这么备受青睐,他到底有什么魔性,让互联网人无法自拔。
我用一张图来简单概括一下http的特点,然后再分开细聊。先有整体思想,然后细看每个特点。
- 简单快速
客户端访问服务端时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST 等等。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
- 灵活可扩展
在使用http数据传输过程中,请求主体body 也不再限于文本形式的 TXT 或HTML,而是能够传输图片、音频视频等任意数据。也可以在请求头header 中添加一些特性,比如请求方法、版本号、状态码段等。
- 可靠性传输
http是基于tcp/ip协议的,而由于tcp是可靠性传输协议,所以 HTTP 自然也就继承了这个特性,能够在请求方和应答方之间“可靠”地传输数据。
不过我们必须正确地理解“可靠”的含义,HTTP 并不能 100% 保证数据一定能够发送到
另一端,在网络繁忙、连接质量差等恶劣的环境下,也有可能收发失败。“可靠”只是向使用者提供了一个“承诺”,会在下层用多种手段“尽量”保证数据的完整送达。
- 无状态
HTTP 协议是无状态协议。无状态,是指协议对于事务处理没有记忆能力。无状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
我们可以再对比一下 UDP 协议,不过它是无连接也无状态的,顺序发包乱序收包,数据包发出去后就不管了,收到后也不会顺序整理。而 HTTP 是有连接无状态,顺序发包顺序收包,按照收发的顺序管理报文。
http 1.0/1.1/2.x 版本
http1.0 比较 http1.1
- 长连接
处理在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟。在 HTTP1.1中 默认开启Connection:keep-alive ,一定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。
- 请求流水线Pipelining
HTTP1.1 还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
http1.x 比较 http2.x
- 多路复用机制
http2.0 采用多路复用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
- 头部数据压缩
在HTTP1.1中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。
而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
为此,将请求头部进行微压缩,可以让那些请求秩序一个来回搞定,大大节约了时间和资源的浪费。
- 采用二进制格式
比起文本协议,二进制解析起来更加高效,"线上"更紧凑,更重要的是错误更少。
- 服务器推送
服务端推送是一种在客户端请求之前发送数据的机制。网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP1.1中这些资源每一个都必须明确地请求。这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。
为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。
到这里,http的概念、特点、版本差异及其特点也就告一段落了,今天就到这里。
咱们下期再见~~~
文章也会持续更新,可以微信搜索「 迈莫coding 」第一时间阅读。每天分享优质文章、大厂经验、大厂面经,助力面试,是每个程序员值得关注的平台。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。