HTTP
超文本传输协议,目前最主流的一种应用层协议 ,大多数基于TCP协议实现
当我们浏览器中输入一个bing"网址"(URL)时,浏览器就给必应的服务器发送了一个HTTP请求,必应的服务器返回了一个HTTP响应。这个响应被浏览器解析之后,就展示成我们看到的页面内容(这个过程中浏览器可能会给服务器发送多个HTTP请求,服务器对应返回多个响应,这些响应里就包含了页面格式等信息)
协议格式
抓包工具的使用
左侧窗口显示了所有的HTTP请求/响应,可以选中某个请求来查看详情
右侧上方显示了HTTP请求的报文内容(切换到Raw标签页可以看到详细信息)
右下侧显示了HTTP响应的报文内容(切换到Raw标签页可以看到详细信息)

抓包工具的原理
正向代理: Fiddler相当于一个代理,浏览器要访问www.baidu.com时,就会把HTTP请求发给Fiddler ,Fiddler再发给百度的服务器 ;当百度服务器返回数据时,Fiddler拿到返回数据 ,再把数据交给浏览器
反向代理: Fiddler不直接访问百度服务器,而是访问中间服务器,通过百度服务器通过中间服务器与Fiddler进行请求和响应
抓包结果
请求:
首行: 请求方法+URL+版本号
请求头Header: 请求的属性,冒号 分隔的键值对,每组属性之间使用**\n分隔** 。遇到空行表示Header部分结束
Body:空行后面的内容 都是Body,Body允许为空字符串 ,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度

响应:
首行:版本号+状态码+状态码解释
Header: 响应的属性 ,冒号 分隔的键值对,每组属性之间使用**\n** 分隔。遇到空行表示Header部分结束
Body:空行后面的内容都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度。如果服务器返回了一个html界面,那么html页面的内容就在body中

HTTP请求
URL

协议方案名: 常见的有http和https ,也有其他类型,比如访问mysql的jdbc:mysql。省略后默认http://
登录信息(用户名密码): 现在的网络一般不通过URL 进行验证,一般都会省略
服务器地址: 可以是域名 也可以是IP ,域名会被DNS系统 解析成一个具体的IP地址。在HTML中可以省略,省略后表示服务器的域名与当前HTML所属的域名一致
端口号:一般省略 ,浏览器会根据协议类型自动决定使用哪个端口号,http默认80端口,https默认443端口
带层次的文件路径: 表示要访问主机上哪个资源 (可以是一个硬盘上的文件,也可以是虚拟的资源),每一层就相当于一个目录 。可以省略,省略后默认**/.** 一些服务器发现是/.会自动访问**/index.html**
查询字符串: 对要访问的资源补充说明,也是键值对 结构,键值对之间使用**&** 分隔,键和值之间 使用 = 分隔,可以省略
片段表示符 :区分当前这个页面的哪个部分 ,用于页面内的跳转,可以省略
URL encode
像/ ? :这样的字符,已经被url当成特殊意义理解的,因此这些字符不能随意出现。所以说出现这些字符就要进行转义
汉字由UTF-8或者GBK这样的编码方式构成,也需要进行转义,防止浏览器把某个字节当作URL的特殊符号
转义规则: 将需要转码的字符转为16进制 ,然后从右到左 ,取四位 (不足四位直接处理)。每二位做一位 ,前面加上**%** ,编码成**%XY** 格式

方法(method)

