前一篇文章《应用层协议》阐述了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.1
port
5500
pathname
/browser/a.html
search
?a=1&b=2
hash
#asd
在协议与域名之间还有一些可选内容 user:pass@
HTTP认证
URL/URI/URN
mailto:java-net@java.sun.com
ftp://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-Match
if-Range
=ETag
或Last-Modified
如果资源发生改变会返回 状态吗412 这时候要重新下载
随机点播服务器的响应
Content-Range:bytes start-end
如果请求头Range
范围不对, 服务器会返回416
断点续传与随机点播的原理相同, 只是内容片段是放在请求主体里面。
本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!