http协议是应用层协议,超文本传输协议,是建立在tcp连接之上的无状态连接,客户端发送请求,服务器响应。无状态就是上一次的请求对这次的请求没有任何影响,服务端也不会对客户端上一次的请求进行任何记录处理。解决无状态这种现象使用了Cookie和Session机制。Cookie用在客户端,Session用在服务端。
一个完整的http请求包括请求行,请求头,请求实体。
请求行
- 包括请求方法,url,和协议版本号。
请求头
- 有很多字段,具体可以百度。
请求实体
- 就是请求的数据,get,post请求封装的数据。
服务器响应包括响应行,响应头,响应实体。
响应行包括协议版本、状态码及其描述组成 例如: HTTP/1.1 200 OK (协议的版本号是1.1 响应状态码为200 响应结果为 OK)
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
响应实体就是返回的数据。
一次完整的http请求是如何工作的,例如在浏览器输入http请求访问一个网址:
首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器收到请求之后,服务器调用自身服务,返回HTTP Response(响应)包,客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。
因为http是明文传输,所以是不安全的,所以有一个安全版本的http就是https。http+ssl,ssl是对http连接进行加密的一种协议。其中在安全通信的过程中,使用了对称加密和非对称加密。
通常我们处理https会使用到证书这个东西,可以自制,也可以去认证机构申请(需要花钱),也就是我们所谓的CA证书,一般的浏览器和系统会内置受信任的证书发布机构CA。其中CA内容包含域名,服务器的公钥,还有证书有效期等内容。
https是如何通信的呢?
- 客户端向服务端发送一些信息包括ssl版本号和客户端支持的加密算法还有哈希算法等。
- 服务端收到信息之后选择客户端支持的加密算法,然后将证书返回给客户端。CA认证的证书,这个也是加密的。
- 客户端收到这个证书之后,会在系统内置的一些证书机构中找到跟这个CA证书一样的机构来验证证书的合法性。如果不合法会提示一些不安全信息,如果合法的话会用证书的公钥去解密服务器返回来证书,得到证书内容和证书签名,然后用公钥去解密证书签名得到一个值A,这个签名是证书发布之前CA机构用自己的私钥加密而成的,只能用系统内置对应机构的公钥来解密。然后用同样的哈希方法去加密证书内容,得到一个值B,A和B对比,如果一样证明这个内容没有被篡改过。确认了内容之后,会对内容的域名和证书有效期做校验。
- 校验通过后,会生成个随机数R,然后用证书内容里的服务器公钥加密随机数R发送给服务端。
- 服务端收到后,用私钥解密得到随机数R,然后将返回内容用R加密,之后的通信就会通过R进行加密。
这样https的通信过程就算ok了。