HTTP是一个超文本传输协议
协:表示有两个及以上的参与者.
议:表示对参与者行为的一种约定和规范.
HTTP是一个协议,它规定了计算机之间通信的规范以及相关的各种控制和错误处理方式.
总结而言,HTTP就是一个在两点之间进行双向传输图片,音频等超文本数据的一种约定和规范
Host字段:用来指定访问的服务器的域名
Content-Length字段:表示服务器的响应报文中数据的长度
Connection字段:客户端要求服务器要持久连接
Content-Type字段:服务器回应时,响应报文中数据的格式
Accept字段:客户端可以接受的数据格式
Content-Encoding字段:服务器回应时,响应博文中数据的压缩方法
Accept-Encoding:客户度可以接受的数据的压缩方法
简单
HTTP报文由header+body两部分组成,header是简单的key-value内容,易于理解和学习.
灵活 易拓展
字段的不限制使用使得开发者可以根据需求随意使用和补充,同时HTTP属于应用层,其下层可以随意变化.
应用广泛和跨平台
应用HTTP的应用和软件非常广泛,同时天然具有跨平台的特性
HTTP缓存有哪些实现方式
强制缓存和协商缓存
什么是强制缓存?
强制缓存是指只要浏览器判断缓存没有过期,则直接使用浏览器本地的缓存
强制缓存的具体流程:
什么是协商缓存?
与服务器协商后来判断是否使用本地缓存,协商缓存有两种实现方式
HTTP与HTTPS的区别?
HTTPS解决了HTTP哪些问题?
HTTPS引入SSL/TLS协议来解决HTTP中上述的不安全问题.
信息加密:采用混合加密的方式
校验机制:摘要算法来实现数据的完整性,为每个数据生成一个独有的指纹,指纹用于校验数据的完整性
身份证书:将服务器公钥放到身份证书中.
混合加密
采用非对称加密的方式进行密钥的安全交换;采用对称加密的方式进行加密数据传输
对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到密钥的安全交换
非对称加密有两个密钥:公钥和私钥,公钥可以任意而私钥需要保密,可以解决密钥交换但速度慢
摘要算法+数字签名
为了保证数据的完整性,会用摘要算法(哈希)计算出数据的一个指纹(哈希),服务器会对接收到的数据再次计算出一个指纹并与报文中数据的指纹做对比,如果相同则说明数据是完整的.
为了保证数据和哈希不被替换,需要用数字签名算法对哈希进行加密.数字签名主要采用的是非对称加密方式.非对称加密有两个密钥,一个公钥,一个私钥;二者是可以相互加密解密的.
1. 公钥加密,私钥解密:保证数据传输的安全性.私钥是保密的,只有持有私钥的人才能解密数据.
2. 私钥加密,公钥解密:防止发送数据的人不会被冒充.因为私钥是解密的,所以用公钥能够解密出正确数据说明发送方是持有私钥的.
数字签名就是采用[私钥加密,公钥解密]的方式保证不被冒充.服务器将公钥发送给客户端,然后用私钥加密数据,客户端如果能够用公钥正常解密,就说明发送的数据来源于服务器
3. 身份证书
为了保证服务器发送的公钥不被伪造,引入身份证书.服务器会向CA申请数字证书,并将服务器公钥放到身份证书中,只要证书是可信的,公钥就可信
HTTPS是如何建立连接的?期间交互了什么?
在经过TCP三次握手之后,进入SSL/TLS的四次握手过程:客户端向服务器索要并验证密钥,客户端和服务器协商产生会话密钥
SSL/TLS建立连接的过程
HTTPS的应用数据是如何保证完整性的?
TLS在实现上分为握手协议和记录协议
记录协议负责数据的完整性和来源的验证.
具体过程:
1. 首先,消息被分割成多个较小的片段,然后分别对每个片段进行压缩.
2. 经过压缩的片段会加上消息认证码(MAC值,通过哈希算法生成),这是为了保证数据的完整性,并进行数据的认证.
3. 经过压缩的片段和消息认证码会通过对称密码加密
4. 经过加密的数据加上报头形成报文交给传输层TCP.
HTTP/1.1相比HTTP/1.0提高了什么性能?
1. 使用长连接的方式改善了HTTP1.0的短连接造成的性能开销
2. 支持管道网络运输,支持一次发送多个请求报文,减少整体的响应时间
HTTP1.1性能瓶颈
1. 报文头部未经压缩就发送,首部信息越多延迟就越大.
2. 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
3. 服务器是按照请求的顺序响应的,响应可能会造成队头阻塞
4. 没有请求优先级控制
5. 请求只能从客户端发出,服务器只能被动响应
HTTP/2做了什么优化?
HTTP/2是基于HTTPS的,在安全性上有保障
头部压缩
HTTP/2会压缩头,如果你同时发出多个请求,它们的头是一样或相似的,协议会帮你消除掉重复的部分.
利用HPACK算法,在客户端和服务器各自维护一张头部信息表,所有字段都会存入这个表,生成一个索引号,以后发送同样的字段时只发送一个索引
二进制格式
HTTP/2中的报文由HTTP/1.1的纯文本格式改成了二进制形式.统称为帧:头信息帧和数据帧.这样提高了计算机处理数据的效率.
数据流
HTTP/2中的数据包不是顺序发送的,可以乱序发送.同一个连接里连续的数据包可能属于不同的回应.一个请求或响应中的所有数据包称为数据流,为了区分不同的数据包,每一个数据包都会标记一个Stream ID,一个数据流中的数据包的Stream ID是相通的.接收方可以根据Stream ID来组装数据包
客户端和服务器都可以建立Stream,为了区分,客户端的Stream ID是奇数,服务器是偶数
客户端可以数据流的优先级是服务器优先/靠后处理
多路复用
一个连接中可以同时发送多个请求/响应(HTTP/1.1不能解决响应队头阻塞的问题).
服务器推送
服务器可以主动向客户端发送信息,较少了消息传递的次数
HTTP/2虽然采用多路复用解决了响应的队头阻塞问题,但仍无法完全解决队头阻塞问题.问题处在TCP层,TCP是面向字节流的,所以TCP层接收到的数据要求是完整且连续的,这样才能从内核中将数据提供给HTTP.但当发生丢包现象后,由于要保证连续,所有包都需要等待丢包重传后才能传给HTTP,因此造成了阻塞.
HTTP/3做了什么优化?
HTTP/3完全解决了队头阻塞问题:将HTTP下层的TCP改成了UDP.
UDP对发送顺序和连续性没有要求,所以可以解决队头阻塞的问题.但UDP是不可靠的,但基于UDP的QUIC协议可以实现类似TCP的可靠传输
QUIC的3个特性
1. 无队头阻塞
QUIC同样采用HTTP/2中的多路复用与Stream的概念.与HTTP/2不同的是丢包后QUIC只会影响丢的包本身,而不会影响其他包
2. 更快的连接建立
在HTTP/3之前,TCP和TLS是分层的,分别属于传输层和表示层,所以需要分批实现,先TCP握手,然后TLS握手
HTTP/3中少了TCP握手,而TLS握手转变成了QUIC握手,由四次握手改变为了三次握手(2个RTT---->1个RTT),甚至可以是两次握手(0个RTT).握手的目的是确认双方的连接ID.
3. 连接迁移
基于TCP的HTTP协议是通过四元组(源IP,源端口,目的IP,目的端口)来确认连接的,当移动设备的网络环境发生变化(从流量切换到WIFi)时,对应的IP地址发生了改变,因此连接会发生断开再重连,重连需要经过TCP三次握手和TLS四次握手的时延,连接迁移的成本很大.
而QUIC是基于连接ID来确认连接.这样即使IP地址变化了,只要上下文信息仍保持,连接就无须重连,可以继续正常使用
总的来说,QUIC是一个在UDP之上结合了TCP+TLS+HTTP/2的多路复用的协议,但由于QUIC是新协议,许多网络设备会将其当做是UDP,而有些网络设备会丢弃UDP包,这样就会导致丢弃QUIC包.因此HTTP/3的普及速度非常缓慢.