Hypertext Transfer Protocol(HTTP)协议(RFC7230)
一种无状态的、应用层、以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。
web
Request-line = method SP request-target SP HTTP-version CRLF
GET:主要的获取信息方法,大量的性能优化都针对该方法,幂等方法 HEAD:相似GET方法,但服务器不发送BODY,用以获取HEAD元数据,幂等方法 POST:经常使用于提交HTML FORM表单、新增资源等 PUT:更新资源,带条件时是幂等方法 DELETE:删除资源,幂等方法 CONNECT:创建tunnel隧道 OPTIONS:显示服务器对访问资源支持的方法,幂等方法 TRACE:回显服务器收到的请求,用于定位问题。有安全风险
origin-form:后端请求资源的路径,为空时传递/ absolute-form:用于正向代理 authority-form:用于CONNECT方法 asterisk-form:用于OPTIONS方法
HTTP/0.9:只支持GET,已过期 HTTP/1.0:RFC1945,1996,常见使用于代理服务器(例如NGINX默认配置) HTTP/1.1:RFC2616,1999 HTTP/2.0:2015.5 正式发布
Status-line = HTTP-version SP status-code SP reason-phrase CRLF status-code = 3DIGIT Reason-phrase=*(HTAB/SP/VCHAR/obs-text)
响应码规范:RFC6585(2012.4) RFC7231 (2014.6)
1xx:请求已经收到,须要进一步处理才能完成,HTTP1.0不支持算法
2xx:成功处理请求后端
3xx:重定向使用Location指向的资源或者缓存中的资源。在RFC2068中规定客户端重定向次数不该超过5次,以防止死循环跨域
4xx:客户端出现错误浏览器
5xx:服务器端出现错误缓存
connection:keep-alive 长链接(HTTP/1.1默认使用长链接,keep-alive无心义)
connection:close 短链接
安全
HTTP/1.1规范要求,不传递Host头部则返回400错误响应码
host头部用于http消息在服务器端路由
Host头部与消息的路由性能优化
一、创建TCP链接 肯定服务器的IP地址 二、接收请求 三、寻找虚拟主机 匹配Host头部与域名 四、寻找URI的处理代码 匹配URI 五、执行处理请求的代码 访问资源 六、生成HTTP响应 各中间件基于PF架构串行修改响应 七、发送HTTP响应 八、记录访问日志
X-Forwarded-For:用于代理服务器传递IP
X-Real-IP:用于传递用户IP
Max-Forwards:限制Proxy代理服务器的最大转发次数,仅对TRACE/OPTIONS方法有效
Via:指明通过的代理服务器名称及版本
Cache-Control:禁止代理服务器修改响应包体
服务器
User-Agent:指明客户端的类型信息,服务器能够据此对资源的表述作抉择
Referer:浏览器对来自某一页面的请求自动添加的头部
From:主要用于网络爬虫,告诉服务器如何经过邮件联系到爬虫的负责人
Server:指明服务器上所用软件的信息,用于帮助客户端定位问题或统计数据
Allow:告诉客户端,服务器上该URI对应的资源容许哪些方法的执行
Accept-Ranges:告诉客户端服务器上该资源是否容许range请求(容许服务器基于客户端的请求只发送响应包体的一部分给到客户端,而客户端自动将多个片断的包体组合成完整的体积更大的包体)
websocket
Accept-Encoding:内容编码,主要指压缩算法协商
Accept-Language:语言协商
Content-type:资源表述,媒体类型、编码
Content-encoding:资源表述,内容编码
Content-Language:资源表述,语言
Content-Length:使用Content-Length头部明确指出包体长度
Transfer-Encoding:指明使用Chunk 传输方式,含Transfer-Encoding 头部后Content-Length头部应被忽略
TE头部:客户端在请求在声明是否接受Trailer头部
Trailer头部:服务器告知接下来chunk包体会传输哪些Trailer头部
如下头部不容许出如今Trailer 的值中: 用于信息分帧的首部(例如Transfer-Encoding 和Content-Length) 用于路由用途的首部(例如Host) 请求修饰首部(例如控制类和条件类的,如Cache-Control, Max-Forwards, 或者TE) 身份验证首部(例如Authorization或者Set-Cookie) Content-Encoding, Content-Type, Content-Range, 以及Trailer 自身
disposition-type =" inline"|" attachment"| disp-ext-type
inline: 指定包体是以inline 内联的方式,做为页面的一部分展现
attachment: 指定浏览器将包体以附件的方式下载
在multipart/form-data类型应答中,能够用于子消息体部分
Cookie-header:Cookie头部中能够存放多个name/value 名值对
Set-Cookie:Set-Cookie头部一次只能传递1个name/value名值对,响应中能够包含多个头部
Access-Control-Request-Method:在preflight预检请求(OPTIONS)中,告知服务器接下来的请求会使用哪些方法
Access-Control-Request-Headers:在preflight预检请求(OPTIONS)中,告知服务器接下来的请求会传递哪些头部
Access-Control-Allow-Methods:在preflight预检请求的响应中,告知客户端后续请求容许使用的方法
Access-Control-Allow-Headers:在preflight预检请求的响应中,告知客户端后续请求容许携带的头部
Access-Control-Max-Age:在preflight预检请求的响应中,告知客户端该响应的信息能够缓存多久
Access-Control-Expose-Headers:告知浏览器哪些响应头部能够供客户端使用,默认状况下只有Cache-Control.、Content-Language、Content-Type、Expires、 Last-Modified、Pragma 可供使用
Access-Control-Allow-Origin:告知浏览器容许哪些域访问当前资源, *表示容许全部域。 为避免缓存错乱,响应中须要携带Vary: Origin
Access-Control-Allow-Credentials:告知浏览器是否能够将Credentials暴露给客户端使用,Credentials包含cookie、 authorization类头部、TLS证书等。
Etag:给出当前资源表述的标签
Last-Modified:表示对应资源表述的上次修改时间
验证请求
若缓存响应中含有Last-Modified头部
If-Unmodified-Since If-Modified-Since If-Range
若缓存响应中含有Etag头部
If-None-Match If-Match If-Range
Age:Age表示自源服务器发出响应(或者验证过时缓存) ,到使用缓存的响应发出时通过的秒数
Cache-Control:缓存控制头部
Cache-Control头部在请求中的值
Max-age:告诉服务器,客户端不会接受Age超出max-age秒的缓存 Max-stale:告诉服务器,即便缓存再也不新鲜,但陈旧秒数没有超出max-stale时,客户端扔打算使用。若max-stale后没有值,则表示不管过时多久客户端均可使用 Min-fresh:告诉服务器,Age至少通过min-fresh秒后缓存才可以使用 No-cache:告诉服务器,不能直接使用已有缓存做为响应返回,除非带着缓存条件到上游服务端获得304验证返回码才可以使用现有缓存 No-store:告诉各代理服务器不要对该请求的响应缓存(实际有很多不遵照该规定的代理服务器) No-transform:告诉代理服务器不要修改消息包体的内容 Only-if-cached:告诉服务器仅能返回缓存的响应,不然若没有缓存则返回504错误码
Cache-Control头部在响应中的值
Must-revalidate:告诉客户端一旦缓存过时,必须向服务器验证后才可以使用 Proxy-revalidate:与Must-revalidate相似,但它仅对代理服务器的共享缓存有效 No-cache:告诉客户端不能直接使用缓存的响应,使用前必须在源服务器验证获得304返回码。若是no-cache后指定头部,则若客户端的后续请求及响应中不含有这些头则可直接使用缓存 Max-age:告诉客户端缓存Age超出max-age秒后则缓存过时 S-maxage:与max-age类似,但仅对共享缓存,且优先级高于max-age和Expires public:表示不管私有缓存或者共享缓存,皆可将该响应缓存 private:表示该响应不能被代理服务器做为共享缓存使用。若private后指定头部,则在告诉代理服务器不能缓存指定的头部,但可缓存其余部分 No-store:告诉全部下游节点不能对响应进行缓存 No-transform:告诉代理服务器不能修改消息包体的内容
Location :当浏览器接收到重定向响应码时,须要读取响应头部Location头部的值,获取到新的URI再跳转访问该页面
参考文章:http://taohui.pub/