2023-07-23
网络协议
00
请注意,本文编写于 487 天前,最后修改于 267 天前,其中某些信息可能已经过时。

目录

HTTP协议定义与特点
URL
请求与响应
状态码
请求方法
GET与POST的区别
常用的请求头与响应头
配对使用的请求头与响应头
单独使用的请求头
单独使用的响应头
缓存相关
复杂的Cache-Control
浏览器缓存优先级
包体的传输方式
定长包体
不定长包体
随机点播原理

前一篇文章《应用层协议》阐述了HTTP协议的发展演化过程,这一篇文章将深入讲解HTTP协议常见的状态码、请求头、响应头、缓存策略、分块传输等内容。

HTTP协议定义与特点

定义:HTTP协议是用于从万维网服务器传输超文本到本地浏览器的传送协议。

  • 基于TCP/IP通信协议来传输数据
  • 是一个属于应用层的面相对象的协议。
  • 工作于客户端-服务器架构之上。

主要特点

  1. 简单快速
  2. 灵活 可以传输任意类型的数据 Content-Type标记
  3. 无连接 每次连接只处理一个请求,HTTP/1.1引入长连接
  4. 无状态 对事务处理没有记忆能力, HTTP/1.1引入Cookie
  5. 支持B/S和C/S模式

URL

示例 http://127.0.0.1:5500/browser/a.html?a=1&b=2#asd ${location.protocol}//${location.hostname}:${location.port}${location.pathname}${location.search}${location.hash}

  • 协议 protocol http: https:
  • 域名 hostname 127.0.0.1
  • 端口 port 5500
  • 虚拟目录 pathname /browser/a.html
  • 参数 search ?a=1&b=2
  • 锚点 hash #asd

在协议与域名之间还有一些可选内容 user:pass@ HTTP认证

URL/URI/URN

  • URI包含URL和URN
  • URL 统一资源定位器
  • URN 统一资源命名 mailto:java-net@java.sun.com
  • URI 统一资源标识符
    • ftp://user:pass@mysite.net:8502/shared/movie/aa.mkv
    • aa.jpg

URL编码

如果URL参数中出现特殊字符要进行编码

  • 不在ASCI码范围内的字符
  • ASCI码中不可显示的字符
  • URL规定的保留字符
  • 不安全字符 如空格、引号、尖括号等

URL百分号编码

  • 对于URL合法字符,编码与不编码是等价的
  • 非ASI码字符,建议先UTF8编码在US-ASCI编码

请求与响应

  • 请求 = 请求行+请求头+请求内容
  • 请求行组成: 以一个方法符号开头,后面跟着请求的URI和协议的版本。

image.png

  • 响应 = 状态行+响应头+响应内容
  • 状态行组成: 服务器HTTP协议的版本,服务器发回的响应状态代码和状 态代码的文本描述。

image.png

状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

分类描述
1xx指示信息--表示请求已接收,继续处理
2xx成功--表示请求已被成功接收、理解、接受
3xx重定向--要完成请求必须进行更进一步的操作
4xx客户端错误--请求有语法错误或请求无法实现
5xx服务器端错误--服务器未能实现合法的请求

如果客服端收到了一个它不认识的响应码怎么办?

  • 555 ---> 500
  • 277 ---> 200

常见状态码

状态码描述
101协议升级 如websocket
200 OK成功返回响应
201 Created有新的资源在服务器端成功创建
202 Accepted服务器接受并开始处理请求名单请求未处理完成
为处理异步、需长时间处理的任务而设计
204 No Content成功执行了请求且不携带响应包体,并暗示客户端无需更新当前的页面视图
205 Reset Content与204的区别是 暗示客户端更新视图
301 Moved Permanently永久重定向,使用GET请求
302临时重定向,使用GET请求
304协商缓存
307临时重定向,保持原有的请求方法
308永久重定向,保持原有的请求方法
400 Bad Request服务器认为客户端出现了错误,但不能明确判断是哪种错误。例如HTTP请求格式错误
401 Unauthorized用户信息缺失或不正确,导致服务器无法处理请求
403 Forbidden没有权限
404 Not Found服务器没有找到对应的资源
405 Method Not Acceptable服务器不支持请求行中的method方法
408 Request Timeout服务器接受请求超时
409 Confict资源冲突,如上传文件
410 Gone服务器没有找到对应的资源,且明确知道该位置永久性找不到该资源
415 Unsupported Media Type上传的文件类型不被服务器支持
416 Range Not Satisfiable无法提供Range请求中制定的那段包体
426 Upgrade Required告知客户端必须升级协议才能继续处理
500 Internal Server Error服务器内部错误
501 Not Implemented服务器不支持请求所需要的功能
502 Bad Gateway代理服务器无法获得合法响应
503 Service Unavailable服务器资源尚未准备好处理当前请求
504 Gateway Timeout代理服务器无法及时的从上游获得响应

