前一篇文章《应用层协议》阐述了HTTP协议的发展演化过程,这一篇文章将深入讲解HTTP协议常见的状态码、请求头、响应头、缓存策略、分块传输等内容。
定义:HTTP协议是用于从万维网服务器传输超文本到本地浏览器的传送协议。
主要特点
Content-Type标记示例 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.1port 5500pathname /browser/a.htmlsearch ?a=1&b=2hash #asd在协议与域名之间还有一些可选内容 user:pass@ HTTP认证
URL/URI/URN
mailto:java-net@java.sun.comftp://user:pass@mysite.net:8502/shared/movie/aa.mkv
URL编码
如果URL参数中出现特殊字符要进行编码
URL百分号编码


状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
| 分类 | 描述 |
|---|---|
| 1xx | 指示信息--表示请求已接收,继续处理 |
| 2xx | 成功--表示请求已被成功接收、理解、接受 |
| 3xx | 重定向--要完成请求必须进行更进一步的操作 |
| 4xx | 客户端错误--请求有语法错误或请求无法实现 |
| 5xx | 服务器端错误--服务器未能实现合法的请求 |
如果客服端收到了一个它不认识的响应码怎么办?
常见状态码
| 状态码 | 描述 |
|---|---|
| 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 | 代理服务器无法及时的从上游获得响应 |
| GET | 请求指定的页面信息,并返回实体主体 |
|---|---|
| HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
| POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。 数据被包含在请求体中。 POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
| DELETE | 请求服务器删除指定的页面。 |
| CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
| OPTIONS | 允许客户端查看服务器的性能。 |
| TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
HEAD 请求的用途
OPTIONS请求的用途
POST方法 请求包体的编码方式 enctype
content-type: application/x-www-form-urlencoded
content-type: multipart/form-data

| - | GET | POST |
|---|---|---|
| 参数 | 参数放在URL后面 | 参数放在请求体里面 |
| 限制 | URL长度有限制 | 没有限制 |
| 安全 | 不安全 | 相对安全 |
| 跨域 | - | - |
表单请求
application/x-www-form-urlencoded:数据会URL编码multipart/form-data:常用,不需要编码,每个表单元素独立| 请求头 | 响应头 | 作用 |
|---|---|---|
Authorization | WWW-Authenticate | HTTP Basic Authentication 如果认证失败返回状态吗401继续认证 |
User-Agent | Server | User-Agent 允许客户端将它的操作系统、浏览器和其它属性告诉服务器。也可做内容协商,如重定向到移动端还是pc端作用: 1)兼容性处理 根据浏览器版本号或操作系统版本号 2)内容协商 重定向 Server 包含了服务器用来处理请求的软件信息。 |
Accept | Content-Type | 客户端协商、服务器选择资源的类型 |
Accept-Charset | charset | 资源的文件编码 |
Accept-Language | content-language | 使用什么语言版本的页面 |
Connection | - | 协商是否使用长连接 默认 keep-alive 长连接 |
Accept-Encoding | content-encoding | 指定可接受的压缩内容编码。 |
Cookie | Set-Cookie | - |
| 请求头 | 作用 |
|---|---|
Host | 主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,发送请求时,该报头域是必需的。 |
Referer | 告诉服务器我是从哪个页面链接过来的 作用:作用图片防盗链、图片第三方广告、防csrf攻击 |
| 响应头 | 作用 |
|---|---|
Location | 响应报头域用于重定向接受者到一个新的位置 Location响应3XX报头域常用在更换URL的时候。 |
Refresh | 表示浏览器应该在多少时间之后刷新文档,以秒计。 还可以重定向 |
文件下载的原理,响应头如下
httpContent-Disposition: attachment filename='aa.jpg'
| 请求头 | 响应头 | 作用 |
|---|---|---|
If-Modified-Since | Last-Modified | HTTP/1.0 协商缓存, 绝对时间 只能精确到秒, 如果1s内多次修改,会导致缓存失效 |
Pragma | - | Pragma只有一个值no-cache |
| - | Expires | HTTP/1.0 强缓存, 绝对时间 |
ETag | If-None-Match | HTTP/1.1 协商缓存 |
Cache-Control | Cache-Control | HTTP/1.1 缓存总方案,相对时间 |
Q:有了 Last-Modified 为什了新增ETag字段呢?
A:因为有些时候文件修改日期变了,但是内容没有变更,这样就导致资源的重复请求浪费带宽。 协商缓存 etag 与 Last-Modified字段, 另外Last-Modified是绝对时间一秒为单位, 如果一秒内发生了变更缓存会是失效
协商缓存优先级流程图

Q: 强缓存过期了会怎样
A: 强缓存过期,如果协商缓存存在会走协商缓存
cache-control用法
404 206也可以被缓存
Cache-Control的用法很复杂,
=数字,有些属性值只能单独使用,还有一些支持两种用法如下图
=数字 黑色的属性值只能单独使用, 蓝色的表示既可以单独使用也可以跟=数字
在请求中的用法
max-stale时,客户端仍然打算使用, 若max-stale后没有值,则表示无论过期多久客户端都可以使用min-fresh 秒后才可以使用no-cache 不使用强缓存no-store 告诉各代理服务器不要对该请求的响应缓存no-transform 告诉代理服务器不要对该请求的响应缓存only-if-cached 告诉服务器只能返回缓存的响应,否则若没有缓存则返回504错误码在响应中的用法
must-revalidate 告诉客户端一旦缓存过期,必须向服务器验证后才使用proxy-revalidate 与must-revalidate类似,但它仅对代理服务器的共享缓存有效public 表示无论私有缓存还是共享缓存皆可以响应缓存no-store 告诉所有下游节点不能对响应进行缓存no-transform 告诉代理服务器不能修改消息报题的内容其他:
ServiceWorker
MemoryCache
DiskCache
Push Cache
发送HTTP消息时不能确定包体的全部长度
使用 Transfer-Encoding头部指名使用Chunk传输方式
含 Transfer-Encoding头部后Content-Length头部会被忽略
优点
用途: 断点续传、多线程下载、随机点播
前提条件: 需要服务器支持 HTTP Range规范,服务器通过响应头
Accept-Ranges告知,bytes支持none不支持

也可以取多段

下载服务器资源发生改变怎么办?
这时候要使用条件请求,有两种方式
if-Unmodified-Since 或 if-Matchif-Range=ETag或Last-Modified
如果资源发生改变会返回 状态吗412 这时候要重新下载
随机点播服务器的响应
Content-Range:bytes start-end如果请求头Range范围不对, 服务器会返回416
断点续传与随机点播的原理相同, 只是内容片段是放在请求主体里面。
本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!