网络协议:应用层之HTTP与HTTPS

目录
一,HTTP基础
二,HTTP进阶
三,HTTPS
四,HTTP/2
五,HTTP/3
六,抓包

一,HTTP基础

1,基本介绍
  • HTTP是HyperText Transfer Protocol的缩写,表示超文本传输协议
  • 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
  • HTMLHyper Text Markup Language的缩写,表示超文本标记语言
  • 通过HTTP请求的资源由URI来标识,URIUniform Resource Identifiers的缩写,表示统一资源标识符
  • HTTP的标准制定由万维网协会(W3C)和互联网工程任务组(IETF)进行协调,最终发布了一系列的RFC
  • RFCRequest For Comments的缩写,表示请求意见稿
2,版本
  • HTTP/0.9

1>只支持GET请求方法
2>只支持文本数据
3>不支持请求头、响应头

  • HTTP/1.0

1>支持POSTHEAD请求方法
2>支持更多数据类型
3>支持请求头、响应头
4>一个请求对应一个TCP连接

  • HTTP/1.1

1>支持PUTDELETE请求方法
2>采用持久连接(Connection: keep-alive):多个请求共用一个TCP连接
3>是目前使用最广泛的版本

3,报文格式
  • 简单描述
  • ABNF

1>ABNFAugmented Backus-Naur Form的缩写,表示巴科斯-瑙尔范式的增强版
2>ABNF用作Internet中通信协议的定义语言,是最严谨的HTTP报文格式描述形式

4,请求方法
  • GET

1>用于读取操作
2>请求参数直接拼接在URL的后面
3>浏览器对URL的长度是有限制的,所以请求参数不能太多

  • POST

1>用于添加、修改、删除操作
2>请求参数存放在请求体中,个数没有限制

  • HEAD

1>与GET请求相同,但没有响应体
2>使用场景:先获取文件大小,再决定是否下载,这样可以节省带宽资源

  • OPTIONS:用于获取目标资源所支持的通信选项,比如服务器支持哪些请求方法
  • PUT:用于对已存在的资源进行整体覆盖
  • PATCH:用于对已存在的资源进行部分修改
  • DELETE:用于删除指定的资源
  • TRACE:让服务器回显其收到的请求信息,用于HTTP请求的测试或诊断
  • CONNECT:让代理服务器和目标服务器建立一个TCP连接
5,状态码
  • 分类

1>信息响应:100 ~ 199
2>成功响应:200 ~ 299
3>重定向:300 ~ 399
4>客户端错误:400 ~ 499
5>服务器错误 :500 ~ 599

⚠️注意⚠️:并不是每一个状态码都有用到

  • 常见状态码

100 Continue
1>当客户端不确定服务器是否愿意接收请求时,可以先发送不带请求体的请求进行试探
2>如果服务器愿意接收请求,就会返回该状态码,表示该请求不完整,请继续发送剩余的请求
3>当客户端收到该状态码时,再发送一个带请求体的请求

200 OK:请求成功

302 Found:告知浏览器重新请求Location字段中的链接
304 Not Modified:请求的数据没有修改,可以直接使用缓存的数据

400 Bad Request:请求报文格式错误
401 Unauthorized:缺少目标资源要求的身份凭证
403 Forbidden:服务器拒绝访问目标资源
404 Not Found:服务器没有找到目标资源
405 Method Not Allowed:请求方法错误
406 Not Acceptable:请求头中某个Accept字段所要求的值,服务器无法提供
408 Request Timeout:服务器想要关闭没有在使用的TCP连接(主动发送)

500 Internal Server Error:服务器在执行请求时遇到意外情况
501 Not Implemented:服务器不支持该请求方法(GETHEAD必须支持)
502 Bad Gateway:代理服务器找不到目标服务器
503 Service Unavailable:服务器停机维护或者已超载

6,请求头字段
7,响应头字段
8,请求体的类型
  • Content-Type: application/json

1>请求体格式:{"name":"zhangsan","age":"20"}
2>常应用于APP中的接口

  • Content-Type: application/x-www-form-urlencoded

1>请求体格式:name=zhangsan&age=20
2>常应用于网页表单提交(例如登录、注册等)

  • Content-Type: multipart/form-data; boundary=xxx

1>请求体格式:
     --boundary
     参数1
     --boundary
     参数2
     --boundary
     文件1
     --boundary
     文件2
     --boundary--
2>常应用于文件上传
3>boundary是一个随机生成的字符串