请求方法

  • HTTP/1.0定义了三种请求方法: GET, POST 和 HEAD方法。
  • HTTP/1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET请求指定的页面信息,并返回实体主体
HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
数据被包含在请求体中。
POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。

HEAD 请求的用途

  • 检查资源是否存在
  • 获取资源的元数据
  • 检查资源是否被修改
  • 测试服务器的可用性

OPTIONS请求的用途

  • 获取服务器支持的HTTP方法
    • 服务器会在响应中返回一个Allow头,其中包含服务器支持的HTTP方法列表。
  • CORS预检请求
  • 获取资源的通信选项
  • 测试服务器的可用性和功能

POST方法 请求包体的编码方式 enctype

  • content-type: application/x-www-form-urlencoded
    • 数据被编码成以'&'分割的键-值对,同时以“=”分割键和值,字符以URL编码方式编码
  • content-type: multipart/form-data
    • boundary 分隔符
    • 每部分表述皆有HTTP头部描述子包体,例如Content-Type
    • last-boundary结尾

image.png image.png image.png

GET与POST的区别

-GETPOST
参数参数放在URL后面参数放在请求体里面
限制URL长度有限制没有限制
安全不安全相对安全
跨域--

表单请求

  • application/x-www-form-urlencoded:数据会URL编码
  • multipart/form-data:常用,不需要编码,每个表单元素独立

常用的请求头与响应头

配对使用的请求头与响应头

请求头响应头作用
AuthorizationWWW-AuthenticateHTTP Basic Authentication 如果认证失败返回状态吗401继续认证
User-AgentServerUser-Agent 允许客户端将它的操作系统、浏览器和其它属性告诉服务器。也可做内容协商,如重定向到移动端还是pc端
作用:
1)兼容性处理 根据浏览器版本号或操作系统版本号
2)内容协商 重定向
Server 包含了服务器用来处理请求的软件信息。
AcceptContent-Type客户端协商、服务器选择资源的类型
Accept-Charsetcharset资源的文件编码
Accept-Languagecontent-language使用什么语言版本的页面
Connection-协商是否使用长连接 默认 keep-alive 长连接
Accept-Encodingcontent-encoding指定可接受的压缩内容编码。
CookieSet-Cookie-

单独使用的请求头

请求头作用
Host主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,发送请求时,该报头域是必需的。
Referer告诉服务器我是从哪个页面链接过来的
作用:作用图片防盗链、图片第三方广告、防csrf攻击

单独使用的响应头

响应头作用
Location响应报头域用于重定向接受者到一个新的位置
Location响应3XX报头域常用在更换URL的时候。
Refresh表示浏览器应该在多少时间之后刷新文档,以秒计。
还可以重定向

文件下载的原理,响应头如下

http
Content-Disposition: attachment filename='aa.jpg'

缓存相关

请求头响应头作用
If-Modified-SinceLast-ModifiedHTTP/1.0 协商缓存, 绝对时间
只能精确到秒, 如果1s内多次修改,会导致缓存失效
Pragma-Pragma只有一个值no-cache
-ExpiresHTTP/1.0 强缓存, 绝对时间
ETagIf-None-MatchHTTP/1.1 协商缓存
Cache-ControlCache-ControlHTTP/1.1 缓存总方案,相对时间

Q:有了 Last-Modified 为什了新增ETag字段呢?

A:因为有些时候文件修改日期变了,但是内容没有变更,这样就导致资源的重复请求浪费带宽。 协商缓存 etag 与 Last-Modified字段, 另外Last-Modified是绝对时间一秒为单位, 如果一秒内发生了变更缓存会是失效

