HTTP学习 | 青训营笔记

115 阅读8分钟

HTTP学习 | 青训营笔记

这是我参与「第四届青训营」笔记创作活动的第4天。
参考书籍:《图解网络》v3.0

什么是HTTP

HTTP 是超文本传输协议,也就是HyperText Transfer Protocol,HTTP 是⼀个在计算机世界⾥专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

五大类状态码

1660529344729.png

  • 1xx类状态码属于提示信息,是协议处理中的⼀种中间状态,实际用到的比较少。
  • 2xx类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
    • 「200 OK」是最常见的成功状态码,表示⼀切正常。如果是非HEAD请求,服务器返回的响应头都会有 body数据。
    • 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有body数据。
    • 「206 Partial Content」是应用于HTTP分块下载或断点续传,表示响应返回的body数据并不是资源的全部,而是其中的⼀部分,也是服务器处理成功的状态。
  • 3xx类状态码表示客户端请求的资源发送了变动,需要客户端用新的URL新发送请求获取资源,也就是重定向。
    • 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改⽤新的URL再次访问。
    • 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另⼀个URL来访问。301和302都会在响应头⾥使用字段 Location ,指明后续要跳转的URL,浏览器会自动重定向新的URL。
    • 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲⽂件,也称缓存重定向,用于缓存控制。
  • 4xx类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
    • 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
    • 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
    • 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
  • 5xx类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
    • 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
    • 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
    • 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身⼯作正常,访问后端服务器发生了错误。
    • 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。

HTTP常见字段

请求头.png

响应头.png

HTTP特性

HTTP/1.1

优点:
  1. 简单 ,HTTP 基本的报文格式就是 header + body,易于理解;
  2. 灵活和易于扩展,HTTP协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死;
  3. 应用广泛和跨平台
缺点:
  1. 无状态,服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,但它在完成有关联性的操作时会很麻烦;
  2. 明文传输,明文意味着在传输过程中的信息是裸奔的;
  3. 不安全
    • 通信使用明文(不加密),内容可能会被窃听。
    • 不验证通信方的身份,因此有可能遭遇冒充。
    • 无法证明报文的完整性,所以有可能已遭篡改。
性能:

HTTP 协议是基于TCP/IP,并且使用了「请求-应答」的通信模式,所以性能的关键就在这里

  1. 长连接,只要任意⼀端没有明确提出断开连接,则保持 TCP 连接状态。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载;
  2. 管道网络传输,在同⼀个 TCP 连接里面,客户端可以发起多个请求,只要第⼀个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间;
  3. 队头阻塞,当顺序发送的请求序列中的⼀个请求因为某种原因被阻塞时,在后面排队的所有请求也⼀同被阻塞了,导致客户端⼀直请求不到数据。
  4. 请求/响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
  5. 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
  6. 没有请求优先级控制;
  7. 请求只能从客户端开始,服务器只能被动响应。

HTTP/1.1的性能⼀般般,后续的HTTP/2和HTTP/3就是在优化HTTP的性能。

HTTPS

HTTPS解决HTTP不安全的缺陷,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才可进⼊加密报文传输;HTTP的端口号是80,HTTPS的端口号是443;HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

HTTPS怎样解决HTTP不安全的缺陷
  • 混合加密的方式实现信息的机密性,解决了窃听的风险。
    • 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
    • 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。
  • 将服务器公钥放到数字证书中,解决了冒充的风险。
    • 客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
    • 第三⽅权威机构CA(数字证书认证机构),将服务器公钥放在数字证书(由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。
  • 摘要算法的方式来实现完整性,它能够为数据生成独一无二的指纹,指纹用于校验数据的完整性,解决了篡改的风险。
    • 客户端在发送明文之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明⽂」⼀同加密成密文后,发送给服务器;
    • 服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出 的「指纹」做比较,若「指纹」相同,说明数据是完整的。

混合加密: 混合加密.png 数字证书: 数字证书.png 摘要算法: 摘要算法.png

HTTP/2

HTTP/2协议是基于HTTPS的,有安全保障

HTTP/2相比HTTP/1.1性能上的改进
  1. 头部压缩
  • HTTP/2会压缩头(Header),如果你同时发出多个请求,他们的头是⼀样的或是相似的,那么协议会帮你消除重复的部分。
  • 头部压缩使用HPACK算法。
  1. 二进制格式
  • HTTP/2全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧,增加了数据传输的效率。
  1. 数据流
  • HTTP/2 的数据包不是按顺序发送的,同⼀个连接里面连续的数据包,可能属于不同的回应。
  • 每个请求或回应的所有数据包,称为⼀个数据流( Stream )。
  • 客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。
  1. 多路复用
  • HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。
  • 不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率。
  1. 服务器推送
  • HTTP/2中,服务不再是被动地响应,也可以主动向客户端发送消息,减少延时的等待。
HTTP/2的缺陷

HTTP/2多个请求复用⼀个TCP连接,⼀旦发生丢包,就会触发TCP的重传机制,所有的HTTP请求都必须等待这个丢了的包被重传回来,就会阻塞住所有的HTTP请求。

HTTP/3

  • HTTP/3把HTTP下层的TCP协议改成了UDP,不会出现HTTP/1.1的队头阻塞和HTTP/2的⼀个丢包全部重传问题。
  • UDP是不可靠传输的,但基于UDP的QUIC协议可以实现类似TCP的可靠性传输。QUIC是⼀个在UDP之上的伪TCP + TLS + HTTP/2的多路复用的协议。
    • QUIC有自己的⼀套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。
    • TLS3升级成了最新的1.3版本,头部压缩算法也升级成了QPack。
    • HTTPS要建立⼀个连接,要花费6次交互,先是建立三次握⼿,然后是 TLS/1.3的三次握手。QUIC直接把 以往的TCP和TLS/1.3的6次交互合并成了3次减少了交互次数。

1660561588134.png