| 学习来源:链接: link. Http基本概念HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
  HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
 Http状态码1xx1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。 2xx2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。 200 OK是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。「206 Partial Content」是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
 3xx3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。 301 Moved Permanently表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。302 Moved Permanently表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
 301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。
 4xx4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。 400 Bad Request表示客户端请求的报文有错误,但只是个笼统的错误。401Unauthorized表示发送的请求需要有认证信息(BASIC认证、DIGEST认证)。403 Forbidden表示服务器禁止访问资源,并不是客户端的请求出错。404 Not Found表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
 5xx5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。 500 Internal Server Error与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。502 Bad Gateway通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。503 Service Unavailable表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。
 http 常见字段有哪些?客户端发送请求时,用来指定服务器的域名。 Host: www.A.com
 服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。 Content-Length: 1000
 Connection 字段最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。 Connection: keep-alive
 HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive。 Content-Type 字段用于服务器回应时,告诉客户端,本次数据是什么格式。 Content-Type: text/html; charset=utf-8
 Content-Encoding 字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式 Content-Encoding: gzip
 说一下 GET 和 POST 的区别?Get 方法的含义是请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等。而POST 方法则是相反操作,它向 URI 指定的资源提交数据,数据就放在报文的 body 里。
 GET 和 POST 方法都是安全和幂等的吗?先说明下安全和幂等的概念: 在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。
 那么很明显 GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。 POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。 Http和Https的区别 HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了SSL/TLS 安全协议,使得报文能够加密传输。HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。 HTTP 的端口号是 80,HTTPS 的端口号是 443。 HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
 HTTP 由于是明文传输,所以安全上存在以下三个风险:  窃听风险,比如通信链路上可以获取通信内容 篡改风险 冒充风险,比如冒充淘宝网站
 
 HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议。 HTTP/1.0 HTTP/1.1、HTTP/2、HTTP/3HTTP/1.0短连接HTTP1.0中,存在?些浪费带宽的现象,例如客户端只是需要某个对象的?部分,?服务器却将整个对象送过来了
 HTTP/1.1HTTP 1.1起,默认使??连接 ,默认开启Connection: keep-alive。支持 管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。HTTP1.1则在请求头引?了range头域,它允许只请求资源的某个部分Host 是 HTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术。
 补充:虚拟主机(virtual hosting)即共享主机(shared web hosting),可以利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。
 举个栗子,有一台 ip 地址为 61.135.169.125 的服务器,在这台服务器上部署着谷歌、百度、淘宝的网站。为什么我们访问 https://www.google.com 时,看到的是 Google 的首页而不是百度或者淘宝的首页?原因就是 Host 请求头决定着访问哪个虚拟主机。 缺点:  请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞; 没有请求优先级控制; 请求只能从客户端开始,服务器只能被动响应。
 HTTP/2 头部压缩HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的分。
 二进制格式HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式。
 头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧。
 数据流HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。
 每个请求或回应的所有数据包,称为一个数据流(Stream)。
 每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数
 客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。
 多路复用HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。
 移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,大幅度提高了连接的利用率。
 
  服务器推送HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务不再是被动地响应,也可以主动向客户端发送消息。
 
 
 HTTP/3HTTP/2 主要的问题在于:多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。 所以一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。 这都是基于 TCP 传输层的问题,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
  大家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。
 |