讲 http的文章,对http1.0, 1.1 ,2,3进行了比较,摘自:https://mp.weixin.qq.com/s/qzzEgRpt9f-UlTLnWGrJEw
https://mp.weixin.qq.com/s/Mc7vpJw5r_vcbsxLXwfeNA
https://mp.weixin.qq.com/s/qzzEgRpt9f-UlTLnWGrJEw
「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
「206 Partial Content」是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Moved Permanently」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。
「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端
「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。
服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度,如:Content-Length: 1000
Connection 字段最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。如:Connection: keep-alive。HTTP/1.1 版本的默认连接都是持久连接
Content-Type 字段用于服务器回应时,告诉客户端,本次数据是什么格式。如:Content-Type: text/html; charset=utf-8 # 发送的是网页,而且编码是UTF-8。
客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式。
Content-Encoding 字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式;客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法
先说明下安全和幂等的概念:
-
在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。
-
所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。
HTTP 协议里有优缺点一体的双刃剑,分别是「无状态、明文传输」
1)无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息;无状态的坏处,既然服务器没有记忆能力,它在完成有关联性的操作时会非常麻烦。
2)明文意味着在传输过程中的信息,是可方便阅读的,通过浏览器的 F12 控制台或 Wireshark 抓包都可以直接肉眼查看,为我们调试工作带了极大的便利性。
HTTP 的安全问题,可以用 HTTPS 的方式解决,也就是通过引入 SSL/TLS 层,使得在安全上达到了极致
短连接:HTTP<=1.0; 长连接:HTTP>=1.1
HTTP/1.1 采用了长连接的方式,这使得管道(pipeline)网络传输成为了可能。
即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
管道机制则是允许浏览器同时发出 A 请求和 B 请求。但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。要是 前面的回应特别慢,后面就会有许多请求排队等着。这称为「队头堵塞」
HTTP/1.1 的性能一般般,后续的 HTTP/2 和 HTTP/3 就是在优化 HTTP 的性能
HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
-
HTTP 的端口号是 80,HTTPS 的端口号是 443。
-
HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的
HTTPS
-
混合加密的方式实现信息的机密性,解决了窃听的风险。
-
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
-
将服务器公钥放入到数字证书中,解决了冒充的风险。
HTTP/1.1 相比 HTTP/1.0 性能上的改进: 1)使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 2)支持 管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。 但 HTTP/1.1 还是有性能瓶颈: 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分; 发送冗长的首部。每次互相发送相同的首部造成的浪费较多; 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞; 没有请求优先级控制; 请求只能从客户端开始,服务器只能被动响应。
HTTP/2 相比 HTTP/1.1 的改进
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的
1)头部压缩
2)HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式
3)服务不再是被动地响应,也可以主动向客户端发送消息。
4)客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。
5)HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应,所以没有队头阻塞
HTTP/2 主要的问题在于:多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的,一旦发生了丢包现象,就会触发 TCP 的重传机制,
这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来
为了解决重传问题,HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!HTTP3基于UDP 的 QUIC 协议很多硬件还不支持,所以普及的进度非常的缓慢
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
在HTTP规范中,没有对URL的长度和传输的数据大小进行大小的限制,但是在实际的开发中,对于GET请求,特定的浏览器和服务器对URL的长度有限制。因此在使用GET请求时,会受到长度的限制