AnnGreen1 / article

0 stars 0 forks source link

全网最强的 HTTP 协议讲解 #4

Open AnnGreen1 opened 9 months ago

AnnGreen1 commented 9 months ago

mp.weixin.qq.comRockyhan 计算科学与信息化

写在最前

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它是基于 TCP 协议的应用层传输协议。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

HTTP 是一种无状态 (stateless) 协议, HTTP 协议本身不会对发送过的请求和响应的通信状态进行持久化处理。这样做的目的是为了保持 HTTP 协议的简单性,从而能够快速处理大量的事务,提高效率。

HTTP 请求体

HTTP 请求体是请求数据时发送给服务器的数据,毕竟向服务器拿数据,先要表明怎么要,以及要什么!

![](https://cubox.pro/c/filters:no_upscale()?imageUrl=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FeQPyBffYbudBonwxPvg3ut2jgvzibksenicmRW6UbiaPGGnU5VGQaf3n1ATQJZbZxvBum5XqT1BeW7Z1kuWGwSaRQ%2F640%3Fwx_fmt%3Dpng%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26random%3D0.49043613566975797)

HTTP 请求体由:请求行 、请求头、请求体组成。

常用的 HTTP Method

Post 请求示例

# Method URL Version  请求行
POST /httpLearn/postRequest HTTP/1.1
# Request Header  请求头
Host: 127.0.0.1:8080
User-Agent: apifox/1.0.0 (https://www.apifox.cn)
Content-Length: 126
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

# Request Message  请求体
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="param"

post
----WebKitFormBoundary7MA4YWxkTrZu0gW

Get 请求示例

Get 请求没有请求体

# Method URL Version  请求行
GET /httpLearn/getRequest?param=123 HTTP/1.1
# Request Header  请求头
Host: 127.0.0.1:8080
User-Agent: apifox/1.0.0 (https://www.apifox.cn)

GET 与 POST 的区别

GET 与 POST 是我们常用的两种 HTTP Method,二者之间的区别主要包括如下五个方面:

Http 响应报文

HTTP 的响应报文是服务器返回的数据,必须先有请求体再有响应报文。

![](https://cubox.pro/c/filters:no_upscale()?imageUrl=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FeQPyBffYbudBonwxPvg3ut2jgvzibksenZGp5HYDxC2ANYUlkh5kpkZP4UUhkZ1FaN305sxIxv7Fb7iciabfqTETQ%2F640%3Fwx_fmt%3Dpng%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26random%3D0.5102721011536833)

HTTP 响应报文由:状态行、响应头、响应体组成。

常见 Response Code 分类

响应示例

# Version  Response Code  状态行
HTTP/1.1 200 OK
# Response Header  响应头
Content-Type:text/plain;charset=UTF-8
Content-Length:31
Date:Wed, 19 Jan 2022 11:37:00 GMT
Keep-Alive:timeout=60
Connection:keep-alive

# Response Message  响应体
post request is ok,param = post

一次完整 HTTP 请求所经历的步骤

当我们在 web 浏览器的地址栏中输入:www.baidu.com,然后回车,到底发生了什么?

Https

HTTP 协议运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份。Https 是通过 SSL(Secure Socket Layer, 安全套接层 )或 TLS(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP 的通信内容。属于通信加密,即在整个通信线路中加密。

![](https://cubox.pro/c/filters:no_upscale()?imageUrl=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FeQPyBffYbudBonwxPvg3ut2jgvzibksenH8drWyn6IwfRJaWp3R7Qz8SsQfocw87ff3UT21IUrCaicuDC69WboqA%2F640%3Fwx_fmt%3Dpng%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26random%3D0.9480238024221284)

HTTPS 采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。

HTTP 的不足

两者区别

HTTPS 工作原理

![](https://cubox.pro/c/filters:no_upscale()?imageUrl=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FeQPyBffYbudBonwxPvg3ut2jgvzibksen9sPrEicq4duiaZATJCYVLoexEutkjibw5EWfdXJa2aA3YIRTxyZmmTyPA%2F640%3Fwx_fmt%3Dpng%26wxfrom%3D5%26wx_lazy%3D1%26wx_co%3D1%26random%3D0.7674984579980304)

【1】客户端发起 HTTPS 请求

用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

【2】服务端的配置

采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。

这套证书其实就是一对公钥和私钥,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

【3】传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

【4】客户端解析证书

由客户端的 TLS 来完成,首先会验证公钥是否有效,比如颁发机构,过期时间等等。如果发现异常,则会弹出一个警告框,提示证书存在问题。

如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

【5】传送加密信息

用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

【6】服务端解密信息

服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够厉害,私钥够复杂,数据就够安全。

【7】传输加密后的信息

服务段用私钥加密后的信息,可以在客户端被还原。

【8】客户端解密信息

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也无法解密信息。

HTTPS 的缺点

来源:blog.csdn.net/csp732171109/article/details/122608300