关于HTTP,你能侃侃而谈嘛?

1,651 阅读11分钟

本文正在参加「金石计划 . 瓜分6万现金大奖」

前言

HTTP,超文本传输协议(HyperText Transfer Protocol)。HTTP是用于从万维网服务器传输超文本到本地浏览器的传送协议,是万维网上能够可靠交换文件(如文本,声音,图像等多媒体文件)的重要基础。

可首先了解OSI的体系结构(既复杂又不实用),包括7个层次:

1、物理层(最底层)
2、数据链路层
3、网络层 ---(IP协议)
4、传输层 ---(TCP协议)
5、会话层
6、表示层
7、应用层 ---(HTTP协议)
一、HTTP 0.9

HTTP 0.9主要用来传递html的超文本内容,规定了客户端发请求、服务端响应请求的通信模式。请求的报文只支持GET请求。另外,请求报文的内容只有一行GET、请求的文件路径以及传输纯文本。其建立在TCP(传输控制协议)上,具体流程如下:

客户端->dns->建立TCP连接(ACK建立连接请求,SNK服务端应答请求)->客户端发起请求->服务端响应->断开TCP连接

一些残留缺陷

(1)请求方式单一,只能使用GET请求

(2)请求文本内容简单,只能发送纯文本内容,不能发送超文本内容

(3)没有HTTP标头

(4)没有状态码/错误码提示

(5)没有cookie缓存机制

二、HTTP 1.0

基于HTTP 0.9,单纯的文本内容显然而然不可能满足用户的需求。HTTP 1.0传输过程:客户端->dns->建立TCP连接->客户端发起请求(请求体、请求头)->服务端响应(响应头、响应体)->断开TCP连接。

相比于HTTP 0.9,HTTP 1.0有以下特性和优化:

1、引入请求头和响应头
HTTP请求格式:动作 路径 HTTP/1.1
                      key1:value1
                      key2:value2
请求头:
(1)accept:text/html
(2)accept-encoding:gzip;dflate;br;
(3)accept-Language:zh-CN;zh
(4)acceptCharset:ISO-8859-1;utf-8

image.png

HTTP响应格式:HTTP/1.1 状态码 状态描述
                            key1:value1
                            key2:value2
                            ...
                            Body
