Http 报文格式
一、请求报文
一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。
1.1 请求行
- 请求方法
- URL
- Http版本
eg:GET /data/info.html HTTP/1.1
GET /1M03AD3PAK00009_img/cloud_2/Alarm/20190307104231954_56ef1589a11e403fa661640b1fbd99e9.jpg?e=1551928902&n=4e28bb4&token=1NXtHVVtpZFxeDkr3YIRCBCcUsk= HTTP/1.1
1.2 请求头部
请求头设置一些文本格式、编码格式、文本长度等内容;如下图 分别为 GET 、POST请求头
User-Agent:User-Agent头域的内容包含发出请求的用户信息
Host: 客户机通过这个头告诉服务器,想访问的主机名。
Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”;
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip;
Content-Length:表示请求消息正文的长度;
Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
1.3 请求数据
下面列出GET 和POST 两种请求数据:
从上面的图可以看到 Get 请求没有请求数据,没有File Data 这一行数据,它的请求数据在URL拼接了;而POST 有File Data ,并且下面会显示出请求表单数据。
1.4 空行
它的作用是通过一个空行,告诉服务器请求头部到此为止。
二、响应报文
HTTP响应报文也由三部分组成:响应行、响应头、响应体。和请求报文对应的。
2.1 响应行
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK——其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
我们常见的状态码:200、404(资源没找到),430(服务拒绝访问,没权限)、500 等等
2.2 响应头
和请求头类似,会描述一些信息。
2.3 响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码。
三、 一次完整的HTTP请求
完整步骤如下:
1.域名解析(DNS解析)——2.TCP三次握手——3.建立TCP连接后发起http请求——4.服务器端响应http请求,客户端得到响应报文——5.断开连接
3.1 域名解析:首先服务端会进行本地缓存中去查找相关的DNS缓存,若没有找到就去调用运营商提供的DNS服务器;
3.2 TCP三次握手 :三次握手建立连接 (参考 TCP 三次握手)
3.3 建立TCP连接后发起http请求 : 发起请求;
3.4 服务器端响应http请求,客户端得到响应报文:客户端和服务端进行通信;
四 、https 加密原理
4.1 对称加密
定义:最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),就是说只有一把钥匙。常用算法 DES 。
缺点:传输过程被盗取的后果很严重,秘钥的管理和分发非常困难,不够安全。
4.2 非对称加密:
定义 :加密和解密使用不同的秘钥,一把作为公开的公钥(在客户端),另一把作为私钥(放在服务端)。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。常用算法 RSA 。
在C/S 模型中,服务端管理私钥,客户端持有公钥。
4.3 Https 加密流程 (可参考 链接)
HTTPS = HTTP + SSL/TLS
一句话总结:HTTPS要使客户端与服务器端的通信过程得到安全保证并且高效,则在通信时使用效率较高的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
大致如下:
1 客户端发送报文进行SSL 通信,报文中包含自己可以使用的加密组件列表、随机数;
2 服务器应答,并在应答报文中包含SSL版本和相应加密组件(服务端的加密组件是根据客户端加密组件内筛选出来),并把公钥放入报文中传输给客户端,也返回随机数。
3 客户端拿到这个公钥后,进行本地验证是否被中间人篡改,通过数字证书去验证,并生成一个Pre-master secret随机码并通过公钥去加密;
前面三步是握手协商过程,就是为后面的对称加密做准备
4 客户端报文发到服务端,然后服务端用之前发送给客户端的公钥去解密,解密成功后,并约定以后用Pre-master secret密钥去加密报文,这样就从非对称加密变成了对称加密了。这样服务端告诉客户端解密成功并建立起SSL连接。之后就可以发送HTTP请求了。
以上过程可以称为SSL握手,但和三次握手不是一个东西,不要搞混了,SSL握手发生在三次握手后面。
如果想要形象的理解整个过程,可以看 链接 ,或其他 参考 。 另外,可以询问证书颁发机构关于防止中间人攻击的思路,可以看网站 https://www.wosign.com/news/httpsjiami_20180817.htm