GET方法:
用于获取服务器上的某个资源 ,在浏览器中直接输入url ,此时浏览器就会发送出一个GET请求 。HTML中的link,img,script等标签 ,也会触发GET请求
POST方法:
用于提交用户输入的数据给服务器
区别:本质没有区别 ,可以混用 ,使用方法和习惯上有区别
1. 语义不同 ,GET一般用于获取数据 ,POST一般用于提交数据
2. GET的body一般为空 ,需要传输的数据通过query string 传递,POST 的query string一般为空 ,需要传递的数据通过body传递
3. GET的请求一般为幂等 ,POST一般是不 幂等的(多次请求得到的都是一样的结果,则为幂等)
4. GET可以被缓存 ,POST一般不能被缓存
补充:
1.语义: GET完全可以用于提交数据 ,POST也可用于获取数据
**2. 幂等:**标准建议GET实现为幂等,实际开发中不完全遵循这个原则(个性化推荐)
其他方法:
PUT与POST相似,只是具有幂等特性,一般用于更新
DELETE删除服务器指定的资源
OPTIONS返回服务器所支持的请求方式
HEAD 类似于GET,不返回响应体 ,只返回响应头
报头(header)
header的整体的格式也是键值对结构,每个键值对占一行,键和值之间使用冒号分隔
Host:服务器地址和端口
Content-Length: 表示body中数据的长度 ,单位是字节
Content-Type: 表示请求的body中的数据格式,提示接收方如何解析body中的数据
User-Agent (简称UA ):表示浏览器/系统的属性
Referer: 表示这个页面是从哪个页面跳转过来的
Cookie: 存储一个字符串 ,里面通过键值对 的方式存储数据
浏览器展示页面的过程中,页面里虽然可以通过JS实现一些逻辑,但是JS无法访问硬盘文件 。cookie就是浏览器允许网页在本地硬盘存取数据的一种机制 -> 不是网页代码直接访问文件系统,而是访问cookie
来源:服务器自行通过JS写入 或者服务器在HTTP响应 中通过Set - Cookie字段返回给浏览器
HTTP响应
状态码(status code)
状态码表示访问一个页面的结果,以下是常见结果
200 OK
常见状态码,表示访问成功
404 Not Found
浏览器输入一个URL,目的就是访问对方服务器上的一个资源,如果这个URL标识的资源不存在 ,就会出现404
403 Forbidden
表示访问被拒绝 ,有的页面需要用户具有一定权限才能访问
405 Method Not Allowed
表示对方服务器不支持某种方法
500 Internal Server Error
**服务器出现内部错误,**一般是服务器的代码执行过程中抛出异常,但是没有catch到
504 Gateway Timeout
当服务器负载比较大的时候,服务器单条请求的时候消耗的时间就会很长,就会出现超时情况
302 Move temporarily
临时重定向
重定向:类似于呼叫转移功能,打某个号码自动转到另一个号码
总结:
HTTPS
HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层 。HTTP协议的内容都是按照文本的方式明文传输的,这就导致传输过程中出现一些篡改情况
加密就是把明文进行一系列变换 ,生成密文
由于服务器是对多个客户端提供服务的,所以每个客户端都需要一个单独的密钥
对称加密: 加密和解密使用同一个对称密钥 ,但是如果密钥明文传输 ,就会被截获 ,这就引入非对称加密
运算速度快, 开销小
非对称加密: 客户端使用公钥加密 ,加密内容只有服务器中的私钥能够解密。
运算速度慢,开销大,所以在应用中只会通过非对称加密传输客户端生成的对称密钥,后期通过这个密钥进行对称加密传输
**公钥:**公开出的密钥
**密钥:**公司内部不公开的密钥
中间人攻击

客户端无法区分收到的公钥是服务器真实的公钥 还是被黑客篡改的公钥
引入证书
引入证书的目的就是让服务器判断收到的公钥是服务器的公钥,还是被串改过后的公钥,服务器在使用HTTPS前,需要向CA机构申请一份数字证书
- 服务器在搭建时,向有关机构申请证书
2. 因为证书里包含公钥 ,所以客户端先获取服务器的证书
如果对比结果相同,则证明信息没有被篡改,后续传输对称密钥使用公钥进行加密
中间人篡改证书
如果黑客对证书进行了篡改:
1. 对公钥篡改:计算的校验 和与数字签名解密后的校验和不一致
2. 对数字签名篡改: 黑客服务器没有认证机构的密钥 ,无法打包数字签名
中间人掉包证书
黑客证书中的URL 与客户端访问的URL不匹配








