HTTP

HyperText Transfer Protocol 超文本传输协议

Http 报文

请求报文

<方法><空格><URI><空格><HTTP版本>  --->请求行
<字段名>:<字段值>                   -|  
...                                  |-->消息头,一般是放请求头的信息
...                                  |    
...                                 -|
<空行>
<消息体>                            --->消息体,一般是放请求体(GET 请求是没有请求体的)

GET请求

POST请求

响应报文

<HTTP版本><空格><状态码><空格><响应短语> --->状态行
<字段名>:<字段值>                       -|
...                                      |-->消息头,也称响应头
...                                      |
...                                     -|
<空行>
<消息体>                                --->返回的数据

响应

常见的头域

  • Connection : keep-alive (发送响应后,TCP连接是否继续保持连接,后续对改服务器的请求可以复用这个连接,提高效率,HTTP1.0 需要声明才生效, HTTP1.1 默认是 keep-alive
  • Date : 请求或响应的时间
  • Host : 主机地址
  • Accept : 客户端可支持的数据类型
  • User-Agent : 客户端的版本等信息
  • Range : 分段传输
  • Cookie : cookie
  • Content-type : text/html、text/json (传输数据格式)
  • Connect-Length : 数据长度
  • Cache_Control : no-cache(缓存配置,其他的就不讲了)

状态码

  • 1xx: 信息响应类,表示接收到请求并且继续处理
  • 2xx: 处理成功响应类,表示动作被成功接收、理解和接受
  • 3xx: 重定向响应类,为了完成指定的动作,必须接受进一步处理
  • 4xx: 客户端错误,客户请求包含语法错误或者是不能正确执行
  • 5xx: 服务端错误,服务器不能正确执行一个正确的请求

TCP 建立 和 关闭

TCP 建立(三次握手)

sequenceDiagram
客户端->>服务器: 我要发消息了,你收到了吗?
服务器->>客户端: 我收到了,你开始发吧!
客户端->>服务器: 好的,我要开始发消息了。

TCP 关闭(四次握手)

sequenceDiagram
客户端->>服务器: 我后面不发消息,我要断开连接了。
服务器->>客户端: 等一下,我还有东西要处理。
服务器->>客户端: 好了,我处理完了,你关闭连接吧。
客户端->>服务器: 好的,我关闭连接了。

网络分层

  1. 五层模型
    • 应用层(http、ftp等)
    • 传输层(tcp、udp等)
    • 网络层(IP 寻址,路由选择等)
    • 数据链路层(以太网等网络)
    • 物理层(光纤,电缆)
  2. 七层模型
    • 应用层(http、ftp等高级应用)
    • 表示层(主要功能是:用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、数据加密与解密、数据压缩与恢复等功能)
    • 会话层(主要功能是:负责维护两个结点之间的传输链接,以便确保点到点传输不中断,以及管理数据交换等功能。)
    • 传输层(tcp、udp等)
    • 网络层(IP 寻址,路由选择等)
    • 数据链路层(以太网等网络)
    • 物理层(光纤,电缆)

HTTPS

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL/TLS层,HTTPS的安全基础是SSL/TLS,因此加密的详细内容就需要SSL/TLS。

对称加密

同一套算法,同一个密钥。经典的算法:DES,AES

非对称加密

同一套算法,不同的密钥。

一般分为公钥和私钥。公钥一般是发送给通信对方,用于验证。私钥要自己藏着,不能泄露。

经典算法:RSA ,DSA

Hash

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

所以 Hash 不能算是加密,因为不能解密,无法恢复源数据。常见的有 MD5 、SHA1 、SHA256

使用: 看图(draw.io)

数字签名

签名与验证

非对称加密传输数据

HTTPS 通信

下面这个图有错误

参考:

https://www.cnblogs.com/xinzhao/p/4949344.html

https://baijiahao.baidu.com/s?id=1570143475599137&wfr=spider&for=pc

这个说得比较清楚
https://www.cnblogs.com/zery/p/5164795.html

如何验证第二步服务器发过来的证书?

证书内容:

{
    服务器的信息(包括域名,服务器的公钥等信息),
    签名文件(证书机构使用私钥对服务器信息进行签名后的信息),
    {
        证书机构的信息(证书机构的名称等信息,和证书机构的公钥),
        签名文件(根证书机构使用私钥对上面的证书机构信息进行的签名信息)
    }
}

查看根系统证书:certmgr.msc

Fiddler 获取HTTPS内容原理:

先在系统上安装 根证书。Fiddler 以服务器的身份跟客户端进行通信,Fiddler 再以客户端的身份跟服务器进行https通信,然后把数据给客户端。