HTTP协议和HTTPS加密
HTTP协议目录
HTTP的概论
我在网络那一篇文章中写到:我们常用的网络结构;是5层网络结构。分别是应用层,传输层,网络层,数据链路层,物理层。
应用层:关注数据怎么使用。
传输层:关注整个传输的起点和终点。
网络层:地址管理加路由选择。
数据链路层:相邻节点之间的数据转发。
物理层:基础设施构建等同于现实的高速公路。
http协议是一个使用非常广泛的应用层协议,也是TCP/IP协议栈。
应用层的协议,经常需要自定义协议。协议可定制性就非常强,所以基于HTTP我们可以进行拓展。
只要连接外网,基本上就都会使用HTTP协议。
http是一个一问一答形式的协议,及一个请求,一个响应。

而我们主要是去了解HTTP的报文格式,我们要去理解HTTP的报文格式我们就需要一个外部的工具,将HTTP协议显示出来,而这个工具呢,俗称抓包工具。
一般谷歌浏览器和IE浏览器他们会提供抓包的东西。通常按F12键就可以进入一个网页的开发者模式,我们在开发者模式中找到网络这个选项,就可以在里面找到。相应的报文。

但我们作为一个专业的程序员,我们就应该去选择一个专业的工具,这里呢,我推荐大家使用fiddler。软件有付费版和免费版啊,免费版就够用。



这个HTTP上面的所有东西都要勾选上,不然的话无法抓捕到包头。
软件,左边的是HTTP的列表。主要是相对应的HTTP的具体数据,而我们这里要用的是raw,观看HTTP的具体报头,是纯净版。


一般我们看到的请求大部分都是get请求,在登录和上传文件的时候会看见post请求。
一般我们看HTTP呢就看get和post就足矣,可看可不看。
补充一点:一般post请求不会随意出现,一旦出现必定是上传文件的时候。而在登录的时候,我们也需要去提交材料,提交登录信息,而此时你的密码在抓包工具被抓包的情况下,也就是在boss请求被抓到的情况下,会在下面显示密码。有一些网站对于这一块的保密做的不是很好,就使得有一些。非法分子对其的电脑做一些抓包处理,抓到登录账号和密码。它有一些它是经过加密的,但是经过特殊处理之后还是能被显示出来,所以你账号一定不要注册一个,尽量多注册几个高端密码。
post请求body一般不为空,而get请求body的时候一般为空。
HTTP 报文中要存在 "空行,HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 “粘包问题” 。
就是我们上传的数据计算机无法有效识别。所有的值都成为了一条字符串,无法有效的进行分割。
HTTP请求
Get的语义是从服务器里拿一个东西。
post的语义网服务器里提交一个东西。
http的这种语义通常是一种建议,在实际开发中也可以不一定遵守,对于body有没有,也不能说是绝对,get,有可能会有body,而post也可能会没有有body,只不过这种情况比较少见。
对于get和post这两种方法来说,本质上是没有区别的。也可以互相替换。但是对于操作习惯来说,他们两者是有区别的。
-
get习惯上用来表示获取一个数据,而post用来表示提交一个数据。
-
一般没有body需要携带数据,则放到URL中post没有,一般有body。
-
get经常会被设计成幂等,而post则无要求。什么是幂等?就是我们输入一个变量,他不是随机的。每一次输入这个变量会出现一个固定的值,这个叫幂等。
-
get可缓存的(提前是幂等), Post则不能。
-
Get请求可以被浏览器收藏,post不能。
报文格式:
请求
- 首行( 方法 URL 版本号)
- 请求头 header.
- 空行。
- 正文body。
URL 协议名://IP:端口号/带层次的路径?查询字符串
响应。
- 首行(版本号,状态栏,状态码,描述)
- 响应头harder。
- 空行。
- 正文body,通常是一个html,css,js或图片。
HTTP请求


Host
Host:www.baidu.com
这个属性,除了浏览器,这个请求要访问的服务器是谁。
绝大多数情况下,Host中的值和URL中的域名是一致的。当我们通过代理来访问的时候。此时host和URL就不同了。host是作为最终目标,而URL是当前目标。
Content-Type和Content-lenth
Content-Type :描述了body的数据格式。
Content-lenth:描述了body的长度,单位字节。
Content-Type: application/json;charset=utf-8
(application/json):json格式,用{}表示,诺干键值对。键值对之间用,逗号,分割,键和值使用:分割。
(application/x-www-form-urlencoded):form 提交表单数据,会生成这种形式的body。
<input type="text" name="userId">
<input type="text" name="classId">
<input type="submit" value="提交">
- action: 构造的 HTTP 请求的 URL 是什么. method: 构造的 HTTP 请求的 方法 是 GET 还是 POST
(form 只支持 GET 和 POST). input 的重要参数: type: 表示输入框的类型. text 表示文本,
password 表示密码, submit 表示提交按钮. name: 表示构造出的 HTTP 请求的 query string 的
key. query string 的 value 就是输入框的用户 输入的内容. value: input 标签的值. 对于 type
为 submit 类型来说, value 就对应了按钮上显示的文本.
charset=utf-8:字符的格式
作为请求,Content-Type,上面这两种写法最多。
作为相应,Content-Type,还有几种写法

