HTTP和HTTPS部分知识点
HTTP基本概念
超文本-传输-协议
- 协议
HTTP是一个用在计算机世界里的协议。它使用计算机可以理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)。 - 传输
HTTP协议是一个双向协议。是一个在计算机世界里专门用来在两点之间传输数据的约定和规范 - 超文本
HTTP传输的内容是超文本。图片、视频、压缩包在HTTP协议看来都是文本。超文本超越普通文本的文本,是文字、图片、视频的混合体,最关键有超链接能从一个超文本跳转到另一个超文本。HTML就是最常见的超文本。
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
HTTP状态码
- 1xx类属于提示信息,是协议处理中一种中间状态,实际用的比较少
- 2xx类状态码表示服务器成功处理了客户端的请求
- 204Not Content 成功但响应头没有body数据
- 206Partial Content 应用于HTTP分块下载或断点续传,表示响应的body数据不资源全部
- 3xx状态码表示客户端请求的资源发生变动,需要客户端用新的URL重新发送请求获取资源,也就是重定向
- 301表示永久重定向,需要客户端用新的URL再次访问
- 302临时重定向,说明请求的资源还在,暂时需要另一个URL来访问
- 301和302会在响应头字段location,指明后续要跳转的URL,浏览器自动重定向到新的URL
- 304表示资源未修改,表示客户端可以继续使用缓存资源用于缓存控制
- 4xx类状态码表示客户端发送报文有误,服务器无法处理
- 400 表示客户端请求的报文有错误,但只是笼统错误
- 403表示服务器禁止访问资源,不是客户端请求出错
- 404表示请求资源在服务器不存在或没找到,无法提供给客户端
- 5xx表示客户端请求正确,但是服务器处理时内部发生了错误,属于服务器端的错误码
- 500与400类型是个笼统通用的错误码,服务器发生了什么错误并不知道
- 501表示客户端的请求暂时不支持
- 502表示服务器自身工作正常,但是访问后端服务器发生错误,通常是服务器作为网关或代理时返回的错误码
- 503表示服务器繁忙暂时无法响应客户端
HTTP常见的字段
Host:客户端发送请求时用来指定服务器的域名。有个这个字段可以将请求发往同一台服务器上的不同网站
Content-Length表明本次回应的数据长度。HTTP协议通过设置回车符,换行符作为HTTP header的边界,通过Content-Length字段作为HTTP body的边界,这两个方式都是为了解决粘包问题。
Connection常用于客户端要求服务器使用HTTP长连接机制,以便其他请求复用。只要任意一端没有明确提出断开连接,则保持TCP连接状态
http/1.1版本默认开始长连接为了兼容老版本的HTTP,需要指定Connection首部字段的值为Keep-Alive
Content-Type:用于服务器回应时,告诉客户端,本次数据是什么格式
Content-Encoding说明数据的压缩方法。表示服务器返回的数据使用什么压缩格式
GET和POST区别
GET的语义是从服务器获取指定的资源,这个资源可以可以是静态的文本,页面,图片视频等。GET请求的参数位置一般是写在URL中,URL规定智能支持ASCII,所以GET请求的参数只允许ASCII,而且浏览器会对URL长度有限制(HTTP协议并没有对URL的长度有规定)
POST语义是根据请求负荷对指定的资源做出处理,具体的处理方式视资源类型而不同。POST请求携带数据的位置一般是写在报文body中,body中的数据可以是任意格式的数据,只要客户端和服务端协商好即可,而且浏览器不会对body大小做限制
GET和POST方法都是安全和幂等的吗
- 在HTTP协议中,安全 指的是不会破坏服务器上的资源
- 幂等指的是多次执行相同的操作,结果都是相同的
从RFC规定的语义来看 - GET方法是安全且幂等的。所以可以对GET请求的数据做缓存,这个缓存就可以做到浏览器本身上,也可以做到代理上,而且在浏览器中GET请求可以保存为书签
- POST会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的
HTTP缓存技术
HTTP缓存的实现方式
强制缓存和协商缓存
强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。强缓存利用两个HTTP响应头部字段实现的,Cache-Control一个相对时间,Expires是一个绝对时间;Cache-Control优先级高于Expires
协商缓存:这里的两个字段都需要配合强制缓存中Cache-Control字段来使用,只有在未能命中强缓存的时候才能发起带有协商缓存字段的请求。
HTTP特性
http/1.1
- 简单,基本报文格式是header+body,头部信息也是key-value简单文本的形式,头部信息也是key-value简单文本的形式,易于理解,讲了学习和使用的门槛
- 灵活易于拓展允许开发人员自定义和扩充。同时HTTP工作在应用层它下层可以随意变化,HTTPS就是在HTTP和TCP之间加了SSL/TLS;http3.0传输协议该用UDP
- 应用广泛和跨平台
缺点 - 无状态,好处服务器不用记忆HTTP状态,所以不需要额外的资源来记录状态信息,能减轻服务器的负担,能够把更多的CPU用来对外提供服务坏处在进行有关联的请求操作时每一步都需要验证用户的身份(可用cookie技术解决)
- 明文传输,明文方便阅读但是毫无隐私容易窃取信息
- 不安全,不加密传输账号信息易泄露。不验证通信双方身份可能遭遇伪装。无法验证报文的完整性,可能会被篡改。
HTTP/1.1性能
HTTP协议是基于TCP/IP,并且使用请求-应答的通信模式
1.长连接
在http1.0时每发起一个请求都要新建一次TCP连接,如果是串行请求,做了无谓的TCP连接建立和断开,增加通信开销。HTTP/1.1提出长连接通信方式。只要任意一端没有明确提出断开连接,则保持TCP连接状态。
2.管道网络传输(没有被使用)
即在同一个TCP连接里,客户端可以发起多个请求,只要第一个请求发送成功不用等响应就可以发送第二个请求,减少整体的响应时间。但是服务器必须按照接收请求的顺序发送对这些管道请求的响应。
3.队头阻塞
当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞,导致客户端一直收不到数据,这就是队头阻塞
HTTP和HTTPS
区别
- HTTP是超文本传输协议,信息明文传输,存在安全风险。HTTPS解决了HTTP不安全的缺陷,在HTTP和TCP中加入SSL/TLS,使报文加密传输
- HTTP建立连接简单,TCP三次握手之后便可进行进行HTTP的报文传输,而HTTPS在TCP三次握手之后还要进行SSL/TLS握手,才可进入加密报文传输
- 两者的默认端口不一样,HTTP默认端口号是80,HTTPS默认端口号是443
- HTTPS协议需要向CA申请数字证书,来保证服务器的身份是可信的
HTTPS解决的问题
- 信息加密,交互信息无法被窃取
- 校验机制,无法篡改通信内容,篡改了就不能正常显示
- 身份证书,证明淘宝是真的淘宝网
解决的办法: - 混合加密的方式实现信息的机密性,解决窃听的风险
- 摘要算法的方式实现完整性,它能够为数据生成独一无二的指纹,指纹用于校验数据的完整性,解决了篡改的风险
- 将服务器公钥放到数字证书中,解决了被冒充的风险
1.混合加密
HTTPS采用的是对称加密和非对称加密结合的混合加密方式 - 在通信建立前采用非对称加密的方式交换会话密钥
- 在通信过程中全部使用对称加密的会话密钥的方式加密明文数据
采用混合加密的原因: - 对称加密只使用一个密钥,运算速度块,密钥必须保密,无法做到安全的密钥交换
- 非对称加密的两个密钥,公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢
2.摘要算法+数字签名
保证传输内容不被篡改对内容计算出一个指纹,然后同内容一起传输给对方
收到后接收方对内容计算出指纹跟发送方发送的指纹做一个比较,指纹相同说明内容没有被篡改否则就可以判断出内容被篡改了。
在计算机里会用摘要算法(哈希函数)来计算出内容的哈希值,也就是内容的指纹,这个哈希值是唯一的,且无法通过哈希值推导出内容。
但是不能保证内容+哈希不会被中间人替换,因为这里缺少对客户端收到的消息是否来源于服务端的证明(客户端无法确认消息中的哈希值是否真的是服务端计算的)采用非对称加密来解决 - 采用非对称加密通过私钥加密公钥解密方式,确认消息的身份,即数字签名算法,私钥加密内容不是内容本身,而是对内容的哈希值加密!
*3.数字证书
- 服务器将自己的公钥注册到CA
- CA用自己的私钥将服务器的公钥数字签名并颁发数字证书(数字证书:服务器的公钥和CA的数字签名)
- CA的公钥实现置入到了浏览器或操作系统中
- 客户端拿到服务器的数字证书后使用CA的公钥确认服务器数字证书的真实性
- 从数字证书获取到服务器的公钥后使用它对报文加密后发送