文章目录
前言
提示:这里可以添加本文要记录的大概内容:
网络协议种类非常多,其中一些耳熟能详的有IP,TCP,UDP…其中还有一个应用非常广泛的协议:HTTP,这个协议就是我们日常开发中用的最多的协议
提示:以下是本篇文章正文内容,下面案例可供参考
一、HTTP是什么?
HTTP(全称为“超文本传输协议”),是一种应用非常广泛的应用层协议
HTTP处于TCP/IP五层协议的应用层,HTTP在传输层是基于TCP的
传输层协议主要关注的是端对端之间的数据传输,TCP重点关注的是可靠传输。
应用层协议则是站在程序应用的角度,要对传输的数据来进行具体的使用。
应用层协议很多时候是程序员自己定制的——可根据实际需求的常见来设计协议,但是程序员的圈子里水平良莠不齐,于是有些大佬发明了一些很好用的协议,大家直接照搬即可。http就是其中一个典型。
http虽然是已经设计好的,但是自身的可扩展性还是很强的,可以根据实际需要,让程序员自己传输各种自定义的数据信息。
我们HTTP具体的应用场景:我们天天在使用的浏览器
二、理解应用层协议
我们已经学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程[ IP+Port ].
可是,仅仅把数据从A点传送到B点就完了吗?
ps这就好比,在淘宝上买了一部手机,卖家[ 客户端 ]把手机通过顺丰[ 传送+路径选择 ] 送到买家 [
服务器 ] 手里就完了吗?当然不是,买家还要使用这款产品,还要在使用之后,给卖家打分评论。
所以,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或
者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节!
这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议
之一的HTTP就是其中的佼佼者。
ps:再回到我们刚刚说的买手机的例子,顺丰相当于 TCP/IP 的功能,那么买回来的手机都附带了说
明书【产品介绍,使用介绍,注意事项等】,而该说明书指导用户该如何使用手机【虽然我们都
不看,但是父母辈有部分是有看说明书的习惯的:)】,此时的说明书可以理解为用户层协议
三、HTTP协议的工作过程
四、HTTP协议格式
协议格式:数据具体是什么组织的
我们来回忆一下笔者之前文章讲的一些协议:
UDP:报头(源端口、目的端口、长度、校验和)+载荷
UDP/TCP/IP这些协议都是属于“二进制”的协议,经常要理解到二进制的bit位。
HTTP则是一个文本格式的协议(不需要去理解具体的二进制位,而只需要理解文本的格式即可),文本格式——更方便人肉眼来观察
那如何才能看到HTTP的报文格式?
我们可以通过一些“抓包工具”,来获取到具体的HTTP交互过程中
抓包工具,其实就是一个第三方的程序,在这个网络通信的过程中,类似“代理”。
举个例子:我们上学总会有有一些同学为了勤工俭学,然后提供代拿外卖、跑腿服务,他这种就是“代理”,也就是和我们这里“抓包工具”一个意思。
网络上的抓包工具有很多,我们这里主要使用Fiddler这个抓包工具
Fiddler是专门抓HTTP的抓包工具
ps:官方下载网址https://www.telerik.com/fiddler
下载好安装包后一路往下点就可以了。
下载好之后在你安装的文件夹中运行Fiddler.exe
进入软件,重点来了!!!
点击左上角的Tools
点击完Tools,选择options,在HTTPS中把下图这几个选项都勾选上
然后Fiddler可能会提醒你,要安装某某证书,一定要点是,一定要点是,一定要点是!!!你要是没点,到时候啥也没抓到不要来问我为什么。
另外Fiddler作为一个代理,是和其他代理程序冲突的,如果你电脑上安装了其他代理程序/插件,可能会导致Fiddler失效(什么也抓不到)
关于其他代理程序或插件:比如你电脑上的某某加速器、某某VPN、某某翻墙工具。。。为了保证正常使用Fiddler,请使用时退出其他相关程序。
4.1抓包工具的使用
进入Fiddler
Fiddler左侧是一个列表,显示到当前抓到的所有HTTP/HTTPS的数据报
ps:HTTPS是HTTP的孪生兄弟,它就是在HTTP的基础上引入了加密机制。
当你选中左侧列表的某个条目,并且双击的时候,Fiddler右侧就会显示这个条目的详情信息:请求+响应
请求——你对老板说:“来份水饺”
响应——老板给你水饺
先来看看请求部分:
上图这个标签页的选项,就表示了当前使用什么样的格式来显示HTTP请求。我们用的最多的就是Raw这个选项
Raw表示看到的就是HTTP的本体,选择其他选项,相当于Fiddler对数据进行了一些加工,调整了格式。我们这里点击一下Raw,看看实际效果:
有些同学会说,你这个字太小了啊,谁看的清啊!没关系,点击右下角按钮view in Notepad
就会出现一个记事本,你就可以在记事本里面看了。
记事本里面就是HTTP请求的原始模样,如果你往TCP socket中按照上述格式来构造数据,并且写入socket,其实本质上就是相当于构造了一个HTTP请求。
我们再来看看响应部分:
针对响应来说,也有很多选项,此处我们也要选Raw才能看到本体
注意:并不是所有本体都像上图这样,也有一些会出现一些乱码
而乱码其实是压缩后出现的结果,一个服务器,最贵的资源,其实是网络带宽,像HTTP这些响应,经常会很大,就比较占用带宽,为了提高效率,服务器就经常会返回压缩后的数据,由浏览器收到后再解压缩。
举个例子:你买了个大沙发,但是快递没办法一下子运这么大的东西,怎么办?压缩啊!一般都是把沙发拆成几份发货。
然后你如果想点开看详情,和请求那块一个办法,点右下角的点击右下角按钮view in Notepad你就可以在记事本里面看了。
使用fiddler小技巧:左侧的列表会一直持续的抓取新结果,很快列表就会很大(很多网站都在不停的和服务器进行交互,甚至说你电脑上有些程序也会偷偷和别人的服务器使用HTTP交互)
很多时候我们要进行清屏,选中一条记录,然后ctrl+a全选,然后delete删除。
比如我这里登陆一下gittee就抓到了这么多
4.2协议格式总结
4.2.1请求
请求分成四个部分:
1.请求行(首行),包含三个部分
a)HTTP方法,方法大概描述了这个请求想做什么
b)URL表示要访问的网络上的资源具体在哪里
c)版本号,比如HTTP/1.1 表示当前使用的HTTP的版本是1.1
1.1是当前最主流的版本,1.0比较老了,0.几的版本都是上古时期的了
2.请求头(header),包含了很多行,每一行都是一个键值对,键和值之间使用:空格来分割
ps:这里的键值对的个数不是固定的,不同的键和值表示的含义也不同(我们后面会介绍一些常见的键值对含义)
3.空行,相当于请求头的结束标记,类似链表的null
4.请求正文(body) ,这个是可选的,不一定有
举例说明:我们找了一段HTTP请求
4.2.2响应
响应也分四个部分
1.状态行(首行),包含三个部分
a)版本号,比如HTTP/1.1
b)状态码,描述了这个响应是“成功的”/“失败的”,以及失败的原因
c)状态码的描述,光用状态码那仅仅是一串数字,状态码的描述相当于帮你翻译了一下状态码,
比如状态码“ok”,就表示没毛病嗷,老铁。
2.响应头(header),也是键值对结构,每个键值对占一行,每个键和值之间使用:空格分割。
3.空行,表示响应头的结束标记
4.响应正文(body)表示服务器返回给客户端的具体数据,这里面的东西可能有不同的格式,最常见的格式是html
举例说明:我们找一段响应数据
五、HTTP请求(Request)
5.1认识URL
5.1.1URL基本格式
URL含义就是“网络上唯一资源的地址符”,说句人话就是:网络那个资源在哪里
而我们要明确,我们说的网络由什么构成?——主机、路由器、交换机、手机等等这些设备通过网络连接在一起,我们的设备上面又包含了很多具体的资源。
比如我的电脑里面存了一些word文档,张三的电脑里面存了一些图片,李四的电脑里面存了一些小电影。这些都是属于具体的资源,我们通常是通过文件的方式组织这些资源。
所以我们说的“网络上唯一资源的地址符”,既要明确主机是谁,又要明确访问里面的哪个资源
举个例子:
https://www.baidu.com/
https://www.bilibili.com/video/BV1r3411A7VF?spm_id_from=333.851.b_7265636f6d6d656e64.2
上面两个都是URL
通过浏览器,打开网页的时候,地址栏里面填写的这个“网址”其实就是URL
URL 的详细规则由 因特网标准RFC1738 进行了约定
1.协议方案名,描述了当前这个URL是给哪个协议来使用的,比如http://表示是给HTTP用的;比如https://表示是给HTTPS用的
2.登录信息,这个现在很少用到,那都是上古时期的会在这里用用户名和密码
3.服务器地址,当前要访问的主机是哪个,这里可以是一个IP地址也可以是域名
4.服务器端口号,端口号,表示当前要访问的主机上的哪个应用程序,端口号大部分情况下省略。
端口号省略的时候,不是说就没有端口号了,而是浏览器会自动赋予一个默认值,
对于http开头的URL,就会使用80端口作为默认值。
对于https开头的URL,就会使用443端口作为默认值
5.带层次的文件路径,文件路径,描述了当前要访问的服务器资源是什么。
虽然请求的URL中写的是一个文件路径,但服务器上并不一定真的有这样一个对应的文件(有可能是由服务器代码构造出的动态数据)
6.查询字符串(query string),本质上是浏览器/客户端给服务器传递的自定义信息,相对于对获取到的资源提出了进一步的要求。查询字符串的内容,本质上也是键值对的结构,完全是程序员自己定义的。查询字符串和路径之间使用“?”来分割
举个例子,我现在买了个大沙发,我去取的时候一下子拿不走,我就对工作人员说我先取一部分,后面的部分后面几批来取。
5.1.2关于 URL encode
当query string 中如果包含了特殊字符,就需要对特殊字符进行转义,转义的过程就叫作URL encode
反之将转义后的内容还原回来就是URL decode
URL中有很多特殊的的符号,比如
/ : ? & =等等,这些符号在URL中都是具有特殊含义的。万一query string中也有这些特殊符号,就可能导致URL被解析失败。
urldecode就是urlencode的逆过程;
5.2认识“方法”(method)
我们HTTP协议方法非常多,但是最常用的还是GET和POST
HTTP引入这些方法初衷是为了表示不同的“语义”
语义:是否有特定的含义
但是理想很丰满,现实很骨感。设计HTTP的带佬们希望程序员能够按照HTTP语义来使用这里的各种方法。但是随着时间的推移,使用就走形了。现在大家写代码,基本上都是GET/POST 直接干…基本不会考虑语义的事情。
甚至你可以用GET来给服务器发送东西
可以用POST从服务器拿走东西
也正因为如此,多种HTTP方法之间的界限就变得模糊了。
先盖棺定论:GET和POST没有本质区别
具体来说,相当于是GET能做的,你也可以用POST做
POST能做的,你也可以用GET做
5.2.1GET方法
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.
在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.
另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.
使用 Fiddler 观察 GET 请求
打开 Fiddler, 访问 搜狗主页, 观察抓包结果
.你可以在fiddler里面点raw 然后view一下,记事本的首个就是GET
GET 请求的特点
首行的第一部分为 GET
URL 的 query string 可以为空, 也可以不为空.
header 部分有若干个键值对结构.
body 部分为空.
5.2.2POST方法
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求.
使用 Fiddler 观察 POST 方法
你登录某个网站,输入账号密码后就能看到post请求
POST 请求的特点
首行的第一部分为 POST
URL 的 query string 一般为空 (也可以不为空)
header 部分有若干个键值对结构.
body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由
header 中的 Content-Length 指定
5.2.3其他方法
PUT 与 POST 相似,只是具有幂等特性,一般用于更新
DELETE 删除服务器指定资源
OPTIONS 返回服务器所支持的请求方法
HEAD 类似于GET,只不过响应体不返回,只返回响应头
TRACE 回显服务器端收到的请求,测试的时候会用到这个
CONNECT 预留,暂无使用
这些方法的 HTTP 请求可以使用 ajax 来构造. (也可以通过一些第三方工具)
任何一个能进行网络编程的语言都可以构造 HTTP 请求. 本质上就是通过 TCP socket 写入一个符
合 HTTP 协议规则的字符串.
5.3认识请求报头 (header)
header 的整体的格式也是 “键值对” 结构.
每个键值对占一行. 键和值之间使用分号分割.
不同的键值对表示了不同的含义,当前这里的键值对种类有很多,我们这里只介绍一些常见的、简单的。
5.3.1Host
表示服务器主机的地址和端口.
比如我现在登录了搜狗网页,用fiddler抓取
然后你在request那里view一下,记事本的第二行就是Host
Host描述了当前要访问的目标服务器在哪里
5.3.2Content-length和Content-Type
Content-length表示body中数据的长度
Content-Type表示请求的body中的数据格式
我们看看刚才抓到的搜狗浏览器有没有Content-length和Content-Type
好像没有,为什么呢?因为这个本身就没有body啊
需要注意的是Content-Length和Content-Type都是描述body的,如果你请求里没有body(比如你是一个GET请求),自然也就没有这两个字段了。
ps:一般POST都是带body的,一般登录都是基于POST来实现的。
我们这里登录一下gitee,抓一个post
body里面的数据人家都是做过加密和转换的,你看不懂也没事,在开头的部分就会有我们这里介绍的
Content-length和Content-Type,如下图
注:Content-Type的一些常见选项
application/json是最常见的请求中的body格式 json
5.3.3User-Agent(简称UA)
UA表示的是用户用什么东西来上网
比如我们刚抓的一个,这里面就有一个User-Agent
UA也许我们不能看懂其中每一个信息,但是总结下来也就两部分信息:操作系统信息+浏览器信息
那为什么要有这样的信息呢?这就要追溯到上古时期了
5.3.4Referer
表示了当前的页面,是从哪个页面跳转过来的
注意:Refer不是一定会有的,如果你是通过浏览器地址栏直接输入地址,或者直接点收藏夹,这个时候是没有refer的
那这个是干什么用的呢?比如你现在打开百度
搜索“脱发”,像这种下面标有广告的连接
你每点击一次,refer就会触发一次计数,然后广告商就会给百度打钱
而这种点击次数的统计关乎到钱,所以不可能是一方来单独进行统计
举个例子:比如你让百度给你做广告,点击一次1块钱,那你自己不统计,百度说这条广告连接被点了100w次,你敢信吗?所以一般都是双方都要进行统计的。
对于百度来说,每次点击广告链接,其实都会先访问广告的服务器,服务器计数完,然后再跳转到广告商的页面。
对于广告商来说,他可能在多个平台投放广告,广告商就可以通过refer来判断是哪个平台带来的流量,然后计数
一些小故事
5.3.5Cookie
假设某个网页上,包含恶意代码——如果你触发了这个恶意代码会把你电脑里的文件全部删除。
为了避免上述情况的发生,浏览器为了安全,默认情况下是不允许让页面的js访问到用户电脑上的文件系统的。
但是这样的安全机制有时也会带来一些麻烦,比如有时候确实需要让页面这里持久化存储一些数据方便后续访问网站。
关于Cookie的具体组织形式,举个例子
我现在登录gitee官网,点击网址左边的锁
点击Cookie,你就可以看到有好几个“小房间”,比如这里baidu.com,gitee.com
我们再次点击一下gitee.com,会出现一个Cookie文件夹,文件夹里面还有若干个条目,每个条目都相当于是一个键值对。
选择其他一个条目,点击。显示出来的名称和内容就相当于是键和值
Cookie的数据从哪里来呢?其实是服务器返回给客户端的
我们要想记录用户身份信息,那你得先提交用户名和密码给服务器,然后服务器判断一下能否正确登录。如果可以正确登录,服务器就会返回一个具体的用户信息交给浏览器,保存到Cookie里面。
比如下面抓到的这一个,就包含了一组这样的header,就是服务器完成身份认证之后,就给我们的客户端返回了一些具体信息。
这些信息就是通过Set-Cookie这样的响应报头来表示的。而且可以看到,每个Set-Cookie里面都是一个键值对
Cookie里面保存身份信息,这种事就类似于去医院看病
比如下图抓到的一个
小结:Cookie是浏览器提供的一个持久化存储数据的机制
Cookie的最重要的应用场景,就是存储会话id,进一步的让访问服务器的后续页面的时候,能够带上这个id,从而让服务器能够知道当前的用户信息。
(服务器上保存用户信息这样的机制就称为Session会话)
Cookie能不能用来存储别的信息?当然也是可以的,具体想存什么,由程序员决定。
ps:关于session的理解
比如你qq里面的消息列表,就相当于“会话列表”
聊天记录就相当于用户详情信息。
5.4认识请求正文
正文中的内容格式和 header 中的 Content-Type 密切相关. 上面也罗列了三种常见的情况.
下面可以通过抓包来观察这几种情况
5.4.1 application/x-www-form-urlencoded
这个格式就和query string是一样的,也是键值对结构,键值对之间使用&来分割,键和值之间使用=分割,并且需要进行urlencode
实际的抓包结果比较长, 此处没有全部贴出.
5.4.2 multipart/form-data
这种就是上传一个文件,会通过form-data
5.4.3 application/json
{ }构成的若干个键值对,键和值之间使用:分割,键值对之间使用逗号分割
你登录一个网站,就会抓到这个,比如
六、HTTP响应(Response)
响应有很多和请求一样的地方,我们下面主要介绍不一样的地方
6.1认识状态码
状态码表示这次请求是成功的还是失败的,以及失败的原因是什么
HTTP提供的状态码有很多,比如
上面就是我们最常见的状态码,但其实我们的状态码还有很多,感兴趣的key自行查看
下图是一个有趣的段子,可以帮你快速记忆状态码的类别
1xx表示1开头的状态码
1xx信息正在传输,hold on坚持住
2xx你走对了,Here you go
3xx滚蛋(重定向)
4xx你tm出问题了(指客户端)
5xx我tm出问题了(指服务器)
6.2认识响应报头(header)
响应报头的基本格式和请求报头的格式基本一致.
类似于 Content-Type , Content-Length 等属性的含义也和请求中的含义一致
Content-Type
响应中的 Content-Type 常见取值有以下几种:
text/html : body 数据格式是 HTML
text/css : body 数据格式是 CSS
application/javascript : body 数据格式是 JavaScript
application/json : body 数据格式是 JSON
七、通过form表单构造HTTP请求
我们能否自己通过代码构造出HTTP请求呢?
回答是可以的,构造HTTP请求一共有2个大类:
一、基于HTML/JS
(1)基于form表单
(2)基于ajax
二、基于Java
(1)基于socket
我们本文主要是介绍:基于form表单和基于ajax
form表单的方式就是纯属于html的方式,也就是通过form标签来构造
form标签有两个非常重要的属性
1.action表示要把这个请求提交到哪个服务器
2.method表示你要通过get/post的方式来提交
method只能是get/post(不区分大小写)
先来看看method=get的情况
<form action="http://www.sogou.com/index.html" method="get">
<!-- form表单给服务器提交的数据,本质上是键值对 -->
<input type="text" name="username">
<!-- name属性就是在描述当前输入框对应的key是什么 -->
<!-- name属性和样式无关 -->
<input type="password" name="password">
<input type="submit" value="提交">
</form>
form表单给服务器提交的数据,本质上是键值对。
此处的name属性就是在描述输入框对应的key是什么
比如用户在此处输入的用户名是zhangsan
密码是123
那么form表单生成的要提交的数据就形如:
username=zhangsan&password=123
上述代码网页效果如下:
我们在输入框分别输入zhangsan 123再点击提交
点击提交后你会发现居然跳转到了搜狗的主页
值得注意的是,我们的url发生了改变,并且这个url并不一般
综上:我们这里生成的键值对和我们代码中的写法是息息相关的。
再来看看method=post的情况
<form action="http://www.sogou.com/index.html" method="post">
<!-- form表单给服务器提交的数据,本质上是键值对 -->
<input type="text" name="username">
<!-- name属性就是在描述当前输入框对应的key是什么 -->
<!-- name属性和样式无关 -->
<input type="password" name="password">
<input type="submit" value="提交">
</form>
输入完张三123,再点击提交后,出现搜狗页面的url中并没有query string了。
那难道数据没有传过去吗?并不是,数据通过body传过去的
我们一抓包,就可以看到这里的post请求
点击raw,再点击view in noted
在展现出来的记事本中,你就可以知道username=zhangsan&password=123
当前我们是把这样的请求直接提交给搜狗主页了,但是搜狗处理这样的参数了吗?回答是:“当然没有”
但是我们后面自己写服务器,就可以针对前端提交来的参数进行处理,从而实现一些不同的功能。
八、通过 ajax 构造 HTTP 请求
通过form表单这种方式,是一种非常原始的构造方式。
使用form一定会涉及到“页面跳转”,也就是浏览器需要加载出全新页面,这个事情就非常不科学,尤其是页面非常复杂的时候。
随着前端页面越来越复杂,就希望能够让页面不去整个全部加载,而是只加载其中需要变化的某个小部分。这个情况就可以使用ajax了。
ps:synchronous是同步的意思,这里的Asynchronous是异步的意思
举个例子:
ajax的工作过程:
通过js代码,来构造出HTTP请求,发给服务器
但是我们的客户端(浏览器)不确定服务器什么时候才有响应,
所以浏览器先不管,浏览器里面继续执行其他代码(该干什么干什么)。
等到浏览器的响应回来了,再通过js代码,以回调函数的方式来处理这里的响应,
并且把得到的数据更新到页面上。
ajax使用具体说明:
你先在jQuery cdn加速这个网页中把图中url复制一下
(为什么要弄jQuery?因为ajax是jQuery里面的…)
然后你在浏览器中新建一个页面,把url复制粘贴一下,然后转到下图页面
ctrl+a全选,然后cv工程师,把整个复制一下。
然后在你的vscode里面创建jQuery.js,把复制的内容粘贴进去
然后开始我们的操作
<script src="jQuery.js"></script>
<script>
// 变量名.js允许$作为变量名的一部分
// 这个$就是jquery中最核心的对象
// jquery的各种api,都是通过$来触发的
$.ajax({
// 通过$对象来调用ajax函数,参数只有一个,但是是一个对象
type:'get',
url:'http://www.sogou.com/index.html',
success:function(body){
//success对应一个回调函数
//这个函数就会在正确获取到http响应后,来调用
//也就是我们说的异步
// 回调函数的参数,就是HTTP响应的body部分
console.log('获取到响应数据:'+body)
},
error:function(){
//error也对应一个回调函数
//该函数会在请求失败后触发(也提现了“异步”)
console.log('获取响应失败')
}
})
</script>
因为我们这个代码是直接写到script标签里面去的,所以保存后网页加载时可以直接运行这段代码。
如下图,我们控制台这里有一些报错信息,然后打印了获取响应失败。
获取响应失败表示我们触发了error这里的回调函数。
我们也是可以抓到这个包的
我们在下面的响应view一下,在记事本里面可以看到,响应已经是搜狗的html页面了,而且最上面是200OK,那为什么没有浏览器仍然报错呢?
因为刚才的ajax请求,通过抓包看到,响应里面是200OK,并且body也是html数据,但是浏览器仍然认为这是一个“出错请求”
为什么跨域就不行呢?
你ajax乱访问,别人的服务器压力很大啊
就比如,你晚上可以回自己家,但是你不能乱闯入别人家,差不多一个意思。
ps:我们也是有办法绕过这个限制的,如果对方服务器返回的响应中带有相关的响应头,允许跨域操作,就可以正常被浏览器显示。
因此当下我们自己构造的ajax请求是无法被正确处理的。
什么时候才能被正确处理呢?我们需要有一个自己的服务器,让页面和ajax的地址都是一个服务器。
注:关于用java构造HTTP请求
九、HTTPS
9.1HTTPS是什么
HTTPS相当于是HTTP的孪生兄弟,HTTPS在HTTP的基础上,引入了一个加密层。
HTTP是文明传输,传输的数据容易被获取并篡改
HTTPS就是对数据加密,更好的保护数据的安全。
关于加密:加密是一个非常复杂的事情,计算机领域中有个专门的学科就叫作“密码学”
9.2“加密”是什么
加密就是把 明文 (要传输的信息)进行一系列变换, 生成 密文
解密就是把 密文 再进行一系列变换, 还原成 明文 .
在这个加密和解密的过程中, 往往需要一个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为密钥
需要注意的是:加密后也不是绝对安全,只是说破解起来计算量很大,成本很高。
9.3HTTPS的工作过程
在HTTPS中引入的加密层称为SSL/TLS
(SSL是旧的叫法,TLS是新的叫法,你就认为是同一共东西即可)
在SSL中,涉及到的加密操作主要是两种:
(1)对称加密:使用同一个密钥,既可以进行加密,也可以进行解密
(2)非对称加密:使用公钥和私钥
9.3.1引入对称加密
客户端和服务器都持有同一个密钥
客户端传输的数据(HTTP请求的header和body)都通过这个密钥进行对称加密
实际上在网络上传输的是密文
服务器在收到密文之后,接下来就可以根据刚才的密钥来进行解密,拿到明文
9.3.2引入非对称加密
经过上面的讨论,我们就知道了。使用对称加密,最大的问题就是密钥能够传递出去,如果是明文传递是很不可靠的,必须针对这个密钥进行再加密。
所以我们这里解决问题的关键就是引入非对称加密。
非对称加密,有两个密钥:公钥和私钥
公钥:人人都可以获取到
私钥:只有自己才知道
我们可以通过公钥来加密,私钥来解密;或者公钥解密,私钥加密
公钥私钥举个例子:
比如我们很多小区单元门口,有个信箱。然后你有一把钥匙和很多把锁头。
你把这些锁头给送信小哥,每个送信小哥都可以凭借这些锁头来把信锁到你信箱里面。
但是只有你拿着钥匙能开箱。
基于非对称加密,就可以让服务器字节生成一对公钥和私钥。公钥发出去(人人都可以拿到),私钥自己保存。
客户端生成一个对称密钥,客户端就可以使用服务器的公钥,对对称密钥进行加密,然后把数据传给服务器,服务器再通过私钥进行解密。
既然非对称加密这么好使,还要对称加密干什么呢?直接非对称加密不就行了?
解释:实际开发中,对称加密的计算开销<<非对称加密
9.3.3引入证书
既然存在中间人攻击,我们怎么解决这个问题呢?
关键要点,需要让客户端能确认,当前的公钥确实是来自服务器,而不是黑客伪造的。
举个例子:
我们生活中去网吧,需要进行身份登记。如何确认你的身份?刷身份证呗。
网管会拿身份证查询公安局的相关服务器,验证你的身份信息。
那么反应到我们这里也是一样的,我们可以引入一个第三方公信机构,来证明这个公钥是一个合法的公钥。
9.4总结
HTTPS 工作过程中涉及到的密钥有三组.