响应头:
(1content-encoding:br2content-type:text/html;charset=UTF-8

image.png

2、引入状态码/错误码

在HTTP 1.1中的状态码分为五大类:

(1)100-199 用于指定客户端应相应的某些动作。

(2)200-299 用于表示请求成功。

(3)300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。

(4)400-499 用于指出客户端的错误。

(5)500-599 用于支持服务器错误。

唠一唠常见的状态码:

100(继续)请求者应继续提出请求。服务器返回此码表示已收到请求的第一部分,正在等待其余部分。
101(切换协议)  请求者已要求服务器切换协议,服务器已确认并准备切换。
​
200(成功)      服务器已成功处理了请求。
201(已创建)    请求成功并且服务器创建了新的资源。
202(已接受)    服务器已接受请求,但尚未处理。
203(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204(无内容)    服务器成功处理了请求,但没返回任何内容。
205(重置内容)  服务器成功处理了请求,但没返回任何内容,并且要求请求者重置文档视图
206(部分内容)  服务器成功处理了部分 GET 请求。
​
300(多种选择)针对请求,服务器可执行多种操作。服务器可根据请求者选择一项操作,或提供操作列表供请求者选择。
301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(GET/HEAD 请求的响应)时,会自动将请求者转到新位置。
302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。
303(查看其他位置)请求者应对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。
304(未修改)自上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
305(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307(临时重定向)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。
    
400(错误请求) 服务器不理解请求的语法。
401(未授权) 请求要求身份验证。对于登录后请求的网页,服务器可能返回此响应。
403(禁止) 服务器拒绝请求.
404(未找到)服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。
​
405(方法禁用) 禁用请求中指定的方法。
406(不接受) 无法使用请求的内容特性响应请求的网页。
407(需要代理授权) 指定请求者应当授权使用代理。
408(请求超时) 服务器等候请求时发生超时。
409(冲突) 服务器在完成请求时发生冲突。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,以及两个请求的差异列表。
410(已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415(不支持的媒体类型) 请求的格式不受请求页面的支持。
416(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态码。
417(未满足期望值) 服务器未满足”期望”请求标头字段的要求。
    
500(服务器内部错误) 服务器遇到错误,无法完成请求。
501(尚未实施) 服务器不具备完成请求的功能。如服务器无法识别请求方法时可能会返回此代码。
502(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503(服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505(HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
3、引入Cache(缓存机制)
(1)强缓存

设置(Cache-Control: max-age=315360000),会开启强缓存

命中缓存的三个条件:

A.两次请求的url完全相同

B.两次动作相同 (GET/POST)

C.请求头不带(Cache-Control:no-cache和Pragma:no-cache,如无痕浏览器)

(2)协商缓存
设置响应头'Last-Modified''文件修改时间' 
'etag':"cb8f9961abe6464e317d4f353dbb0123"
4、引入文件压缩方式

文件压缩方式有:gzip,dflate,br

HTTP 2.0可传输更多类型的文件,如脚本、样式、图片、音频等文件。浏览器解压文件的前提需要四个条件:

(1)浏览器要知道服务器返回的文件类型的是什么? 

(2)浏览器要知道服务器压缩文件的方法? 

(3)浏览器要知道服务器返回的语言版本? 

(4)浏览器要知道服务器返回文件的编码类型?

5、残留缺陷:

带宽用不满(HTTP2.0诞生)

(1)TCP的慢启动; (2)同时启用多条TCP链接,会相互竞争带宽 ;(3)HTTP队头阻塞
三、HTTP 2.0

优化:一个域名只允许设置一个长链接

(1)一个域名只使用一个TCP长链接(解决了TCP的慢启动问题;解决了多条TCP连接相互竞争资源的问题) -多路复用:将请求分成一帧一帧的数据进行传输(利用二进制分成)

(2)可以设置请求的优先级

(3)服务器推送(提前推送)

(4)头部压缩

缺点:

(1)还是存在TCP的队头阻塞问题。http 2.0 还是建立在TCP上,TCP是单链接,本身存在队头阻塞问题,发生丢包会超时重传

(2)传输效率(受TCP上次握手影响)

TCP的这些缺陷导致了HTTP 2.0的不足,TCP的僵化问题很难解决。关于TCP在此补充一下: TCP是一种面向连接的协议,即提供面向连接的服务,传送的数据单位协议是TCP报文段(segment);TCP不提供广播或多播服务,但是由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销,这不仅使学徒数据单元的首部增大很多,还要占用许多的处理机资源。

四、HTTP 3.0
1、面向无连接的UDP 协议(传输层的协议)

UDP(User Datagram Protocol)用户数据报协议,是一种无连接协议,提供无连接服务。在传送数据报之前不需要先建立连接。同时对方的运输层在收到UDP报文后,不需要给出任何确认;UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。UDP传送的数据单位协议是UDP报文或用户数据报。 (1)只是数据报文的搬运工,不能保证数据有序传输,以及不能保证数据不丢失(丢包)

(2)TCP(也是传输层的协议)网络好传输会快一点,也即是网络状态会影响数据的传输速率;但是UDP不存在这种现象,没有流量拥塞控制,也不需要像TCP(邮政)一样发生三次握手、四次挥手(进行有效传输); 而UDP随时可传输 。

优点:

(1)高效性。虽然UDP不提供可靠交付,但是在某些情况下UDP是一种最有效的工作方式 (2)传输方式多样性。如一对多(多播),多对多(广播),多对一,一对一(单播)

缺点: (1)不可靠性。(传输前是什么传输后还是什么,不保证数据有效传达),易产生丢包

2、QUIC 协议

(QUIC制定时还未在HTTP 3.0启用,基于UDP协议更新之后才使用) 解决HTTP 2.0中TCP协议带来的缺陷(绕过HTTP协议),集TCP和UDP优点于一身:

(1)类似于TCP的流量控制、传输的可靠性 

(2)集成了TLS加密功能
TLS协议(传输层安全性协议:用于在两个通信应用程序之间提供保密性和数据完整性): 由TLS记录协议和TLS握手协议两层组成 

A.对称加密 其加密过程和解密过程使用同一个密钥,加密过程相当于用原文+密钥可以传输密文,同时解密过程用密文-密钥可以推出原文 对称加密解密的速度比较快,适合数据比较长时的使用。但是,对称加密的安全性相对较低

B.非对称加密 非对称加密采用了两个密钥,一般使用公钥进行加密,使用私钥进行解密。非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。 非对称加密的安全性较高。

(3)实现了HTTP 2.0的多路复用

(4)快速握手(重新指定握手机制)

结尾

虽然HTTP 3.0尚未普及应用,但是从HTTP 0.9 到HTTP 3.0,一直在优化和增强。

HTTP 0.9:只支持纯文本内容的GET请求,服务端收到请求返回ASCII的文档,从而确定服务端和客户端的通信。

HTTP 1.0: 除了解决了HTTP 0.9中,用户对传输数据类型的需求,还通过引入请求头和响应头、引入状态码、引入Cache缓存机制、引入文件压缩方式等的方式进行了优化。

HTTP 2.0:解决了HTTP 1.0中带宽用不满的问题,同时支持一次TCP可以最多连接6个HTTP并行请。但是由于HTTP 2.0依旧是建立在TCP协议上的,高并发问题随之产生,始终存在TCP的队头阻塞问题,从而导致HTTP 1.0的不足,TCP的僵化问题也较难解决。

HTTP 3.0:还尚未普及,协议改成UDP协议。