【网络】-HTTP协议和HTTPS协议

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


HTTP协议

HTTP服务器本质上就是一个TCP服务器(HTTP是基于TCP的)这个服务器按照HTTP协议的约定,解析请求,构造响应

HTTP协议概念

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体(如HTML)的应用层协议。它是在Web上进行数据通信的基础,被用于在客户端和服务器之间传输信息。

HTTP是一个使用非常的广泛的应用层协议
应用层协议,经常需要进行自定义协议
HTTP协议之所以应用广泛,主要原因是HTTP可定制性非常强

HTTP是一个”一问一答“这种形式的协议()
看到的网页html的内容,一般是用人家服务器,通过http响应返回到浏览器,才能响应(css和js也是一样的)

HTTP封装后数据报的格式

在这里插入图片描述

HTTP常用的方法

HTTP中最常用的方法就是GET方法和POST方法
get一般用于获取/查询资源信息,而post一般用于更新资源信息;
除此以外还有以下常用方法
在这里插入图片描述

GET和POST方法的区别

  1. GET和POST的区别:没有本质区别
  2. GET请求一般为空,POST请求body一般不为空
  3. GET在习惯上用来表示”获取一个数据“,POST用来表示”提交一个数据“GET一般没有body,需要携带数据放到URL中,POST一般有body。所有在可见性,Get方法数据在URL中,对所有人都是可见的;而POST方法数据不会
  4. GET请求通常涉及成幂等的,POST则无要求(如果输出一定,得到的输出也是一定,这种情况可以认为是幂等,幂等性在服务器开发中是很关键的,设计成幂等,这样的请求就可以缓存了)
  5. GET是可缓存的(前提是幂等),POST则不能,缓存可以提高响应速度,节省运算资源
  6. GET请求可以被浏览器收藏,POST不能
  7. 对数据长度的限制:Get方法对数据长度有限制,因为Get方法是在URL中添加数据,而URL的最大长度是2048;POST方法则是无限制的;

HTTP方法的语义,只是一种建议,在实际使用的时候,也不一定非得要遵守,两者是可以相互替换的

PUT和POST方法的区别?

PUT和POST方法都有更改指定URI的语意,但是POST如果执行多次,产生的效果是一样的;
PUT请求:如果两个请求相同,第二个请求会把第一个请求覆盖掉;(所以PUT用来改资源)
POST请求:后一个请求不会把第一个请求覆盖掉;(所以POST用来增资源)

HTTP协议格式

HTTP请求

这里以csdn的抓包为例
一个网页加载过程中可能会和数据库有n次数据交互
在这里插入图片描述

请求的首行

GET https://csdnimg.cn/public/common/libs/jquery/jquery-1.9.1.min.js?1692693934736 HTTP/1.1

在这里插入图片描述

第一部分为HTTP方法

描述了这个HTTP协议的作用,HTTP协议有很多方法,不同的方法表示不同的”语义“
例如:
GET:获取一个数据
POST:提交一个数据,登录,上传文件时使用

第二部分URL

唯一资源定位符,描述了网络上的唯一的一个资源
但是这个概念并非HTTP的概念,很多协议都会用到URL
URL的的结构:
协议号://ip:端口号/带层次的路径?查询字符串
在这里插入图片描述
https://csdnimg.cn/public/common/libs/query string
域名服务器的地址 ,域名地址后面还有个端口号,省略不是没有,而是浏览器会自动加上默认的端口号
http默认的端口号是80
https默认的端口号是443
/带层次的路径,标识你要访问这个服务器的资源是什么
query string :查询字符串,对访问的资源进行一个补充说明参数~~键值对结构,
使用&分割键值对,使用 = 分割键和值

这里注意,我们这里查看到的是https:
http和https的关系
https在和http上进行加密

第三部分为版本号

最常见的HTTP/1.1,绝大部分使用的都是1.1
最新为HTTP/3

请求的请求头header

在这里插入图片描述

请求头header使用键值对结构,每个键值对,占一行,键和值之间,使用冒号空格来分隔
这里的键值对,可以有N行,会用空行作为结束标记,
header中的键值对,大部分都是HTTP协议规定的,也可以进行自定义添加键值对

Host:这个属性描述了,这个浏览器请求要访问的服务器是哪个,不仅仅可以写地址,也可以写端口号
大多数情况下,Host中的值,和URL中的域名是一致的,但也有例外,比如我们要访问的服务器不是之间访问,而是通过代理进行访问,就会出现不一致的情况下。Host可以视为最终目标,URL可视为当前目标

Content-Type: 描述了body的数据格式: application/json:描述了数据按照json的格式组织的
这个json使用{}表示的:这里包含若干键值对,键值对之间使用“,”分割,键和值使用“:”分割
application/x-www-form-urlenconded:在form表单提交数据,就会生成这种格式的body
text/html text/css application/javascropt imag/png 还可以描述字符集~~charset=utf8

Content-Length:描述了body的长度(字节)这两个属性一般是在有body的情况下出现

