一、前文总结
请求:
- 首行:方法 url 版本号,有这三个元素。
- 请求头:就是键值对
- 空行
- 正文,在空行后面才是正文
响应:
- 首行:版本号 状态码 状态码描述
- 响应头:键值对
- 空行
- 正文
url部分的案例: 协议名://ip地址(域名):端口号/路径?查询字符串,这里面查询字符串是自定义的,就像"age=20"这样的字符串。
方法有:GET,POST,PUT,DELETE
GET 和 POST 的区别是:1.语义上。2.GET经常把数据放到 url 的query string 中,POST 经常把数据放到 body 中。
请求头的关键属性
- Host:是访问的服务器的主机IP和端口
- Content-Length:body的长度(单位是字节)
- Content-Type:是body的数据格式,例如css、html、json、图片...
- Referer:当前页面是从哪个页面跳转过来的
- Cookie:是浏览器在本地存储数据的一种方式,是通过键值对来存储的
服务器通过Set-Cookie把Cookie返回给浏览器,浏览器保存好这个Cookie,后续服务器给服务器发送请求的时候,都会带上这个Cookie,就免去再次验证用户身份的环节了。按照域名为维度,以键值对的方式来存储数据。Cookie中的内容都是程序员自定义的。就像实现登陆身份验证的这个环节。
二、状态码
2开头的是成功,3开头的是重定向,4开头的是用户端操作错误,5开头是服务器错误。
状态码表示了响应的结果,是正确还是错误,出错是什么原因。正确使用状态码能让我们在发生错误的时候通过状态码可以快速找到哪里的业务逻辑错误。
- 200 OK:是最常见的状态码,表示成功,使用 filddler 抓包抓取的很多都是这个状态码。
- 4XX
- 404 :访问的资源没有找到,一般都是用户输入的 url 也就是网址发生错误,或者是访问了该网址下没有的资源。
- url:IP 定位到主机,port 定位到程序,path 定位到程序管理的资源,如果 path 访问的是该服务器上没有的资源,那么就会出现404 这个状态码。
- 5XX
- 服务器出现错误,还有服务器处理逻辑的代码抛出异常,但是你没有 catch 到异常,就会抛出这个5XX的状态码。
- 3XX
- 是重定向,就是你去访问服务器 A,服务器 A 让你去找服务器 B,这时候你访问服务器 A,就去访问服务器 B了,这时候就是重定向。这时候如果要迁移新的域名,这时候旧域名就可以使用重定向来让访问旧域名的用户跳转到新域名新服务器上。
三、http请求
HTTP请求本是上就是TCP请求,只要构造的 字符串复合 HTTP 协议格式,就可以写入到TCP的socket中。
Postman这样的工具就可以构造HTTP请求,可以使用这个工具来对自己的网站来进行测试。
四、HTTPS
HTTPS是HTTP 协议的加密协议。在原来的 HTTP 协议在进行传输的时候,是非常不安全的,当当前数据传输到某个路由器的时候,这个路由器被黑客入侵之后,就能抓取我们发送的这个数据,也可以进行修改。就像你我都是一个广告的代理商,这时候你那里有一条传输到广告发布商的网址那里,我截取这条路径上的某个路由器,把你发送的这条数据给修改成我的网址的跳转指令,这时候你的广告跳转次数就和发布广告客户的手里的广告跳转次数就对不上了。
为了防止上面的数据在传输的路上被修改,就有了 HTTP 协议的加密格式 就是 HTTPS 协议。
因为发送数据涉及加密,所以接收数据就涉及解密。加密的方式有两种:
- 对称加密:加密和解密是使用同一个密钥
- 非对称加密:加密使用一个密钥,解密使用另一个密钥。这里存在关联关系,很难让不是加密和解密双发的非法入侵者拿到数据。它的两个非对称密钥,哪个密钥加密,哪个密钥解密都是可以的,他们都可以互相加密和解密。
就是公钥加密,私钥解密,或者 公钥解密,私钥加密。只要约定好,那么就没关系。
五、HTTPS 工作原理
就像是http在进行网络传输的时候,因为是明文进行传输,所以一旦中间某个路由器被黑客入侵之后,就能直接抓包获取我们当前传输的内容,也可以在抓取的内容上进行修改。这就导致了我们每次传输的时候的不确定性和危险性,还有透明性,任何人黑入该路由器就可以进行抓包来获取我们传输的内容。
为了防止那种情况,我们就对http 协议进行了加密,这样可以保证我们传输数据的安全性和稳定性还有隐私性。总的流程文字来说就是:因为网络传输是可以被抓包抓取的,所以我们客户端在所有通信过程中都要进行加密,在第一次加密的时候可以使用服务器的公钥进行加密,然后在进行网络传输的时候即使被黑客抓取了,因为服务器的私钥是在服务器那里,黑客并没有服务器私钥来进行解密,就不知道客户端传输的什么信息,只能抓取到一堆密文。就像下图。
因为如果一直使用这种非对称加密的话,那服务器使用私密解密客户端发来的请求之后,使用什么方式进行加密呢?如果使用私钥加密,公钥解密,那黑客在服务器给客户端发送响应的时候使用公钥解密,就能知道响应是什么了,然后因为黑客不知道私钥,所以进行加密的时候就不知道使用什么密钥进行加密。如果使用公钥加密,那到了客户端使用公钥解密的时候也是解密是失败的,因为是非对称加密解密,公钥加密就必须使用私钥解密,私钥加密就必须使用公钥解密。所以到客户端之后是知道这中间的数据被篡改了。这也是很危险的。
这时候为了保证第二次乃至后续的加密解密都是只有客户端和服务器知道,这时候就使用非对称加密和对称解密这种方式来进行(你使用两次非对称加密也是一样的)。
首先,由客户端生成一个随机的对称加密密钥(随机密钥这里为 XXX),客户端把这个对称密钥最为数据传送给服务器,在传送的时候使用服务器的公钥进行加密,所以在整个传输的过程中,不管黑客入侵了哪个服务器,由于他是没有服务器的私钥的,是无法解密这个数据,就不知道里面传输的内容的。
然后这个数据到服务器那里,服务器使用私钥进行解密,知道了客户端是使用 XXX 这个对称密钥进行加密和解密。所以后续服务器产生的响应直接使用 XXX 这个密钥进行加密,而且后续客户端发送来的请求也是用 XXX 这个密钥进行解密。因为在传输这个使用哪个密钥的信息数据都是由服务器端公钥进行加密的,由于黑客没有服务器的私钥就无法解密,就无法知道这个数据是什么,也就无法知道后续服务器和客户端是使用哪个加密方式进行加密,哪个解密方式进行解密。
所以后续服务器把响应数据使用 XXX 这个加密方式进行加密之后传输给客户端,客户端直接使用它生成好的 XXX 这个密钥进行解密,来获取服务器传输来的相应信息。