User-Agent(UA)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188
Windows NT 10.0; Win64; x64:操作系统版本64位wind10系统(我的是wind11,可能内核一样)
Chrome/115.0.0.0 :浏览器版本
Safari/537.36:浏览器版本
现在User-Agent,因为时代问题,现在的主要用途是手机/PC/平板
( UC能做到这一点,但是实际上,现在还有更好的方案来解决这个问题,css3 中提供了媒体查询功能,可以根据浏览器窗口大小来设置不同样式,这种页面开发方式称之为响应式布局)
Referer
描述了当前这个页面,从哪个页面跳转来的
通常可以用来统计点击次数,这种方式也是浏览器获利的主要方式。就是客户通过点击浏览器上的广告,浏览器的主营单位就可以赚取的相应的点击费。
而为此,曾经发生了一件事,就是运营商劫持事件。所有的网络服务,都必须经过运营商的服务器,所以运营商可以修改这个数据。使得运营商的广告收入增加。
为此,推出了HTTPS的加密协议。
Cookie
cookie的值也是键值对
Cookie: BIDUPSID=8f60a93dc302578aacc49601c892ba12; PSTM=1578482103; BAIDUID=322807F4C394FA18C48A069469EEE67A:FG=1;…
cookie的值也是键值对
键值之间用;分割
键和值之间使用=分割
cookie的本质是浏览器在本地存储,用户自定义数据的一种关键机制。
所以每个网站都存自己的cookie,及cookie根据域名各有不同。
1.cookie从哪里来。
通过服务器给浏览器返回cookie的数据,当我的浏览器访问服务器的时候,浏览器会在http响应中,通过Set-Cookie字段,把Cookie的键值对,返回给浏览器,浏览器收到数据,就会存到本地存储。
2.Cookie到哪里去
会在下次请求的时候,把Cookie带给服务器
Cookie在浏览器这边只能是,“暂时存储”,数据要发挥作用还得讲给服务器。
3.有什么作用
是服务器的本地存储数据的机制
由于客户端很多,每个客户端提供的服务可能不一样,因此通过cookie进行区分,和识别。
(存储用户的身份信息(用户登录之后,身份))
HTTP响应
状态码
-
200 OK:
表示访问成功。 -
404 Not Found:
没有找到资源。(浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存在, 那么就会出现 404) -
403 Forbidden:
表示访问被拒绝。
有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆
直接访问, 就容易见到 403。 -
405 Method Not Allowed
但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法) -
500 Internal Server Error
服务器出现内部错误
一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码 -
504 Gateway Timeout
当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况 -
302 Move temporarily
临时重定向,在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页. 响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面 -
301 Moved Permanently
永久重定向,当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.。301 也是通过 Location 字段来表示要重定向到的新地址。
小结:
| 号码头 | 类别 | 原因 |
|---|---|---|
| 1xx | Informational(信息性状态码) | 接收的请求正在处理 |
| 2xx | Succes(成功状态码) | 请求正常处理完毕 |
| 3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
| 4xx | client Error(客户端错误状态码) | 服务器无法处理请求 |
| 5xx | server Error(服务器错误状态码) | 服务器处理出错 |
form发送post请求
<form action="http://abcdef.com/myPath" method="post">
<input type="text" name="userId">
<input type="text" name="classId">
<input type="submit" value="提交">
</form>
form 的 action 属性对应 HTTP 请求的 URL
form 的 method 属性对应 HTTP 请求的方法
input 的 name 属性对应 query string 的 key
input 的 内容 对应 query string 的 value
form有一个属性enctype属性,可以影响content-type
ajax:
现在最主要的前后端的交互模式之一。(异步交互)
全称:asynchronized javascript and xml
A:异步,synchronized同步
应用场景:
- 同步和互斥(加锁的场景)
- 同步和异步(io的场景)
同步:请求发起来处理好后,自己来取
异步:请求发过来处理好,发给他。
使用jQuery中的ajax
<body>
<script>
$.ajax({
url:"https://www.sogou.com",
type:"get",//可以写成,post,put,delete,等等
success:function(body){
//写处理响应的代码
console.log(body);
}
});
</script>
</body>
是一个回调函数,但是在java中其实很少有函数这个术语。但是在在C语言中经常提出。
什么是回调函数。就是不是马上拿到结果,而是运行到了这里才开始。
但是有一个重要的问题:ajax的跨域问题,及现在运行ajax代码的页面是123.com,但是ajax里的请求,访问的域名是456.com,此时哪怕服务器给你数据,浏览器也不能处理,要报错。
HTTPS
https基于HTTP,只比http多了一个加密层。
明文–》密文:加密
密文–》文明:解密
密钥用于解锁密文。
对称加密:只有一个密钥(key)
明文+key=密文
密文+key=明文

非对称加密:公钥(pub)私钥(pri)
明文+pub=密文
密文+pri=明文
或者
明文+pri=密文
密文+pub=明文
每个客户端的密钥,必然不相同。客户端生成自己的密钥后,就会把密钥传给服务器

对称密钥只传一次。服务器生成公钥和私钥,上传公钥给客户端,保留私钥。而客户端生成对称密钥。客户端将自己的key用服务器的公钥加密。上传给服务器。而服务器需要私钥对照公钥对客户端上传的数据进行解密。从而拿到客户端的key。(公钥和私钥放在一起才能解密)
这是基本的思路。
但是实际中其实是有更多密钥。
引入证书(服务器的域名,有效时间,服务器的公钥,颁布证书的机构,被加密的签名。。。)

被加密的签名:校验和,使用证书中的其他各个属性,综合在一起通过某种算法运算出一个数字,(校验和和客户端通过同样的算法得出的数据对比)两个数据如果相同,及校验和一定相同。这签名在颁布的时候同时计算的,并使用机构自己的公钥加密了
(这里的话可能会有些蒙,或许不太理解机构用私钥加密后客户端如何解密,拿到校验和,其实每台客户端操作系统都有相应的公钥。所以公钥就在我们手里)
而这一套是:对称加密+非对称加密+证书,不仅仅是HTTPS会涉及jdbc也会涉及。
这一套也叫SSL/TLS