走进HTTP
HTTP是什么
HTTP:超文本传输协议(Hypertext transfer Protocol)
首先来说,文本我们都知道是什么,那什么是超文本呢?
开始,我们和电脑交互只能通过text,没有其他东西。而在接上网线后,我们彼此可以通过两台电脑交流,在网线上传输01,对text进行一个交流和分享。
而渐渐的,我们发现只靠text没办法满足我们的需求,逐渐就有了图片、视频、超链接等的需求,这些是text文本的扩充,也就是超文本(Hypertext),而传输这些资源的协议就是超文本传输协议(Hypertext transfer Protocol)
在知道协议是什么后,我们可以思考下为什么需要协议
我们在说话时要按照一定的语法,诸如要有主谓宾,这样对方才能知道我们在说什么。协议也是这样,我们线上传输的都是01数据流,需要按一定的规则才能让对方理解。
首先我们需要让协议给我们明确的边界,我们需要明确知道信息是从什么时候开始的以及是到什么时候结束的,然后我们需要协议能够携带信息,去描述信息的内容,以及信息是什么类型的,例如图片、视频等,然后将消息塞到其对应的地方
协议里有什么
一个post请求在协议层做了什么
比如说我们给其他人发送消息,要和对方一起去看电影,然后发送一条post请求
- 其中第一条信息为请求行,POST为请求方法,/sis为url,HTTP/1.1为协议及其版本号。
- 后面四行则是协议的源数据,即请求头,以:分隔的kv对。
- 而在最后一行就是我们想说的内容,也就是body部分,即请求体
在对方接收到我们body中的内容后,将对我们的消息做出回应
- 第一行为状态行,HTTP/1.1为协议及其版本号,200为状态码,OK为状态码200的描述
- 随后的五行是协议的源数据,即响应头,以:分隔的kv对
- 最后一行则是对方的回应内容,也就是body部分,即响应体
总结一下,协议里总共有三个大体内容,即请求行/状态行、请求头/响应头、请求体/响应体*
请求行/响应行
- 请求行分为方法名、URL、版本协议。
常见的方法名:GET、POST、PUT、DELETE、HEAD、TRACE、PATCH、CONNECT、OPTIONS
- 状态行分为协议版本、状态码、状态码描述。
状态码:1xx:信息类、2xx:成功、3xx:重定向、4xx:客户端错误、5xx:服务器错误
请求流程
不足与展望
- HTTP1
- 首先对于HTTP1来说,因为它是基于TCP协议,所以会有一个队头阻塞的问题,也就是后续的分片要等待前面的分片到来才能继续发送后续数据,否则会一直等待;
- 同时它的传输效率也比较低,像上面我们发送的POST请求信息中,其中附带的额外信息非常多,甚至超过了我们原本想要发送的信息内容长度。除此之外,HTTP1也不支持多路复用,一个请求发送结束前不能发送其他请求
- HTTP1是明文传输,不安全,发送的信息可以被其他人看到
- HTTP2
- HTTP2解决了多路复用问题
- 采用了头部压缩的方式,把一些重复的Header在两边缓存起来,减少一些头部的数据量
- HTTP2是一个二进制协议,解析起来更加高效
- 但是HTTP2仍是基于TCP协议,还是有队头阻塞问题
- QUIC
- 基于UDP协议,解决了队头阻塞问题
- 优化加密算法,减少握手次数
- 支持快速启动