X.d 笔记

小Web,大世界

0%

HTTP小结之三:请求响应头

先说明一下语法符号

  • SP = 空格
  • GRLF = 结束+换行

HTTP请求语法

Request-Line 
*((general-header
|request-header
|entity-header) GRLF)
GRLF
[message-body]

第一行为Request-Line语法为:

Method SP Request-URI SP HTTP-Version CRLF

第二三四行有点正则味道,*说明是可选的,不一定有

首先是由general-header,request-header,entity-header组成,三个header。

关于这些header详细往下说明。

第五行为换行

第六行为请求体,POST方法的时候会有请求体。

HTTP响应语法

Status-Line
*(( general-header
| response-header
| entity-header ) CRLF)
CRLF
[ message-body ]

可以看出来语法差不多,不同的是:request-line变成了status-line,request-header变成了response-header.

status-line会有服务器的响应状态码信息。语法:

HTTP-Version SP Status-Code SP Reason-Phrase CRLF

HTTP请求头包括四部分,general-header,request-header,response-header,entity-header浏览器和服务器很大程度都会根据响应和请求的头做预判断以便后续的流程。如果使用fidder或其它工具抓包会自动根据功能分为Cache,Client,Server,Transport等等很多类,更为直观。

这里说下这些header都会有什么,首页是general-header和entity-header。这是请求和响应都可能会带上的。

General-header:通用头,用于缓存,探测,消息传送等

通用头 说明 EXP.
Cache-Control 指定缓存控制机制 请求:no-cache、no-store、max-age、   max-stale、min-fresh、only-if-cached响应:public、private、no-cache、no-   store、no-transform、must-revalidate、proxy-revalidate、max-age
Connection 是否需要持久链接 Close,Keep-Alive
Date 消息发送时间 Date:Mon, 31 Dec 2001 04:25:57
Pragma 实现特定指令 Pragma: no-cache
Trailer 自定义头,当Transfer-Encoding为chunked的时候有效 Trailer:   Max-Forwards
Transfer-Encoding 告知消息作了怎么样的编码 Transfer-Encoding:   chunked
Upgrade 一般用于探测是否有新的协议。 Upgrade: HTTP/2.0,   SHTTP/1.3, IRC/6.9, RTA/x11
Via 告知请求经过了哪些代理服务器 Via:   1.0 fred, 1.1 example.com (Apache/2.0)
Warning 警告消息 Warning:   xxxxxx  warning

Entity-header:内容头,用于指定内容格式,获取过期时间等,用缓存的同学应该很熟悉。

内容头 说明 EXP.
Allow 支持哪些方法 Allow: GET, HEAD,POST
Content-Encoding 内容编码方式 Content-Encoding:   gzip
Content-Language >内容语言 Content-Language:   zh_cn
Content-Length 内容大小 Content-Length:   5480
Content-Location 内容实际位置 Content-Location:   /index.htm
Content-MD5 内容MD5,实现上是使用BASE64编码的MD5值 Content-MD5:   Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 内容的Range信息 Content-Range:   bytes 21010-47021/47022
Content-Type 内容的格式 Content-Type:application/xml
Expires 内容过期时间 Expires:   Thu, 01 Dec 2012 16:00:00 GMT
Last-Modified 内容最后一次修改时间 Last-Modified: Thu, 01 Dec 2012   16:00:00 GMT

Request-header:请求头

请求头 说明 EXP.
Accept 接受的介质类型 Accept: text/plain
Accept-Charset 接受的字符集 Accept-Charset:   utf-8
Accept-Encoding 接受的编码方式 Accept-Encoding:   gzip, deflate
Accept-Language 接受的语言 Accept-Language:   zh-CN
Authorization 服务器需要验证时,需要传一个{BASE64(“用户名:密码”)}的字符串在请求头里面。 Authorization:   Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Expect 表明特定服务器行为所需的客户端 Expect:   hw-tft
From 来自谁的请求(邮箱地址) From:   user@xdnote.com
Host 请求的主机名 Host: www.xdnote.com
If-Match 匹配E-Tag,如果匹配 一样,则服务器响应为304缓存 If-Match:   “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since 匹配Last-Modified,如果最近没修改过,则服务器应响应为304缓存,第一次浏览器响应了Last-Modify后客户段针对同一URL再次发送请求时应该带上这个头,由服务器判断是否有修改过,后面的E-tag等都是一样的原理。 If-Modified-Since:   Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match 有If-Match一样,一个是判断变了,一个是判断没变 If-None-Match:   “737060cd8c284d8af7ad3082f209582d”
If-Range 告诉服务器,如果资源没有变化,则取剩余的资源 If-Range:   “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 和If-Modified-Since一样,一个是判断修改过一个是判断没有修改过 If-Unmodified-Since:   Sat, 29 Oct 1994 19:43:31 GMT
Max-Forwards 告诉服务器请求最多被服务器转发多少次 Max-Forwards:   4
Proxy-Authorization 和Authorization一样,一个是服务器认证,一个是代理服器认证 Proxy-Authorization:   Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 告诉服务器想获取哪部分,一般是多线程下载中使用 Range:   bytes=500-999
Referer 请求来自哪里,相当常用。 Referer:   https://www.xdnote.com/
TE 在Transfer-Encoding=chunked的情况下,告诉客户端能接受什么样的分块。 TE: trailers,   deflate
User-Agent 用户发请求的客户端UA信息字符串,相当常用 User-Agent:   Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS124307)

Response-header:响应头信息

响应头 说明 EXP.
Accept-Ranges 响应说明是否接受请求指定的Range,不授受为None Accept-Ranges:   bytes
Age 代理服务器响应在代理服务器里面的缓存时,指示缓存的年龄(秒) Age:200
ETag 标签,用于判断是否缓存使用 ETag: “737060cd8c284d8af7ad3082f209582d”
Location 如果是3XX响应码时,告诉客户端重定向的位置 Location:http://www.xdnote.com
Proxy-Authenticate 代理需要认证,需要客户端传Proxy-Authorization头 Proxy-Authenticate:   Basic
Retry-After 响应失败后,告诉客户端多少时间后可以重试,可以为数字(秒)或一个时间串 Retry-After:   60 Retry-After:   Fri, 01 Nov 2012 23:59:59 GMT
Server 服务器信息 Server:Apache
Vary 告诉服务器缓存支持的响应方式 Vary:Accept-Encoding,Cookie,User-Agent
WWW-Authenticate 服务器需要认证,需要客户端面传Authorization头 WWW-Authenticate:   Basic

当然,与之前一样,这些只是标准的头,一般的服务器和浏览器都会遵守,时代在发展,很多新的头都有新的服务器或浏览器支持,比如X-Forward-For,Access-Control-Allow-Orgin等。

另外,这些头也是http1.1规范里面的,很多人写出来后,位置都发生了变化,因为很多general-header和entity-header都只可能出现在单一的请求和响应里面,可能他们的更容易理解。