http是基于tcp传输层基础上的网络应用层协议,又叫超文本传输协议,它以请求数据报文的形式向服务端发送数据流,服务端接受并处理请求返回响应数据流 。
http报文
http报文分为请求报文和响应报文,二者基本一致,具体可分为三个部分.
1.起始行
2.首部
3.主体请求报文格式
<method><request-url><http-version>
<headers>
<entity-body>
eg.GET /api/getCarList HTTP/1.1
HOST: www.driver.com
cache-control:no-cache
get请求没有请求体,post请求才会有请求实体响应报文格式
<http-version><status-code><reason-phrase>
<headers>
<entity-body>
eg. HTTP/1.1 200 ok
Content-Type:text/html
Content-length: 122
<html>
....
<html>
<method> 指请求方法,常用的主要是get,post
<http-version> 指http协议版本,通常是Http/1.1
<request-url> 请求地址
<status-code> 指响应状态码, 200,400,404等
<reason-phrase>状态码的描述文件,比如200 OK,400 Bad Request,404 Not Found等.
get请求和post请求的区别:
通过Get方法发起请求时,会将请求参数拼接在request-url尾部,格式是url?param1=value1¶m2=value2....
get请求会使得参数都暴露在地址栏中,由于url是ASCII编码的,所以参数中如果有Unicode编码的字符,例如汉字,都会编码之后传输。另外虽然http协议并没有对url长度做限制,但是一些浏览器和服务器可能会有限制,所以通过get方法发起的请求参数不能够太长。而通过POST方法发起的请求是将参数放在请求体中的,所以不会有get参数的这些问题。
另外从使用场景来说,get请求一般是获取服务端上的数据,而post请求是用于提交数据.
https协议
https是在http协议的基础上添加了一层SSL/TLS来保证通信数据的安全性.https与http协议之间的关系如下:
https=http+数据加密+数字证书+数据完整性校验
由于http协议是以明文数据进行传输,在通信过程中容易遭到篡改,而且http协议无法对通信双方的真实身份做校验,无法判定客户端或服务端是否是被伪装的,鉴于以上原因推出了https来保证通信信息的安全和身份校验.
对称加密和非对称加密
对称加密:加密的密钥和解密的密钥是同一个,这种方式的优点是处理速度快, 但是如何安全的保证通信双方的密钥传输这是一个难题.
非对称加密:加密的密钥是成对出现的,一个是公钥,另一个是私钥,公钥是对外公开的, 私钥是自己保留的,使用公钥对数据进行加密,必须使用对应的私钥进行解密才能获取原始数据,当然使用私钥对数据进行加密,也必须使用对应的公钥进行解密.这种方式的缺点是由于需要进行大量的计算,因此处理速度慢.
SSL/TLS结合了二者的优点,首先客户端使用非对称加密的公钥加密对称密钥传输给服务端,服务端使用非对称加密的私钥进行解密取出对称密钥,然后双方使用对称密钥进行数据加密进而进行通信,这样就解决了对称加密密钥的传输问题,同时也解决了处理速度过慢的问题,然而这种方式还是有缺陷的,就是如何验证客户端使用的非对称加密的公钥是服务端所期望的密钥呢?下面就介绍HTTPS的通信流程.
HTTPS数据加密通信流程
1.客户端发出请求https://www.driver.com,服务端响应并返回非对称加密公钥及数字证书(数字证书是由数字证书认证机构颁发的公开秘钥证书。服务器的运营人员可以向认证机构提出公开秘钥申请。认证机构在审核之后,会将公开秘钥与公钥证书绑定。)
- 客户端接收到服务器端的公钥与证书,验证证书是否在信任域内,不信任则结束通信,信任则使用服务端传过来的公钥生成一个“预备主密码”,返回给服务端.
- 服务端接收客户端传过来的“预备主密码”密文,使用私钥解密。第三方无法获取到“预备主密码”的明文,因为除了服务端,其他任何人是没有私钥的。
- 双方使用“预备主密码”生成用于会话的“主密码”。确认后,结束本次SSL握手,停止使用非对称加密。
- 双方使用“主密码”对称加密传输数据,直到本次会话结束。 进而保证了数据通信的安全性和处理速度.
网友评论