一、HTTP协议(超文本传输协议)
1、应用场景
主流使用HTTP/1.1,该版本传输层使用TCP协议
http主要使用的应用场景是网站,浏览器和服务器之间的交互
客户端(pc,手机)和服务器之间的数据传输也很可能是http
http的交互过程非常典型的一问一答
2、抓包工具
抓包工具本质上是一个代理程序,能够获取网络上的传输的数据并显示出来,提供参考
fiddler 专注于 http 抓包
代理分为两种
正向代理(是客户端的代言人)
反向代理(是服务器的代言人)
打开一个网站,浏览器和服务器间进行的 http 交互请求不只有一次,通常有很多次,第一次交互拿到这个面的html
html还会依赖其他CSS和JS,图片等,html被浏览器加载后,又会触发其他清求获取CSS、JS
执行到JS时,JS代码里可能又要触发很多 http 请求获取到一些数据
fiddler抓到的蓝色数据包表示回的是一个html,往是一个网站的入口请求
双击后可以看到明细:
右上角的明细,点击数据后得到http请求的原始数据
右下角的明细,点击数据后得到的是相应的数据
带宽资源有限,把响应数据压缩了,解压后就会发现响应的数据就是网站的网页html
3、报文格式
1、HTTP请求基本格式
1、首行(包含三个部分)
方法 URL 版本号
2、请求头header(从第二行至最后)
类似于TCP/IP报头,但是是以文本的方组织的
报头中包含很多建值对,每个键值对占一行
3、空行(请求头最下面有一个空行)
这个空行表示结束标记
4、正文(http的载荷部分)
2、http的响应的基本将式
1、首行(包含三部分)
版本号 状态码 状态码描述 (间用空格分割开)
2、响应头
键值对
3、空行
结束标记
4、响应正文(载荷)
4、认识URL
1、概念
URL:描述一个网络上的某个资源的位置,唯一资源定位符
结合一个IP地址,端口号,路径,查询字符串就可以描述出一个网络资源了
一个完整URL:协议名,服务器地址,服务器端口号,文件路径,查询字符串
查询字符串也是键值对格式,使用&来分割键值对,使用=分割键和值
URL encode:
在URL中有些特殊符号具有特定含义,要对上述符号进行转义,汉字也定要进行转义
要构造一个URL,尤其是 query string 中要包含中文,务必要编码
2、方法
描述了这次请求想干什么
GET:从服务器拿一个东西过来(读操作)
POST:往主服务器放一个东西过去(写操作)
两个经典使用 post 的场景:登陆,上传
GET和 POST 有啥区别
GET和POST无根本区别,取决于代码如何实现,大部分情况下相互替换问题不大
但是GET和POST在使用习惯上有区别
从使用习惯上,GET通常没有body,POST通常有body,GET会把需要的服务器信息放到query string中,POST会将该信息放到body
语义上的区别:标准文档中GET是用来获取数据,POST是给服务器传输数据
关于幂等性:标准文档中建议GET请求实现成幂等的,POST则无要求
幂等:每次输入的内容一定,输出的结果也一定
GET请求是可以被浏览器收藏夹收藏的,POST不可以
3、属性
HOST表示服务器主机的地址和端口
Content-length 表示body中的数据长度,通过这个长度来处理粘包问题
Cantent-Type 表示body中的数据格式
若无body,二者也不会有
HTTP底层基于TCP,连续传输多个HTTP数据报,接收的接收缓冲区就会积累多个包的数据,应用程序在读取时就该明确包之间的界限
User-Agent:表示浏览器操作系统的属性,描述了用户用什么设备上网
Referer:描述了当前页面从哪里来,从哪个界面跳转过来
由于 referer 会被修改,https 就会解决上述问题
S:SSL,网络中用来加密的协议
加密就能把header 和 body 都进行加密,网络上传输的就是密文
Cookie:本质上是一个浏览器这边本地持久化存储数据的机制
系统提供了操纵文件的api,刘览器作为一个程序当然可以调用这些api来操作,可以直接读写本地磁盘文件
浏览器给网页提供了一些能够有限的存储数据的API,而不能随意访问文件系统
文件请求中的cookie字段,就是把本地存储的信息发送到服务器这边
响应中会有一个set-cookie字段,服务器告诉浏览器你要在本地保存哪些信息
关于 cookie 几个重要结论:
1、cookie 从哪里来?
服务器返回给浏览器的,通常都是首次访问/登录成功之后
2、cookie 到哪里去?
cookie 会存储在浏览器本地主机的硬盘上,后续每次访问服务器都会带上cookie
不同的客户端,保存的 cookie 是不同的
即使是同一个主机,使用不同浏览器,cookie 大概率也不同
3、cookie 中存什么?
键值对格式的数据,这里的内容都是程序员自定义的,和 query string 一样外人无从理解
不同网站的 cookie 都是不一样的
4、cookie 在浏览器这边如何组织?
在硬盘本地保存,是按照不同的域名为维度分别存储
5、cookie 的用途是什么?
用来在客户端保存数据
其中最主要的是保存用户的身份标识,服务器就可以通过标识来区分用户了
4、常见状态码
状态码,表示响应的结果如何
1、200 Ok 成功
2、404 Not Found 访问的资源没找到
3、403 Forbidden 没有访问权限
4、405 Method Not Allowed 不支持该方法!
5、500 Intenal Server Error 服务器挂了
6、504 Gateway Timeout 访问时间超时(服务器挂了或网络挂了)
7、302 Move Temporarily 重定向
5、如何构造出http请求
1、代码构造
2、通过第三方工具构造(使用postman)
二、HTTPS协议
1、加密
https是在http的基础上加入 ssl 加密层,http 是明文传输(不安全)
加密十分重要,否则会影响信息安全
密码学中几个重要概念
明文:要传输的真实数据,要表达的实际意思
密文:针对明文加密之后得到的结果
密钥:加密解密涉及的关键道具
对称加密:加密解密使用的是同一个密钥
非对称加密:加密和解密使用不同的密钥
2、https工作过程
只要针对https的数据进行解密,就会得到http格式的数据
1、引入对称加密
通过对称加密,针对传输!的数据进行保护(主要针对header 和 body)
对称加密时,客户端和服务器要使用同一个密钥
不同的客户端要使用不同的密钥
但是密钥的传输要到达对方,一旦有人拿到这个密钥意味着加密操作是无意义的
2、引入非对称加密
目的是对对称密钥进行加密,确保对称密钥的安全,
不能使用非对称加密对 header和 body 加密,非对称加密的解密成本太高了
但是黑客可以通过向客户端冒充服务器,构造出一对公钥私钥,并向服务器冒充客户端获取其中的响应
针对上述问题,客户端拿到公钥时要求服务器提供一个证书
证书是一个结构化数据,包含一系列信息如服务器的主域名,公钥,有效期等
证片有一个证节的签名,本质上是一个加密的检验和
把证书中其他字段通过一系列算法,得到一个较短的字特串 => 检验和
客户端拿到证书后:
1、按照同样的检验和算法,把证片的其他字段重新算一遍,得到检验和
2、使用系统内置的公正机构公钥,对证书中的签名进行解密得到捡验和
对比二者若一致就是原版证书,不一致就会被识别,证书被篡改