协商缓存优先级流程图

Q: 强缓存过期了会怎样

A: 强缓存过期,如果协商缓存存在会走协商缓存

cache-control用法

404 206也可以被缓存

复杂的Cache-Control

Cache-Control的用法很复杂,

  • 可以在请求中用也可以在响应中用
  • 有些属性值后面要跟=数字,有些属性值只能单独使用,还有一些支持两种用法

如下图

  • 红色表示后面要跟=数字 黑色的属性值只能单独使用, 蓝色的表示既可以单独使用也可以跟=数字

image.png

在请求中的用法

  • max-age 告诉服务器,客户端不会接受Age超出max-age秒的缓存
  • max-stale 告诉服务器,即使缓存不在新鲜,但陈旧秒数没有超出max-stale时,客户端仍然打算使用, 若max-stale后没有值,则表示无论过期多久客户端都可以使用
  • min-fresh 告诉服务器,Age至少经过 min-fresh 秒后才可以使用
  • no-cache 不使用强缓存
  • no-store 告诉各代理服务器不要对该请求的响应缓存
  • no-transform 告诉代理服务器不要对该请求的响应缓存
  • only-if-cached 告诉服务器只能返回缓存的响应,否则若没有缓存则返回504错误码

在响应中的用法

  • must-revalidate 告诉客户端一旦缓存过期,必须向服务器验证后才使用
  • proxy-revalidate 与must-revalidate类似,但它仅对代理服务器的共享缓存有效
  • no-cache 告诉客户端使用协商缓存, 如果no-cache后指定头部,则若客户端的后续请求几响应不含有这些头则直接使用缓存
  • max-age 告诉客户端Age查处max-age秒后则缓存过期
  • s-maxage 与max-age相似,但仅针对共享缓存,且优先级高于max-age和Expires
  • public 表示无论私有缓存还是共享缓存皆可以响应缓存
  • private 表示该响应不能被代理服务器作为共享缓存使用,若private后制定头部,则告诉代理服务器不能缓存制定的头部,但可以缓存其他部分
  • no-store 告诉所有下游节点不能对响应进行缓存
  • no-transform 告诉代理服务器不能修改消息报题的内容

其他:

  • http/1.1的缓存优先级 高于http/1.0
  • Vary缓存, 可以根据压缩版本匹配决定缓存。

浏览器缓存优先级

包体的传输方式

  • 包体即请求内容或响应内容
  • 包体的传输方式有两种 1) 定长包体 2)不定长包体

定长包体

  • 请求或响应中都可以可以携带包体
  • 以下消息不能含有包体
    • HEAD方法对应的响应
    • 1xx/204/304 对应的响应
    • CONNECT方法对应的2xx响应

不定长包体

发送HTTP消息时不能确定包体的全部长度
使用 Transfer-Encoding头部指名使用Chunk传输方式
Transfer-Encoding头部后Content-Length头部会被忽略

优点

  1. 基于长连接持续推送动态内容
  2. 压缩体积较大的包体时,不必完全压缩完(计算出头部)在发送,可以边发送边压缩
  3. 传递必须在包体传输完成才能计算出 Trailer 头部

用途: 断点续传、多线程下载、随机点播

  1. 客户端明确任务:从哪里开始下载
    • 本地是否已有部分文件
    • 文件已下载的部分在服务器是否发生改变
    • 使用几个线程并发下载
  2. 下载文件的指定部分内容
  3. 下载完毕后拼装成统一的文件

随机点播原理

前提条件: 需要服务器支持 HTTP Range规范,服务器通过响应头Accept-Ranges告知,bytes 支持 none 不支持

image.png

也可以取多段

image.png

下载服务器资源发生改变怎么办?

这时候要使用条件请求,有两种方式

  1. 请求头if-Unmodified-Sinceif-Match
  2. 请求头if-Range=ETagLast-Modified

image.png

如果资源发生改变会返回 状态吗412 这时候要重新下载

随机点播服务器的响应

  • 会返回状态码206
  • 返回响应头Content-Range:bytes start-end

如果请求头Range范围不对, 服务器会返回416

断点续传与随机点播的原理相同, 只是内容片段是放在请求主体里面。

本文作者:郭敬文

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!