目录
[编辑 4.正文](#编辑 4.正文)
HTTP基本概念
HTTP往往是基于TCP协议实现的,HTTP3.0基于UDP实现。HTTP通常在网页与服务器之间的交互,手机APP和服务器之间的交互。HTTP的作用大应用广,但实际开发中大概率使用HTTPS,本质上还是HTTP,引入了额外加密层。想要进一步了解HTTP协议工作过程,理解HTTP协议报文格式,需要用到"抓包工具"。
抓取HTTP的请求/响应数据
打开Fiddler,抓取浏览器的请求/响应内容:

这些结果都是浏览器打开bing网页的时候给bing发送的http/htpps的请求数据,浏览器访问http服务器时不止一个请求,也可能是多个请求。
蓝色的请求是服务器返回的HTML数据
黑色的请求是普通数据
ran对应的就是原始请求的数据,HTTP协议是一个文本格式的协议,本质上,一个HTTP数据包就是按照上述HTTP协议的格式。构造出一串文本,写入到socket中。
HTTP请求报文
1.首行
首行包含三个部分,请求的方法、请求的URL、版本号,通过空格来区分分这3个部分:例如
请求的方法:
GET https://cn.bing.com/notifications/render?
请求的URL:
bnptrigger=%7B%22PartnerId%22%3A%22HomePage%22%2C%22IID%22%3A%22Bnp
%22%2C%22Attributes%22%3A%7B%22RawRequestURL%22%3A%22%2F%3Fmkt%3
Dzh-CN%22%2C%22Referer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%7D%
7D&IG=D35A41719F3D460FBA7E99BEFD2930DF&IID=Bnp
版本号:
HTTP/1.1
2.请求头(header)

header中可以包含若干行数据,本质上是一个键值对结构。
3.空行
最后一个header后面存在一个空行,类似链表使用null结尾。
4.正文body
正文是可选的http的body相当于tcp/ip等协议的载荷一样,内容任意,可以放任何你想传输的数据。
HTTP响应报文
1.响应首行
例如:HTTP/1.1 200 OK 分别对应:版本号 状态码 状态码描述。响应的首行描述这个响应的成功或者失败,和具体的原因。
2.响应的报头

与请求的报头类似。
3.空行
报头最后有一个空行用于区分。
4.正文
正文中内容任意,空行没有特殊意义,只有HTTP数据包中的第一个空行才是header的结束标记。
HTTP详细情况
URL唯一资源定位符(网址)
协议名称:http://
IP地址/域名
端口号 http - 80 https - 443 ssh - 22 ftp - 23
路径(path)描述了服务器上的哪个程序,管理的哪个资源。
查询字符串 query string 浏览器给服务器传递的参数,使用 = 分割键和值
片段标识符 # 表示网页中的某个部分
GET和POST的区别
GET和POST都是HTTP中的请求方式。
GET和POST从本质上讲:没啥差别,GET的应用场景,使用POST也可以,POST的应用场景,使用GET也可以。
从使用习惯的角度来讲:
1.GET从语义上说,通常用来获取数据,POST从语义上来说,通常用来提交数据。
2.服务器对应GET请求的设计是幂等的,POST请求的设计不是幂等的。HTTP官方文档的建议。
同一个人,不同时间进行搜索,结果不一样。不同的人搜索,结果也不一样。
3.GET请求可以被缓存,POST一般不行。
HTTPS
HTTPS本质上就是HTTP基础上增加了一个加密层,即HTTPS = HTTP + SSL(安全相关的协议)。HTTP本身是一个不安全的协议,为了安全传输信息,引入了加密。
对称加密
最简单的就是对称加密:

每个客户端生成自己的密钥,告诉服务器就可以实现对称加密。如果中间有黑客,获取到的数据也是加密的,只要黑客不知道密钥,就无法知道明文是啥。那么如何把密钥传给对方呢?如果采用明文传输,黑客就会获取到密钥,此时就需要给密钥进行加密。
非对称加密:
通过使用非对称加密的方式,对密钥进行加密。服务器生成公钥和私钥,当客户端连接上服务器后,服务器就会把公钥告诉客户端,接下来客户端生成对称密钥,通过服务器拿到的公钥,针对对称密钥进行加密,再把对称密钥的秘文传输给服务器。服务器用私钥对公钥进行解密,解密成功拿到对称密钥,最后拿到原始数据。

即使使用对密钥加密传输,黑客还是能获取到原始数据。
中间人攻击:
黑客模仿服务器,自己生成私钥和公钥,向客户端伪造信息,在伪造客户端与服务器进行通信:

此时客户端和服务器都无法发现黑客的存在。
解决中间人攻击:
解决中间让人攻击,最关键的 就是让客户端分辨当前的公钥是不是需要通信服务器的公钥。引入第三方公证机构对公钥进行公证,此时客户端看到了这个公钥被公证了,就可以认为这是合法的公钥,然后使用合法的公钥进行加密通信。
服务器上线自己网站的时候,就会去第三方公证机构申请一个证书,客户端收到证书后,就会对这些证书进行合法性校验:
1.针对证书的字段进行计算校验和,得到校验和1。一个证书会包含类似字段,如:发证机构、证书的 有效期、服务器公钥、证书持有者、持有者网站域名等,拿到这些明文进行校验和的计算。
2.针对数字签名进行解密,得到校验和2。数字签名是用公证机构的公钥进行加密的,解密时使用公证机构的公钥进行解密。这个公钥并不是通过网络的方式获取的,而是操作系统会内置公证机构的公钥。
3.客户端比较校验和1和校验和2。当校验和相等时,就说明整个证书是没有被修改的,证书有效,证书中的公钥也自然可信服务器的公钥。
引入公证机构后,即使黑客解密公证机构的公钥,也无法对数字签名进行修改。如果黑客修改了证书中的公钥,但是不修改校验和,客户端进行校验时校验和不相同,就可以判定证书不合法。如果由于黑客不知道公证机构的私钥,黑客不就能对校验和进行修改。
文章到此结束,感谢观看