Http
什么是Http?
Http是超文本传输协议。
- 超文本:文字、视频、图片等都是文本而超文本就是文字、图片、视频等的混合体,而且可以有超链接。
- 传输:将信息从A传到B。Http是两点间的传输。
- 协议:通信双方都共同遵守的准则。
所以超文本传输协议就是在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
Http状态码
1xx:属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
2xx:表示服务器成功处理了客户端的请求。
3xx:表示客户端请求的资源发生了变化,要用新的URL申请,也就是重定向。
4xx:表示客户端发送的报文有问题,服务端无法正常响应。
5xx:表示服务端内部出现了问题,无法正常响应。
Http请求类型
- GET:从服务器中获取资源。
- POST:根据携带的数据对服务器中的资源进行操作。
- PUT:更新服务器中的数据。
- DELETE:删除服务器中的数据。
- HEAD:和GET类似,但仅返回头部,身体部分不返回。
- CONNECT:建立客户端和服务器资源的双向通道。
- OPTIONS:用于获取目的资源所支持的通信选项/请求方法。
- TRACE:提供一种方法来测试当一个请求发生的时候,服务器通过网络收到的内容。
GET和POST的区别
- GET根据定义是从服务器中读取目的资源,是读操作。 POST根据定义是依靠报文中存储的数据对服务器中的资源进行相应的操作,是写操作。
- 如果按定义来实现GET和POST操作的话,GET操作就是安全(指请求不会破坏服务器的资源)且幂等(指多次请求后结果相等)的。而POST是不安全且非幂等的。
- 参数方面:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。浏览器会对URL长度做限制,而不会对Body大小做限制。
HTTP特性
优点
- 协议简单:HTTP协议的报文格式简单,由header+body(头部+身体)组成,头部是以键值对简单字符串形式存储数据。
- 灵活易于扩展:Http的各部分组成要求都没有固定死,方便开发人员对其自定义和扩充。
- 应用广泛、跨平台:HTTP 的应用范围非常的广泛,从台式机的浏览器到手机上的各种 APP,从看新闻、刷贴吧到购物、理财、吃鸡,HTTP 的应用遍地开花,同时天然具有跨平台的优越性。
优缺点双刃剑
- 无状态:http在传输的时候不会保存当前客户端的状态,好处在于在通信的时候不用带上客户端的状态信息,可以减轻服务端和网络的压力,坏处在于无法保存客户端状态,所以在连续操作的情况下使用麻烦,比如在淘宝网页里每一个网页跳转后都要登录。解决:可以使用cookie等技术解决。
- 明文传输:http在传输中的信息是方便阅读的。好处:方便人们获取信息,也为开发工作提供极大便利性。缺点:很容易被别人获取信息,有安全性的问题。
缺点
从上可以知道,http最主要的缺点就是安全问题。 1.使用明文传输,数据安全性没有保证。账号危险。 2.没有完整性认证,http在传输过程中中间节点可以添加数据。浏览器的页面弹出小广告。 3.不知道来源是否是目的网站,可能被拦截进入了高仿网站获取用户信息。
基于上面存在的安全性问题,可以通过Https来解决。
HTTPS
Htpps如何解决安全性问题
Https通过三方面操作来解决上面的三个问题。
- 混合加密机制:保证数据的安全性
- 效验机制:解决数据完整性
- 第三方CA认证机构:解决网站来源的问题。
混合加密
混合加密是基于对称加密和非对称加密综合得来的加密方法。
对称加密是通信双方共同维护一个加密秘钥,通信的内容用这个共同的密钥来加密。这种方法加密解密的速度快,但是因为只有一个密钥,容易被破解。
非对称加密有两个密钥:公钥和私钥。私钥只能由一人持有,并将与该私钥配对的公钥发布出去,信息由公钥加密私钥解密或私钥加密公钥解密。这样黑客就难以破解出公私钥。但这样加密解密的速度就不如对称加密。
混合加密综合了前两者的特征实现的,实现过程可以概括为:在TLS/SSL握手阶段通过非对称加密通信双方共同维护生成一个公钥,之后连接建立以后再通过这个公钥实现对称加密。
校验机制
服务端将自己的信息发送之前先将自己的内容通过摘要算法(hash函数)生成一份信息摘要,两者一起发送过去。这个哈希值是唯一的,且无法通过哈希值推导出内容。客户端介绍之后对回复的内容用同样的摘要算法就能生成第二份信息摘要,两个信息摘要一起比较,相同则说明内容没有发生修改。但如果两者都被修改了的话这种情况下仍认为是正确的,所以就要依靠第三个机制了。
CA认证机构
服务端将自己的公钥和其他的必要信息一起发送给CA机构,CA机构先生成信息摘要,再用自己的私钥加密生成数字签名,数字签名再和其他信息一起作为数字证书。之后如果有来自客户端的请求,服务端将自己的数字证书发送过去,客户端收到后先用CA机构提供的公钥确认数字证书的安全性。
https通信流程
了解上面的内容之后再来看看https建立通信的流程(主要是TLS的加密流程):
- 客户端生成随机数字,和必要信息一起发送给服务端。
- 服务端收到后确认信息,也生成随机数字,和数组证书一起发送过去。
- 客户端收到之后使用CA的公钥解密,验证安全性和完整性,取得了数字证书里的服务端公钥,再生成一个随机数,使用公钥加密,和确认信息一起发送给服务端。此时客户端用这三个随机数使用加密算法生成一个公共密钥。客户端握手状态结束
- 服务端收到报文,也生成同样的公钥,再向客户端发送必要信息后结束握手阶段。
HTTP和HTTPS的不同
- Http的连接过程需要TCP连接而HTTPS需要TCP和TLS/SSL。
- http默认端口号为80,https为443
- https需要有CA认证机构才行
- HTTP是明文传输,安全性有问题,而HTTPS经过TLS/SSL加密,安全性有保证。
http版本的演变
Http1.0
http1.0是早期的通信协议,tcp连接为短连接并且一次只能发送接收一个请求。
http1.1
基于1.0上面的问题,1.1做出了改进:使用长链接,只要连接还在,就能一直发送接收。使用了管道机制,可以在一次请求发送后立刻再发送一次请求,不需要等待回复。 存在的问题:
- 虽然可以一直发送请求,但服务端收到请求后是按序回应的,这样如果有一个请求消耗时间过长的话就会影响后面的请求的响应,即头部等待。
- http的头部没有压缩
- http的头部信息多次发送,会有同样的头部内容,但都要发送,造成信息冗余问题。
- 请求没有优先级
- 服务端智能被动地等待客户端的请求。
http2.0
2.0是基于https的基础上实现的。通过下面的方法解决了1.1存在的问题。
- 头部压缩,2.0通过HPACK算法来压缩头部的大小,客户端和服务端双方共同维护数据表,有头部如果有相同字段的话就通过索引指向表中的内容。
- 二进制格式:2.0传输的数据全部是使用的二进制形式传输,二进制虽然不利于人的阅读但对于机器来说十分友好,而且还可以进行位运算。头信息和数据体都是二进制,分成了两部分,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。
- 并发传输:2.0使用了特殊的方法使得请求响应可以并发进行。在tcp连接中有多个stream,一个stream中有多个message。message里有多个frame,frame由多个tcp报文组成。stream相当于消息的通道,message是一个消息的请求和响应(一个message由头部和包体两部分frame组成),一个消息的请求和响应message在同一个message中,frame则是2.0的最小单位,存储了报文的具体内容。每个stream都有独一无二的id通过这个id来辨识不同的message。接收时,服务端可以不按顺序地接收来自不同stream的message,后续通过id来分辨组装。但一个stream的message必须按顺序发送。
4.服务器主动推送资源:客户端通过 HTTP/1.1 请求从服务器那获取到了 HTML 文件,而 HTML 可能还需要依赖 CSS 来渲染页面,这时客户端还要再发起获取 CSS 文件的请求,需要两次消息往返。而使用推送机制后可以主动将后续文件推送过去。
问题:2.0在tcp层面还存在头部阻塞问题,在tcp层中,必须保证数据完整才能将数据上传给应用层,如果在前面出现了缺少的情况,那么后面的完整内容也无法上传。
3.0
基于2.0存在的问题,使用udp来替换tcp。