超文本传输协议
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
目录
- 报文
- 方法
- 状态码
- 缓存
1、报文
HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,描述报文的内容及含义,后面跟着可选的数据部分
1.1 请求报文
向wbe服务器发送请求
格式:
<method><request-URL><version> //方法、版本号、对应的URL、状态码
<headers>//请求首部
<entity-body>//请求主体部分
1.2 响应报文
请求结果返回给客户端
格式:
<version><status><reason-phrase>//版本、状态码、原因字体等
<headers>//响应首部
<entity-body>//响应主体部分
1.3 通用首部
首部 | 描述 |
---|---|
Connection | 客户端和服务器是否保持连接 |
Date | 日期,报文创建时间 |
Update | 给出了发送端可能想要升级使用新版本或协议 |
Via | 显示了报文经过的中间节点(代理、网关) |
Trailer | 如果报文采用分块传输编码方式,可以利用这个首部列出位于报文trailer部分的首部集合 |
Trailer-Encoding | 告诉接收端对报文采用什么编码格式 |
Cache-Control | 随报文传送缓存指示 |
Pragma | 早期的随报文传送指示方式 |
1.4 请求首部
首部 | 描述 |
---|---|
Client-IP | 客户端IP |
From | 客户端邮件地址 |
Host | 接收请求的服务器的主机名和端口号 |
Referer | 提供了包含当前请求URI的文档的URL,告诉服务器自己来源 |
User—Agent | 发起请求的客户端应用程序 |
Accept | 告诉服务器能够发送那些媒体类型 |
Accept-Charset | 告诉服务器能够发送那些字符集 |
Accept-Encoding | 告诉服务器能够发送那些编码 |
Accept-Language | 告诉服务器能够发送那些语言 |
Expect | 允许客户端列出请求所要求的服务器行为 |
If-Match | 如果ETag和文档当前ETag匹配,就获取文档 |
If-Modified-Since | 除非在某个指定日期之后修改过,否则限制这个请求 |
If-None-Match | 如果ETag和当前文档ETag不符合,获取资源 |
If-Range | 允许对文档否个范围内的条件请求 |
If-Unmodified-Since | 在某个指定日期之后没有修改过,否则现在请求 |
Cookie | 客户端字符串 |
1.5 响应首部
首部 | 描述 |
---|---|
Age | 响应持续时间 |
Server | 服务器应用软件名称和版本 |
Allow | 列出了可用的请求方法 |
Location | 告诉客户端实在在哪里,用于定向 |
Content-Base | 解析主体中相对URL的基础URL |
Content-Encoding | 主体编码格式 |
Content-Language | 解析主体时适用的语言 |
Content-Length | 主体的长度或尺寸 |
Content-Location | 资源实际位置 |
Content-MD5 | 主体的MD5校验和 |
Content-Range | 在整个资源中此实体部分的字节范围 |
Content-Type | 主体的MIME |
ETag | 主体的实体标记 |
Expires | 过期时间 |
Last-Modified | 实体最后一次修改时间 |
如图:
2、方法
HTTP最大的作用就是客户端发送请求,服务器给出响应,客户端想服务器发送请求的方式有很多。
ps:在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST
- GET-从指定的资源请求数据。
- POST-向指定的资源提交要被处理的数据
- HEAD-与 GET 相同,但只返回 HTTP 报头,不返回文档主体。
- PUT-上传指定的 URI 表示。
- DELETE-删除指定资源。
- TRACE-回显服务器收到的请求,主要用于测试或诊断。
- OPTIONS-返回服务器支持的 HTTP 方法。
- CONNECT-把请求连接转换到透明的 TCP/IP 通道。
3、状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态码被分为五大类:
1、100-199 用于指定客户端应相应的某些动作。
2、200-299 用于表示请求成功。
3、300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
4、400-499 用于指出客户端的错误。
5、500-599 用于支持服务器错误。
状态代码 | 状态信息 | 含义 |
---|---|---|
100 | Continue | 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新) |
101 | Switching Protocols | 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新) |
200 | OK | 一切正常,对GET和POST请求的应答文档跟在后面。 |
201 | Created | 服务器已经创建了文档,Location头给出了它的URL。 |
202 | Accepted | 已经接受请求,但处理尚未完成。 |
203 | Non-Authoritative Information | 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。 |
204 | No Content | 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 |
205 | Reset Content | 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。 |
206 | Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。 |
300 | Multiple Choices | 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。 |
301 | Moved Permanently | 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 |
303 | See Other | 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。 |
304 | Not Modified | 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告 诉客户,原来缓冲的文档还可以继续使用。 |
305 | Use Proxy | 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。 |
400 | Bad Request | 请求出现语法错误。 |
403 | Forbidden | 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。 |
404 | Not Found | 无法找到指定位置的资源。这也是一个常用的应答。 |
ps:常见的状态码
4、缓存
每次访问网页,通常浏览器会从服务器下载所需的资源,例如 HTML 文档、图片、CSS、JavaScript,甚至包括字体文件等。这里面的许多文件(例如图片)都是很少变动的,如果每次都要从服务器重新下载,会不必要地增加网页载入时间,同时也会对服务器造成一定压力。通过合理配置缓存策略,可令浏览器以某种方式把这些静态的文件缓存起来,下次请求同一资源时,直接使用本地存储的副本,而不是从服务器重新下载。
缓存好处:
- 减少页面加载时间
- 减少服务器负载
4.1、HTTP header中与缓存有关的key。
key | 描述 |
---|---|
Cache-Control | 指定缓存机制,覆盖其它设置 |
Pragma | http1.0字段,指定缓存机制 |
Expires | http1.0字段,指定缓存的过期时间 |
Last-Modified | 资源最后一次的修改时间 |
ETag | 唯一标识请求资源的字符串 |
4.2、缓存协商策略用于重新验证缓存资源是否有效, 有关的key如下.
key | 描述 |
---|---|
If-Modified-Since | 缓存校验字段, 值为资源最后一次的修改时间, 即上次收到的Last-Modified值 |
If-Unmodified-Since | 同上, 处理方式与之相反 |
If-Match | 缓存校验字段, 值为唯一标识请求资源的字符串, 即上次收到的ETag值 |
If-None-Match | 同上, 处理方式与之相反 |
4.3、Cache-Control
HTTP/1.1定义的 Cache-Control 头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略。
如:Cache-Control: no-store;//请求和响应都不缓存
Cache-directive共有如下12种(其中请求中指令7种, 响应中指令8种):
Cache-directive | 描述 | 请求/响应 |
---|---|---|
public | 资源将被客户端和代理服务器缓存 | 响应 |
private | 资源仅被客户端缓存, 代理服务器不缓存 | 响应 |
no-store | 请求和响应都不缓存 | 请求、响应 |
no-cache | 相当于max-age:0,must-revalidate即资源被缓存, 但是缓存立刻过期, 同时下次访问时强制验证资源有效性 | 请求、响应 |
max-age | 缓存资源, 但是在指定时间(单位为秒)后缓存过期 | 请求、响应 |
s-maxage | 同上, 依赖public设置, 覆盖max-age, 且只在代理服务器上有效. | 响应 |
max-stale | 指定时间内, 即使缓存过时, 资源依然有效 | 请求 |
min-fresh | 缓存的资源至少要保持指定时间的新鲜期 | 请求 |
must-revalidation / proxy-revalidation | 如果缓存失效, 强制重新向服务器(或代理)发起验证(因为max-stale等字段可能改变缓存的失效时间) | 响应 |
only-if-cached | 仅仅返回已经缓存的资源, 不访问网络, 若无缓存则返回504 | 请求 |
no-transform | 强制要求代理服务器不要对资源进行转换, 禁止代理服务器对 Content-Encoding, Content-Range, Content-Type字段的修改(因此代理的gzip压缩将不被允许) | 请求、响应 |
4.4、Pragma
Pragma 是HTTP/1.0标准中定义的一个header属性,请求中包含Pragma的效果跟在头信息中定义Cache-Control: no-cache相同,但是HTTP的响应头不支持这个属性,所以它不能拿来完全替代HTTP/1.1中定义的Cache-control头。通常定义Pragma以向后兼容基于HTTP/1.0的客户端。
ps:更多缓存解释详情请看饥人谷:「面试题」简述浏览器缓存是如何控制的
参考:
- https://zhuanlan.zhihu.com/p/23299600?refer=study-fe
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ#
- https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#.E8.AF.B7.E6.B1.82.E6.96.B9.E6.B3.95
结语:本文纯属个人学习总结,如有冒犯请发简信联系我修改。