1.基本概念
1.1常用状态码
1xx:提示信息,表示目前处于协议的中间状态,还有后续操作,实际用到很少
2xx:成功,报文已经收到并被正确处理
200 OK:最成功的状态码,表示一切正常
204 No Content:与200基本相同,但是响应头没有body数据
206 Partial Content:表示返回的body并不是完整的资源,只是其中的一部分,应用于HTTP分块下载或断点续传
3xx:重定向,资源位置发生了变化,需要客户端重新发送请求
301 Moved Permanently:表示永久重定向,说目请求的资源已经不存在了,需要使用新的URL再次访问
302 Found:表示临时重定向,说明请求的资源还在,但暂时需要使用另一个URL访问
304 Not Modified:缓存重定向,不具有跳转的含义,表示资源未修改,于是重定向至已存在的缓冲文件,用于缓存控制
注:301和302的响应头都有Location字段,指明后续要跳转的URL,浏览器会自动重定向。
4xx:客户端错误,请求报文有误,服务器无法处理
400 Bad Request:表示客户端请求报文有误,但没有说明具体错误,只是笼统地报错,客户端收不到具体的错误信息
403 Forbidden:表示客户端请求访问服务器的禁止访问资源,并不是客户端的请求出错
404 Not Found:表示请求的资源在服务器上不存在
5xx:服务端错误,服务器在处理请求时内部发生了错误
500 Internal Server Error:与400类似,笼统地报错
501 Bad Gateway:服务器作为网关或代理时返回的错误,表示服务器自身工作正常,但访问后端服务器时发生了错误
503 Service Unavailable:表示服务器当前繁忙,暂时无法相应客户请求(表达的意思是“当前网络服务忙,请稍后重试”)
1.2常见字段
示例
Host 字段
Host:www.xxx.com
表明了需要访问的具体网站
Connection字段
最常用于客户端要求服务器使用TCP持久连接,以便其他请求复用,HTTP/1.1版本的默认连接都是持久连接,但为了兼容老版本,需要指定Connection首部字段的值为Keep-Alive。
Connection:Keep-Alive
Content-Length字段
说明本次回应的数据长度
Content-Type字段
说明本子数据的类型
Content-Type:text/html;charset=utf-8
Content-Encoding 字段
说明服务器返回数据使用了说明压缩格式
Content-Encoding :gzip,deflate
Accept字段
说明客户端自己可以接收哪些数据格式
Accept:/(表示自己可以接收任意数据)
1.3安全与幂等
安全:请求方法不会破坏服务器上的资源
幂等:多次执行相同的操作,结果也是相同的
2.GET和POST
GET方法是向服务器请求资源,这个资源可以是任意格式的,服务器收到后会返回客户端所需的资源。
POST方法与之相反,它是客户端向指定的服务器提交数据。
GET是安全且幂等的,POST是不安全且不幂等的
3.HTTP的演进
3.1总体优点
1.简单
基本格式为header+body,头部信息也是key-value的格式
2.灵活和易于拓展
HTTP协议⾥的各类请求⽅法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发⼈员⾃定义和扩充。
同时 HTTP 由于是⼯作在应⽤层( OSI 第七层),则它下层可以随意变化。
HTTPS 也就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层,HTTP/3 甚⾄把 TCP 层换成了基于 UDP 的 QUIC。
3.应用广泛和跨平台
3.2HTTP/1.0特点:
1.无状态(服务器不会去记忆HTTP的状态)
好处:不需要额外的资源来记录状态信息,减轻服务器的负担,从而把更多的资源用于对外提供服务
坏处:完成关联性的操作时会非常麻烦,例如登录->下单->支付,这时候每个环节都要进行身份验证,这对实际体验会有严重的打击,因此需要Cookie等技术
2.不安全
窃听风险:明文传输,信息裸奔,安全性极低。
冒充风险:不验证通信方的身份,容易遭遇伪装
篡改风险:无法证明报文完整性,报文可能被篡改
HTTPS通过引入SSL/TLS层来解决不安全这个问题的
3.3HTTP/1.1
改进
1.长连接
HTTP 1.0是短链接,每次请求-响应都需要建立-释放一次TCP连接,效率低,HTTP 1.1完成TCP三次握手后,只要没有任意一端明确提出断开连接,就会一直保持连接状态,期间可以发送任意次请求-响应。
2.管道网络传输
由于HTTP 1.1采用了长连接的方式,因此可以通过管道网络进行传输,从而在客户端发送多个请求时,前一个请求发送出去之后,就不必等待其响应,直接发送下一个请求,减少整体的响应时间。
缺点
队头阻塞:
由于HTTP规定了报文必须是一收一发的,使用的是“请求-应答”模型,当某个请求的处理太慢了,后续的请求都不得不陪它一起等待,导致后续请求承担了不应有的额外时间成本。
缓解方式:
①并发连接,也就是一个客户端对服务器发起多个长连接,但这种方式的缺陷也很明显,如果每个客户端都想自己快,那么用户数*并发连接数将会带来严重的资源消耗,或者会被服务器认为是恶意攻击,从而拒绝服务。默认上限为6~8。
②域名分片,由于HTTP协议和浏览器限制连接数量,服务器可以多开几个域名,这些域名都同时指向同一个服务器。比如www.A1.com,www.A2.com,同时指向服务器A。
3.4HTTPS
HTTP与HTTPS的区别
①HTTP存在三种安全风险,HTTPS则在TCP与HTTP之间添加了SSL/TLS安全协议,将报文加密传输,从而解决HTTP不安全的问题。
②HTTP连接建立较为简单,完成TCP三次握手后便可传输报文,HTTPS则在此基础上,还需要进行SSL/TLS握手。
③HTTP端口为80,HTTPS端口为443
④HTTPS需要向CA申请数字证书,保证服务器的身份是可靠的
SSL/TLS的作用:
①信息加密,解决窃听风险
②身份证书,解决冒充风险
③校验机制,解决篡改风险
3.5总结
HTTP/1.1
相比于HTTP/1.0的改进:
①使用长连接改善1.0中短链接带来的性能开销
②支持管道传输,不必等待前一个请求的结果,直接发送后续请求,减少了整体的响应时间。
仍需改进的地方:
①Header未经压缩就发送,只能压缩Body部分
②如果每次都发送相同的首部,那么就会造成浪费
③没有优先级控制,服务器是顺序响应的,可能会导致后来的请求响应慢
④请求只能从客户端开始,服务器只能被动响应
HTTP/2
相比于HTTP/1.1的改进:
①HPACK算法:头部压缩算法,在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成索引号,在接下来的信息交互中只发送索引号,从而避免重复发送相同且冗长的头信息,从而提高速度。
②使用二进制格式,虽然对人不友好,但对计算机十分友好,计算机接收到报文后可以直接解析报文,无需再将其转换为二进制格式,提高了数据传输的效率
③数据流
HTTP/2 的数据包不是按顺序发送的,同⼀个连接⾥⾯连续的数据包,可能属于不同的回应。因此,必
须要对数据包做标记,指出它属于哪个回应。每个请求或回应的所有数据包,称为⼀个数据流( Stream )。
每个数据流都标记着⼀个独⼀⽆⼆的编
号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数。
客户端还可以指定数据流的优先级。优先级⾼的请求,服务器就先响应该请求。
④多路复用,一个连接可以并发地处理多个请求或响应,不用按时间顺序处理,解决了HTTP/1.1的队头阻塞问题,降低了延迟,提高了连接的利用率
⑤服务器推送,服务器可以主动向客户端发送消息,改善了“请求-应答”模型。比如客户端刚请求HTML时,就提前把可能用到的CSS,JS文件主动发送给客户端,减少等待时延。
瓶颈
①多个HTTP请求,但只有一个TCP连接,下层TCP协议不知道上层有多少个HTTP请求,因此一旦丢包,触发TCP重传机制,会使得该TCP上的所有HTTP请求都必须等待重传这个包。
HTTP/3
相比于HTTP/2的改进:
①将下层的TCP协议改成基于UDP的QUIC协议
队头阻塞,丢包会阻塞上层所有HTTP协议都是基于TCP的问题,但UDP不管顺序,也不管丢包,因此不会出现上述问题。但UDP不安全传输的,因此QUIC建立了自己的一套机制来保证传输的可靠性,当某个流发生丢包时就阻塞这个流,但其他流不会收到影响。
②使用更新的TLS1.3版本,头部压缩算法也升级成QPACK
③HTTPS建立连接需要6次交互,QUIC将TCP和TLS/1.3的6次交互合并成3次,减少了建立连接所需的时间。
可以把QUIC 理解为⼀个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复⽤的协议