User-Agent(简称UA):用户使用的客户端时什么样子,描述的浏览器是什么版本,系统是什么版本,区分什么设备

Referer:表示这个页面是从哪个页面跳转过来的

Cookie:键值对格式,键值对之间使用;分割,键和值之间使用=分割

请求的正文(body)

body里的内容

HTTP响应

在这里插入图片描述
HTTP响应的响应格式主要分为:

  1. 首行(版本号,状态码,状态码描述)
  2. 响应报头
  3. 空行
  4. 正文

首行

版本号(和请求相同)
状态码:数字,数字来表示这次请求执行成功还是失败,失败的原因
状态码描述:通过一个或一组单词,描述这个状态码的含义
HTTP提供的十分丰富的状态码
在这里插入图片描述

HTTP状态码

HTTP状态码是指在HTTP协议中,服务器对客户端请求的响应状态的一种标识。常见的HTTP状态码有以下几类:

1xx:信息类状态码,表示请求已被接受或正在处理。

100:继续,服务器已收到部分请求,客户端可以继续发送剩余请求。
101:切换协议,服务器要求客户端切换协议。

2xx:成功类状态码,表示请求已成功被服务器接收、理解和处理。

200:成功,表示请求已成功。
201:已创建,表示请求已经被成功处理,并创建了一个新的资源。
204:无内容,表示服务器成功处理请求,但没有返回任何内容。

3xx:重定向类状态码,表示需要进一步操作以完成请求。

301:永久重定向,表示请求的资源已被永久移动到新位置。
302:临时重定向,表示请求的资源临时移动到新位置。
304:未修改,表示请求的资源未发生变化,可以使用缓存的版本。

4xx:客户端错误类状态码,表示客户端发送的请求有误。

400:错误请求,服务器无法理解该请求。
401:未授权,表示请求需要用户身份验证。
404:未找到,表示请求的资源不存在。

5xx:服务器错误类状态码,表示服务器在处理请求时发生错误。

500:服务器内部错误,表示服务器遇到不可预期的错误。
502:错误网关,表示服务器作为网关或代理时从上游服务器接收到无效响应。
503:服务不可用,表示服务器暂时过载或维护中。

如何构造HTTP请求

输入url构造

直接通过浏览器地址栏,输入一个url =>构造一个GET请求

适用HTML的特殊标签构造

HTML中,一些特殊标签,也会触发GET请求
比如:link;script;img;a

使用form表单构造

form可以触发GET和GET请求

get请求构造
<body>
    <form action="https://www.baidu.com/abc/def" method="get">
        <input type="text" name="aaa">
        <input type="text" name="bbb">
        <input type="submit" value="提交">
    </form>
</body>

对应关系
在这里插入图片描述

在这里插入图片描述

post请求构造
<body>
    <form action="https://www.baidu.com/abc/def" method="post">
        <input type="text" name="aaa">
        <input type="text" name="bbb">
        <input type="submit" value="提交">
    </form>
</body>

对应关系
Content-Type: application/x-www-form-urlencoded对应的内容

在这里插入图片描述
form只支持get和post方法,其他方法,form都无能为力
使用form,版本号固定就是HTTP/1.1

使用ajax构造

ajax 全称 Asynchronous Javascript And XML,是现在最主流的前后端交互的方式之一,ajax是前端和后端,异步交互的一种方式
这里我们需要区分同步和异步的区别

同步和异步的区别

同步,反着来
异步,请求的发起者,不关心结果,而是由被请求的这一方面计算出结果之后,把结果推送给发起者
关键在于,吃饭是自己吃,还是等着别人喂
ajax是前端和后端,异步交互的一种方式

使用jquery里面提供的api进行操作
首先引入jquery,jQuery地址点minified,查看网站是否能用

$ :在jQuery中式一个特殊的全局变量,jQuery中各种api都是 $ 的方法。$也是变量名的一部分

ajax一个重要问题:跨域问题,为了安全,运行ajax代码的页面的域名是aaa.com,但是ajax里的请求是def.com
这俩个域名不一致时,哪怕服务器响应了你的数据,但是浏览器不能处理,会出现报错(属于浏览器为了限制安全,引入的保护机制)
form允许跨越问题

不使用代码的情况下,构建http请求

这里使用postman进行操作
步骤如下:

  1. 注册账号登录
  2. 切入到workspace,并且构建一个新的workspace
  3. 点击+,创建一个标签页
  4. 使用
    在这里插入图片描述
    可以用postman生成代码。点击右侧的Code选择语言进行生成代码

HTTPS

什么是HTTPS

HTTPS(Hypertext Transfer Protocol Secure)是一种通过计算机网络进行安全通信的协议。它是基于HTTP协议的扩展,通过使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来加密和保护数据的传输。

HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层.

