HTTP协议和HTTPS加密

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这两种方法来说,本质上是没有区别的。也可以互相替换。但是对于操作习惯来说,他们两者是有区别的。

  1. get习惯上用来表示获取一个数据,而post用来表示提交一个数据。

  2. 一般没有body需要携带数据,则放到URL中post没有,一般有body。

  3. get经常会被设计成幂等,而post则无要求。什么是幂等?就是我们输入一个变量,他不是随机的。每一次输入这个变量会出现一个固定的值,这个叫幂等。

  4. get可缓存的(提前是幂等), Post则不能。

  5. Get请求可以被浏览器收藏,post不能。

报文格式:
请求

  1. 首行( 方法 URL 版本号)
  2. 请求头 header.
  3. 空行。
  4. 正文body。

URL 协议名://IP:端口号/带层次的路径?查询字符串

响应。

  1. 首行(版本号,状态栏,状态码,描述)
  2. 响应头harder。
  3. 空行。
  4. 正文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响应

状态码

  1. 200 OK:
    表示访问成功。

  2. 404 Not Found:
    没有找到资源。(浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存在, 那么就会出现 404)

  3. 403 Forbidden:
    表示访问被拒绝。
    有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问). 如果用户没有登陆
    直接访问, 就容易见到 403。

  4. 405 Method Not Allowed
    但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)

  5. 500 Internal Server Error
    服务器出现内部错误
    一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码

  6. 504 Gateway Timeout
    当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况

  7. 302 Move temporarily
    临时重定向,在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页. 响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面

  8. 301 Moved Permanently
    永久重定向,当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址.。301 也是通过 Location 字段来表示要重定向到的新地址。

小结:

号码头类别原因
1xxInformational(信息性状态码)接收的请求正在处理
2xxSucces(成功状态码)请求正常处理完毕
3xxRedirection(重定向状态码)需要进行附加操作以完成请求
4xxclient Error(客户端错误状态码)服务器无法处理请求
5xxserver 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同步
应用场景:

  1. 同步和互斥(加锁的场景)
  2. 同步和异步(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