9,响应体的类型
  • text/plain:纯文本格式
  • text/htmlHTML格式
  • application/javascriptJS格式
  • text/xmlXML格式
  • application/jsonJSON格式
  • image/*:图片格式

二,HTTP进阶

1,断点续传
  • 首次请求

GET /123.png HTTP/1.1

  • 首次响应

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 1024 // 数据总长度

在下载500个字节时网络异常,待网络恢复后继续下载

  • 再次请求

GET /123.png HTTP/1.1
Range: bytes=500- // 表示从第500个字节开始到最后一个字节

  • 再次响应

HTTP/1.1 206 Partial Content
Content-Length: 524
Content-Range: bytes 500-1023/1024

2,跨域
  • 前后端分离

浏览器先从页面服务器获取网页,再从接口服务器获取数据

  • 同源策略

1>浏览器自带同源策略
2>它规定在默认情况下,异步请求只能发送给同源的URL
3>同源表示协议、域名、端口都相同
4>同源:http://www.network.com:80/page.htmlhttp://www.network.com:80/data
5>不同源:http://www.network.com:80/page.htmlhttps://www.network.com:80/data

  • CORS

1>CORSCross-Origin Resource Sharing的缩写,表示跨域资源共享
2>跨域资源共享表示向不同的源发送异步请求
3>假设网页的URLhttp://www.network.com:80/page.html,数据的URLhttps://www.network.com:80/data
4>由于数据在不同的源,浏览器在请求时,会将Origin字段设置为http://www.network.com:80
5>如果服务器允许跨域访问,需将Access-Control-Allow-Origin设置为http://www.network.com:80,这样浏览器才会接收该数据

3,Cookie
  • 当登录成功时,服务器会创建一个Session对象来保存用户信息,并且将用户标识通过Set-Cookie字段返回给浏览器
  • 浏览器会将用户标识存储到Cookie中,在后面获取用户数据时通过Cookie字段发送给服务器
  • 服务器拿到用户标识先查找是否有对应的Session对象,有则表明该用户已登录,然后才能返回用户数据
  • Cookie存储于浏览器的本地磁盘中,Session存储于服务器的内存中
  • 默认情况下,浏览器关闭时Cookie就会失效,Session的有效期为30分钟
4,重定向
  • 在禁止访问http时访问http,会被重定向到https
  • 在已登录状态时访问登录页,会被重定向到主页
  • 在未登录状态时访问主页,会被重定向到登录页
5,缓存
  • 基本介绍

1>需要缓存的情况:GET请求 + 静态资源(例如HTMLJS、图片等)
2>缓存分为:内存缓存(Memory Cache)、磁盘缓存(Disk Cache

  • 响应头

1>Pragma:作用类似于Cache-Control,HTTP/1.0的产物
2>Expires:缓存的过期时间(GMT格式),HTTP/1.0的产物
3>Cache-Control:缓存策略
     no-storage:不允许缓存
     private:只允许浏览器缓存
     public:允许浏览器和代理服务器缓存
     no-cache:每次请求都需要询问服务器资源是否有变化,再决定是否使用缓存
     max-age:缓存的有效时长(单位为秒)
4>Last-Modified:资源的最后修改时间
5>ETag:资源的唯一标识(根据内容计算出来的散列值)

优先级:Pragma > Cache-Controlmax-age > ExpiresETag > Last-Modified

  • 请求头

If-None-Match
1>如果上一次的响应头中有ETag,就会将ETag的值作为该字段的值
2>如果服务器发现资源的唯一标识与该字段的值不匹配,表明资源有变化,就会返回最新的资源(200 OK
3>否则就不会返回资源(304 Not Modified

If-Modified-Since
1>如果上一次的响应头中没有ETag,有Last-Modified,就会将Last-Modified的值作为该字段的值
2>如果服务器发现资源的最后修改时间晚于该字段的值,表明资源有变化,就会返回最新的资源(200 OK
3>否则就不会返回资源(304 Not Modified

  • Last-Modified和ETag

Last-Modified的缺点
1>只能精确到秒级,如果资源在1秒内被修改了,浏览器就无法获取最新的资源
2>如果资源被修改了,最后修改时间发生了变化,但内容并没有改变,服务器也会返回资源

ETag的优点
1>只要资源的内容没有变化,服务器就不会返回资源
2>只要资源的内容发生了变化,服务器就会返回资源

  • 整体流程

三,HTTPS

1,基本介绍
  • HTTPS是HyperText Transfer Protocol Secure的缩写,表示超文本传输安全协议
  • HTTP是明文传输,HTTPS是密文传输
  • HTTP的默认端口为80,HTTPS的默认端口为443
  • HTTPS由于需要连接和加解密,导致传输速度较慢
2,SSL/TLS
  • SSLTLS的前身
  • SSLSecure Sockets Layer的缩写,表示安全套接层
  • TLSTransport Layer Security的缩写,表示传输层安全性协议
  • SSL/TLS的作用是对请求和响应报文进行加密
  • SSL/TLS工作在应用层与传输层之间
3,HTTPS的通信过程
4,TLS的连接过程
  • 十大步骤
  • ① Client Hello

包含以下信息:
1>TLS的版本号
2>客户端随机数(Client Random
3>支持的加密组件列表(加密组件包含加密算法、密钥长度等信息)

  • ② Server Hello

包含以下信息:
1>TLS的版本号
2>服务器随机数(Server Random
3>选择的加密组件

  • ③ Certificate

包含以下信息:
1>服务器的公钥证书(CA已签名)

  • ④ Server Key Exchange

包含以下信息:
1>ECDHE算法所需要的第一个参数(Server Params

说明:
1>ECDHE是一种密钥交换算法
2>服务器会对该参数进行签名

  • ⑤ Server Hello Done

包含以下信息:
1>告知客户端,服务器数据已发送完毕

说明:
1>客户端会用CA的公钥对证书进行验证(CA的公钥已内置在客户端中)
2>客户端会用服务器的公钥对参数进行验证

  • ⑥ Client Key Exchange

包含以下信息:
1>ECDHE算法所需要的第二个参数(Client Params

说明:
1>到目前为止,数据都已交换完毕,客户端和服务器开始各自生成会话密钥
2>客户端和服务器都会生成两个会话密钥,一个用来加密,一个用来解密

  • ⑦ Change Cipher Spec

包含以下信息:
1>告知服务器,之后客户端的消息都会用会话密钥进行加密

  • ⑧ Finished

包含以下信息:
1>之前所有交换的数据的散列值(已加密)

说明:
1>用来检验服务器是否能解密成功

  • ⑨ Change Cipher Spec

包含以下信息:
1>告知客户端,之后服务器的消息都会用会话密钥进行加密

  • ⑩ Finished

包含以下信息:
1>之前所有交换的数据的散列值(已加密)

说明:
1>用来检验客户端是否能解密成功

四,HTTP/2

1,HTTP/1.1的不足
  • 一个连接同时只能处理一个请求,并发需要建立多个连接
  • 一个请求只能对应一个响应,服务器无法主动发起响应
  • 同一个会话的多个请求中,头信息会被重复传输,造成不必要的开销
2,基本介绍
  • HTTP/2在HTTP/1.1基础上增加了SPDY
  • SPDYspeedy的缩写)是由Google开发的应用层协议,它修改了HTTP/1.1的传输方式
  • HTTP/1.1传输的是文本格式,HTTP/2传输的是二进制格式
  • HTTP/2会将二进制数据流拆分成多个帧进行传输
  • 特性:多路复用、优先级、头部压缩、服务器推送
  • 问题:队头阻塞、握手延迟
3,多路复用
  • 一个连接可以同时处理多个请求
  • 每个请求的数据帧交替发送
  • 每个帧都有帧头,帧头中包含标识信息,在接收端根据标识信息对帧进行重新组装
4,优先级
  • HTTP/2允许给数据流设置依赖关系和权重值
  • 客户端可以将其构建成优先级树并发送给服务器
  • 服务器根据优先级树来决定如何给数据流分配资源
  • 下图中D先于C获得完整资源,C先于AB获得完整资源,A获得的资源是B的3倍
5,头部压缩
  • HTTP/2使用HPACK算法压缩请求头和响应头,可以极大减少头部开销
  • 客户端和服务器会维护两个表,静态表用来存储常用的头信息,动态表用来存储新出现的头信息
  • 客户端在请求之前先去表中查询,头信息在表中存在就直接传其索引,不存在就将头信息存入表中
  • 服务器拿到请求头之后,如果是索引就去表中获取头信息,如果是头信息就直接存入表中
6,服务器推送
  • 服务器可以对一个客户端请求发送多个响应
7,队头阻塞
  • TCP为了保证可靠传输,一旦有数据包丢失,必须等待该包重传完成,才会处理后面的数据包
8,握手延迟
  • TCP三次握手和TLS连接需要耗费一些时间

五,HTTP/3

1,基本介绍
  • HTTP/3在HTTP/2基础上增加了QUIC
  • QUICQuick UDP Internet Connections的缩写)表示快速UDP网络连接,是由Google开发的应用层协议
  • UDPTCP速度快,但不能保证可靠传输,这个缺陷由QUIC来弥补
  • 特性:解决队头阻塞、解决握手延迟、连接迁移
  • 问题:之前没有使用UDP进行高速的信息传输,没有得到像TCP那样的优化,从而导致CPU消耗大
  • HTTP/2已经成为标准,HTTP/3还在试验阶段
  • HTTP/2和HTTP/3都是在应用层进行改进,这样升级起来会比较简单,只需更新客户端和服务器配置即可
2,解决队头阻塞
  • UDP不保证可靠传输,即使有数据包丢失,也不影响其他数据包的处理
3,解决握手延迟
  • QUIC将握手和连接合并成了一个
4,连接迁移
  • HTTP/2

1>HTTP/2是基于TCP
2>TCP连接四要素:源IP地址、源端口号、目标IP地址、目标端口号
3>当网络发生变化时,四要素也会发生变化,导致旧的连接失效,必须重新建立连接

  • HTTP/3

1>QUIC使用Connection ID来标识一个连接
2>即使四要素发生变化,只要Connection ID不变,连接就依然有效

六,抓包

1,HTTP
2,HTTPS
3,HTTP/2
HTTP/1.1
HTTP/2

你可能感兴趣的:(网络协议:应用层之HTTP与HTTPS)