HTTPS的主要目的是确保在网络传输过程中的数据安全性和完整性。通过使用公钥加密和私钥解密的机制,HTTPS能够对数据进行加密,使攻击者无法轻易地窃取敏感信息。同时,HTTPS还提供了服务器身份验证的功能,确保用户访问的网站是合法、可信的,防止中间人攻击和篡改信息。

明文传输是非常危险的事情,比如运行商劫持
运行商劫持是指互联网服务提供商(ISP)或其他网络运营商在用户访问特定网站或使用特定服务时进行干预或限制的行为。

加密、解密

“加密” 是什么
把明文 => 密文:加密
把密文 => 明文:解密
加密和解密需要一个密钥
加密就是把 明文 (要传输的信息)进行一系列变换, 生成 密文 .
解密就是把 密文 再进行一系列变换, 还原成 明文 .
在这个加密和解密的过程中, 往往需要一个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为 密钥

HTTPS 的工作过程

不讨论加密解密的细节算法,只考虑宏观的流程

引入对称加密

明文 + key =>密文
密文 + key =>明文
对称加密其实就是通过同一个 “密钥” , 把明文加密成密文, 并且也能把密文解密成明文
加密和解密都是使用同一个密钥,加密解密的特点是计算起来比较快速

使用对称密钥

客户端
客户端拿着key,针对要发送的数据进行加密,把密文通过网络,传输给服务器
服务器
服务器拿着key,进行解密,就知道了客户端发的是啥
客户端连接服务器以后会把key发给服务器,
但是密钥传输的过程中如果被截获,还是会造成危险

引入非对称加密

明文 + pub = > 密文
密文 + pri =>明文
或者:
明文 + pri = > 密文
密文 + pub =>明文

非对称加密要用到两个密钥, 一个叫做 “公钥”(pub)。 一个叫做 “私钥”(pri)。
公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多.
通过公钥对明文加密, 变成密文
通过私钥对密文解密, 变成明文
也可以反着用
通过私钥对明文加密, 变成密文
通过公钥对密文解密, 变成明文

使用非对称加密

客户端连接服务器询问公钥(pub),
服务器把pub传给服务器,私钥(pri)自己留着
客户端拿到公钥pub之后,生成一个对称密钥key,使用pub针对key进行非对称加密,
客户端传输key加密后的数据
此时服务器就可以使用私钥pri针对密文进行解密,于是服务器拿到了key
返回ok
客户端和服务器就可以使用ke进行y对称加密的数据进行传输

客户端的是对称密钥
服务器的是非对称密钥

客户端和服务器的业务数据传输,仍然使用对称加密的方式(对称加密速度快,成本低),为了保证对称密钥能够安全到达服务器,引入了非对称加密,保护对称密钥
非对称密钥在对称密钥传输完成后,就可以不用了

中间人攻击

但是使用对称密钥也有问题,中间人攻击
在客户端询问服务器公钥(pub)后,服务器返回pub,此时黑客构建进行截获记录pub构建一个pub2,发给客户端,
客户端取得pub2,返回经过pub2加密后的key,黑客进行截获解密得到key,再通过记录的pub进行加密得到的key。
发送给服务器,服务器得到后返回ok,客户端开始用key加密的数据进行发送,但是黑客得到了key进行解密,拿到数据。
此时,问题就是如何让客户端信任服务器发送过来的公钥或私钥是正确的呢
引入证书

引入证书

在服务器建立时,会在权威机构申请一个证书
同时,在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书.

公钥是证书的一个属性

这个 证书 可以理解成是一个结构化的字符串, 一个对象一样的东西,里面包含了以下信息:
证书发布机构
证书有效期
服务器的公钥(pub)
证书所有者
签名(被加密的)

签名就是检验和。使用证书中的其他各个属性,综合在一起进行运算出一个结果
是权威机构在颁布证书时同时计算的,这个签名会被权威机构使用自己的私钥进行加密(权威机构也有自己的公钥私钥)

客户端拿到加密的签名后,就会拿着权威机构的公钥来解密,得到校验和(sum1)
客户端还会按照同样的算法,在结合证书的各个属性,再进行一遍计算,得到(sum2)
如果两个校验和相同,说明各个属性没有被修改,如果不同则说明被篡改过了

但是黑客不能进行篡改(无法修改 )
1.黑客把证书中的服务器的公钥(pub),替换成自己的公钥
2.黑客针对服务器中的各个属性,进行重新计算签名
3.但是,黑客需要把签名进行重新加密,想要加密,就需要权威机构的私钥进行加密,但是黑客无法获得

证书机构的公钥属于操作系统自带的,系统内部会内置一批

客户端生成的对称密钥,用来加密业务数据
服务器生成的非对称密钥pub和pri,用来加密对称密钥
颁布证书的非对称密钥(私钥机构自己持有,公钥客户端系统自带),用来加密证书的签名

对称加密+非对称加密+证书可以称为SSL/TLS这也是一个协议 而HTTPS = HTTP+SSL

HTTP服务器本质上就是一个TCP服务器(HTTP是基于TCP的)这个服务器按照HTTP协议的约定,解析请求,构造响应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值