先说明一下语法符号
- 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都只可能出现在单一的请求和响应里面,可能他们的更容易理解。