1.报文流
http报文是在http应用程序之间发送的数据块。
报文流动方向:
#1:报文流入源端服务器:报文流入源服务器,工作完成之后,会流回用户的Agent代理中。
#2:报文向下游流动:不管是请求报文还是响应报文,所有报文都会向下游流动。
2.报文组成部分
三部分组成报文:
#1:起始行:报文描述。ASCII文本。
#2:首部:属性描述。ASCII文本。与起始行分隔符为CRLF(ASCII码13 、ASCII码10)。
#3:主体:可选,数据主体。包含文本或二进制数据,也可以为空。
2.1.报文语法
http报文可以分为俩类:请求报文、响应报文。
#1:请求报文的格式:
<method> <request-URL> <version>
<headers>
<entity-body>
#2:响应报文的格式:
<version> <status> <reason-phrase>
<headers>
<entity-body>
#方法(method):
客户端希望服务器对资源执行的动作。如:GET、HEAD、POST...
GET:常用,通常用于请求服务器发送某个资源。
HEAD:服务器只返回首部,不会返回实体的主体部分。使用HEAD可以:1.在不获取资源的情况下了解资源;2.查看响应的状态码,看看对象是否存在;3.测试资源是否被修改了
PUT:向服务器写入文档。让服务器用请求的主体部分来创建或替换一个由所请求的URL命名的新文档。
POST:向服务器发送数据,通常支持html的表单。
TRACE:请求报文不能带有实体的主体部分。TRACE请求会在目的服务器端发起一个“环回”诊断。请求可能要穿过防火墙、代理、网关或其他一些应用程序。目的服务器会弹回一条TRACE响应,并在响应主体上携带收到的原始请求报文。目的是查看所有中间http应用程序组成的请求/响应链上,原始报文是否被修改或毁坏。
OPTION:请求服务器告知其支持的各种功能。
DELETE:请求服务器删除指定URL所指定的资源。
#请求(equest-URL):
命名了所请求资源,或者URL路径组件的完善URL
#版本(version):
报文所使用的HTTP版本。
格式:HTTP/<major>.<minor>
note:主要版本号(major)和次要版本号(minor)都是整数。
#状态码(status):
三位数,描述请求过程所发生的情况。
100~199:信息性状态码
200~299:成功状态码
300~399:重定向状态码
400~499:客户端错误状态码
500~599:服务端错误状态码
状态码 | 原因短语 | 含义 |
100 | Continue | 收到请求的起始部分,客户端应该继续请求 |
101 | Switching Protocols | 服务器正根据客户端的指示将协议切换成Update首部列出的协议 |
200 | OK | 服务器已成功处理请求 |
201 | Created | 对于需要服务器创建对象的请求来说,资源已创建完毕 |
202 | Accepted | 请求已接收,但服务器尚未处理 |
203 | Non-Acthoritative Information | 服务器已将事务成功处理,只是实体首部包含的信息不是来自原始服务器,而是来自资源的副本 |
204 | No Content | 响应报文包含一些首部和一个状态行,但不包含实体的主体内容。 |
205 | Reset Content | 浏览器应该充值当前页面上的html表单 |
206 | Partial Content | 部分请求成功 |
300 | Multiple Choices | 客户端请求了实际指向多个资源的URL。这个代码适合一个选项类表一起返回的,然后用户就可以选择他希望使用的选项。 |
301 | Moved Permanently | 请求的URL已移走。响应中应该包含一个Location URL,说明资源现在所处的位置。 |
302 | Found | 类似于301 |
303 | See Other | 告诉客户端应该用另一个URL获取资源。这个新的URL位于响应报文的Location首部 |
304 | Not Modified | 客户端可以通过它们所包含的请求首部发起条件请求。这个代码说明资源未发生变化。 |
305 | Use Proxy | 必须通过代理访问资源,代理的位置是在Location首部中给出的。 |
306 | (未用) | 这个状态码当前并未使用 |
307 | Temporary Redirect | 类似于301 |
400 | Bad request | 告诉客户端它发送了一条异常请求 |
401 | Unauthorized | 与适当的首部一起返回,在客户端获得资源访问权之前,请它进行身份认证。 |
402 | Payment Required | 未使用 |
403 | Forbidden | 服务器拒绝了请求 |
404 | Not Found | 服务器无法找到所请求的URL |
405 | Method Not Allow | 请求中有一个所请求的URI不支持的方法。响应中应该包含一个Allow首部,以告知客户端所请求的资源支持哪些方法。 |
406 | Not Acceptable | 客户端可以指定一些参数来说明希望接受哪些类型的实体。服务器没有资源与客户端可接受的URL匹配时可使用此代码 |
407 | Proxy Authentication Required | 类似于401,但用于需要进行资源认证的代理服务器 |
408 | Request Timeout | 如果客户端完成其请求时花费的时间过长,服务器可以回送这个状态码并关闭连接 |
409 | Confict | 发出的请求在资源上造成了一些冲突 |
410 | Gone | 除了服务器曾持有这些资源之外,与404类似 |
411 | Lengh Required | 服务器要求请求报文中包含Content-Lengh首部时会使用这个代码。发起的请求中若没有,服务器是不会接受此资源请求的。 |
412 | Precondition Failed | 如果客户端发起了一个条件请求,如果服务器无法满足其中的某个条件,就返回这个响应码。 |
413 | Request Entity Too Large | 客户端发送的实体主体部分比服务器能够或希望处理的要大 |
414 | Request URI Too Long | 客户端发送的请求所携带的请求URL超过了服务器能够或者希望处理的长度 |
415 | Unsupported Media Type | 服务器无法理解或不支持客户端所发送的实体的内容类型 |
416 | Request Range Not Statisfiable | 请求报文请求的是某范围内的指定资源,但这个范围无效,或者未得到满足 |
417 | Expectation Fail | 请求的Expect首部所包含了一个预期内容,但服务器无法满足 |
500 | Internet Server Error | 服务器遇到了一个错误,使其无法为请求提供服务 |
501 | Not Implement | 服务器无法满足客户端请求的某个功能 |
502 | Bad Gateway | 作为代理或网管使用的服务器遇到了来自响应链中上游的无法响应 |
503 | Service Unavailable | 服务器目前无法为请求提供服务,但过一段时间就可以恢复服务 |
504 | Gateway Timeout | 类似于408,但响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时 |
505 | HTTP Version Not Support | 服务器收到的请求是以它不支持或不愿支持的协议版本表示的 |
#原因短语(reson-phrase):
数字状态码的可读版本,包含行终止序列之前的所有文本。
原因短语只对人类有意义。(HTTP/1.0 200 NOT OK) 和 (HTTP/1.0 200 OK)中原因短语不一样,但都当做成功指示处理。
#首部(headers):
0个或多个。
格式:{首部名}{:}{可选空格}{值}{CRLF}
通用首部:请求、响应报文都可以使用的。
请求首部:请求报文特有。
响应首部:响应报文特有。
实体首部:用于应对实体的主体部分。
扩展首部:非标准的首部,由程序开发者创建。
首部名 | 类型 | 基本语法 | 例子 | 注释 |
Accept | 请求首部 | Accept: text/*, image/* Accept: text/*, image/gif, image/jpeg; q=1 | 用于通知服务器可以接受哪些媒体类型。为了防止服务器有多重版本的媒体类型,还可以在首部字段中包含一个质量值(q值)列表,用于告知服务器它优选哪种媒体类型。 ”*“是用于通配媒体类型,比如”*/*“表示所有类型,”image/*“表示所有图片类型 | |
Accept-Charset | 请求首部 | Accept-Charset:(charset | *) [";" "q" "= " qvalue] | Accept-Charset: iso-latin-1 | 通知服务器它可以接受哪些字符集或哪些事优选字符集。当有多种字符集是,可以通过质量值告知服务器哪个字符集是优选的。 如果没有"*",那么值字段中没有设置的所有字符集的q值都默认为0,这不包括指定的字符,它的默认值为1。 |
Accept-Encoding | 请求首部 | Accept-Encoding: (content-coding | "*") [";" "q" "=" qvalue] | Accept-Encoding: gzip Accept-Encoding: compress; q=0.5, gzip; q=1 | 客户端告知服务器它可以接受哪些编码方式。 |
Accept-Language | 请求首部 | Accept-Language: (((1*8ALPHA["-"1*8ALPHA] | "*")) [";" "q" "=" qvalue]) | Accept-Language: en Accept-Language: en;q=0.7, en-gb;q=0.5 | 通知服务器可接受或优选哪些语言。 |
Authorization | 请求首部 | Authorization: Authorization-scheme #Authorization-param | Authorization: Basic YnJpYW4tdG90dHk6T3ch | 由客户端发送的,用于向服务器回应自己的身份验证信息。收到401状态码,要求在请求中包含这个首部。 |
From | 请求首部 | From: mailbos | From: dawn@163.com | 说明请求来自何方。 |
Host | 请求首部 | Host: host [":" port] | Host: www.dawn.com:80 | 提供客户端想要访问的哪台机器的因特网主机名和端口号。 |
If-Modified-Since | 请求首部 | If-Modified-Since: HTTP-date | If-Modified-Since: Thu, 03 Oct 1997 17:15:00 GMT | 用于发起条件请求。客户端可以GET方法去请求服务器上的资源,而响应则取决于客户端上次请求此资源之后,该资源是否被修改过。如果没有被修改过,服务器会回送一条304状态码,则不会回送此资源。 |
If-Unmodified-Since | 请求首部 | If-Unmodified-Since: HTTP-date | If-Unmodified-Since: Thu, 03 Oct 1997 17:15:00 GMT | 用于发起条件请求。客户端可以GET方法去请求服务器上的资源,而响应则取决于客户端上次请求此资源之后,该资源是否被修改过。如果没有被修改过,才会回送此资源。 |
Expect | 请求首部 | Expect: ("100-continue" | expectation-extension) | Expect: 100-continue | 告诉服务器他们需求某种行为。与状态码100密切相关 |
If-Match | 请求首部 | If-Match: ("*" | entity-tag) | If-Match: "11e92a-457b-31345aa" | 服务器将对比If-Match首部的实体标记与资源当前的实体标记,如果匹配,就将对象返回。 |
If-None-Match | 请求首部 | If-None-Match: ("*" | entity-tag) | If-None-Match: "11e92a-457b-31345aa" | 服务器将对比If-Match首部的实体标记与资源当前的实体标记,如果不匹配,就将对象返 |
If-Range | 请求首部 | If-Range: (HTTP-date | entity-tag) | If-Range: "11e92a-457b-31345aa" If-Range: Thu, 03 Oct 1997 17:15:00 GMT | 应用程序拥有某范围内资源的副本,它对范围进行再校验,如果范围无效,要获取新的资源,在这种情况下使用这个首部。 |
Max-Forwards | 请求首部 | Max-Forwards: 1*DIGIT | Max-Forwards: 5 | 与TRACE一并使用,以指定请求所经过的代理或其他中间节点的最大数目。 |
Pragma | 请求首部 | Pragma: pragma-directive | Pragma: no-cache | Pragma首部用于随报文传送一些指令,这些指令几乎可以包含任何内容,但通常会用这些指令来控制缓存的行为。 |
Proxy-Authorization | 请求首部 | Proxy-Authorization: credentials | Proxy-Authorization: Basic YnJpYW4tdG90dHk6T3ch | 客户端用于响应Proxy-Authenticate质询。 |
Referer | 请求首部 | Referer: (absoluteURL | relativeURL) | Referer: http://www.dawn.com/index.html | 客户端请求中加入此首部,可以使服务器知道客户端是从哪里获得其请求的URL。浏览器所做的工作相当简单。如果在主页A上点击一个链接,进入主页B,浏览器就会在请求中插入一个带有值A的Refer首部。只有你点击链接的时候浏览器才会插入Refer首部,自己输入的URL中不会包含此首部。 |
TE | 请求首部 | TE: ("trailers" | (transfer-extension[accept-params])) | TE: TE: chunked | 用于说明客户端能否处理位于分块编码的响应拖挂中的首部。如果这个值为空,就只接受分块传输比啊那么。特定标记"trailers"说明分块响应中可以接受Trailer首部。 |
User-Agent | 请求首部 | User-Agent: (product | comment) | User-Agent: Mozilla/4.0 (Compatible; MSIE 5.5; Windows NT 5.0) | 值是应用程序的名称,可能还会有一个描述性注释。 |
Client-ip | 扩展请求首部 | Client-ip: ip-address | Client-ip: 209.1.33.49 | 是一些比较老的客户端和代理使用的扩展首部,用于传输运行客户端程序的计算机IP地址。不安全。 |
Cookie | 扩展请求首部 | Cookie: ink=IUOKy59BC708378908CFF 89OE5573998A115 | 用于客户端识别和跟踪的扩展首部。 | |
Cookie2 | 扩展请求首部 | Cookie2: $version="1" | 用于客户端识别和跟踪的扩展首部。Cookie2用于识别请求发起者能够理解哪种类型的Cookie。 | |
UA-(CPU, Disp, OS, Color, Pixels) | 扩展请求首部 | "UA" "-" ("CPU" | "Disp" | "OS" | "Color" | "Pixels") ":" (cpu | screensize | os-name | display-color-depth) | UA-CPU: X86 UA-Disp: 640, 480, 8 UA-OS: windows 95 UA-Color: color8 UA-Pixels: 640 X 480 | 提供了客户端机器的相关信息,以便服务器更好地进行内容选择。 UA-CPU(客户端的CPU)、UA-Disp(客户端显示器的尺寸和色彩深度)、UA-OS(客户端机器的操作系统)、UA-Color(客户端显示器的色彩深度)、UA-Pixels(客户端显示器的尺寸) |
X-Forwarded-for | 扩展请求首部 | X-Forwarded-for: addr | X-Forwarded-for: 64.95.76.161 | 很多代理服务器(如Squid)会用这个首部来说明某条请求都被转发了给谁。 |
Accept-Range | 响应首部 | Accept-Range: range-unit | none | Accept-Range: none Accept-Range: bytes | 告知客户端是否接受请求资源的某个范围。 |
Age | 响应首部 | Age: delta-seconds | Age: 60 | 告诉接受端响应已产生了多少时间,HTTP/1.1缓存必须发送的每条响应中都包含一个Age首部 |
Allow | 响应首部 | Allow: #Method | Allow: GET, HEAD | 通知客户端可以对特定资源使用那些HTTP方法,发送405响应,服务器必须包含Allow首部 |
Location | 响应首部 | Location: absoluteURL | Location: http://www.dawn.com/ | 服务器通过此首部将客户端导向某个资源的地址,这个资源可能在客户端最后一次请求后被移动过,也可能是在对请求的响应中创建的。 |
Proxy-Authenticate | 响应首部 | Proxy-Authenticate: challenge | Proxy-Authenticate: Basic realm="Super Scret Corporate FinancialDocument" | 代理通过这个首部来质询发送请求的客户端,要求其对自身进行认证。如果一台HTTP/1.1代理服务器发送一条407响应,就必须包含此首部。 |
Public | 响应首部 | Public: HTTP-method | Public: OPTIONS, GET, HEAD, TRACE, POST | 服务器告知客户端它支持哪些方法。 |
Retry-After | 响应首部 | Retry-After: (HTTP-date | delta-seconds) | Retry-After: Thu, 03 Oct 1997 17:15:00 GMT Retry-After: 120 | 告知客户端什么时候重新发送某资源的请求。此首部可以与503状态码配合使用,给出客户端可以重试其请求的具体日期。服务器还可以在将客户端重定向到资源时,通过这个首部通知客户端在对重定向的资源发送请求之前需要等待的时间。对于创建动态资源的服务器来说,这个首部非常有用。 |
Server | 响应首部 | Server: (product | comment) | Server: Microsoft-Internet-Information-Server/1.0 Server: Websitepro/1.1f (s/n wpo-07d0) Server: apache/1.2b6 via proxy gateway CERN-HTTPD/3.0 libwww/2.13 | 它为服务器提供了一种向客户端标识自己的方式。它的值就是服务器名字和一个可U型那的服务器注释。 |
Title | 响应首部 | Title: document-title | Title: CNN Interactive | 主要用于HTML页面,这些HTML页面有着服务器可以使用的明确的标题标记。 |
Vary | 响应首部 | Vary: ("*" | field-name) | Vary: User-Agent | 通知客户端,在服务器端的协商中会使用那些来自客户端请求的首部。值是一个首部列表。 |
Warning | 响应首部 | Warning: warning-value | Warning: 113 | 给出更多与请求过程中所发生情况相关的信息。HTTP/1.1规范中定义了几种警告代码: 101-响应过时了-响应报文已过期; 111-再验证失败-缓存无法抵达原始服务器造成了再验证失败; 112-断开连接操作-缓存到网络的连接被删除了; 113-试探性过期-新鲜性试探过期时间大于24小时,就返回; 199-杂项警告-报文中可能包含为用户提供的额外信息,系统不能自动响应; 214-使用了转换-中间应用程序执行了任何会改变响应内容编码的转换; 299-持久杂项警告-错误中可能包含一个主体部分,为用户提供了更多的信息,系统不能进行任何自动回应。 |
WWW-Authenticate | 响应首部 | WWW-Authenticate: chanllenge | WWW-Authenticate: Basic realm="Your Private Travel Profile" | 用于401响应,向客户端发布一个质询认证方案。 |
Set-Cookie | 扩展响应首部 | Set-Cookie: command | Set-Cookie: lastorder=00183; path=/orders Set-Cookie: private_id=519; secure | 是Cookie首部的搭档 |
Set-Cookie2 | 扩展响应首部 | Set-Cookie2: command | Set-Cookie2: ID="29046"; Domain=".joes-hardware.com" Set-Cookie2: color=blue | 对Set-Cookie首部的扩展。 |
X-Cache | 扩展响应首部 | X-Cache: HIT | Squid(代理服务器)用此首部通知客户端某个资源是否可用。 | |
Content-Base | 实体首部 | Content-Base: absoluteURL | Content-Base: http://www.dawn.com/ | 响应主体中解析的URL指定的基础URL。 |
Content-Encoding | 实体首部 | Content-Encoding: content-coding | Content-Encoding: gzip Content-Encoding: compress, gzip | 告诉客户端,服务器对内容执行过哪种或哪些类型的编码,编码可以使内容在发送响应前进行压缩,有了这个信息,客户端就可以对报文进行解码。 |
Content-Language | 实体首部 | Content-Language: language-tag | Content-Language: en Content-Language: en, fr | 告诉客户端,应该理解哪种自然语言。 |
Content-Length | 实体首部 | Content-Length: 1*DIGIT | Content-Length: 2417 | 实体主体部分的长度。 |
Content-Location | 实体首部 | Content-Location: (absoluteURL | relativeURL) | Content-Location: http://www.dawn.com/index.html | 与报文的实体部分相对应的URL。 |
Content-MD5 | 实体首部 | Content-MD5: md5-digest | Content-MD5: Q2h1Y2sgSW51ZwDIAXR5IQ== | 报文主体的MD5摘要。通过这个值可以端到端地检查数据,在检查传输过程中是否对数据进行了无意的修改时非常有用。 |
Content-Range | 实体首部 | Content-Range: bytes 500-999 / 5400 | 请求传输某范围内的文档时,产生的结果有此首部给出。提供请求实体的原始实体内的范围,还给出了整个实体的长度。”*“代表未知。 | |
Content-Type | 实体首部 | Content-Type: media-type | Content-Type: text/html; charset=ios-latin-1 | 报文中的对象的媒体类型。 |
ETag | 实体首部 | ETag: entity-tag | ETag: "11e92a-457b-31345aa" ETag: W/"11e92a-457b-3134b5aa" | 为报文中包含的实体提供实体标记。 |
Expires | 实体首部 | Expires: HTTP-date | Expires: Thu, 03 Oct 1997 17:15:00 GMT | 响应失效的日期时间。客户端可以缓存一份副本,在这个时间到期之前,不用去询问服务器它是否有效。 |
Last-Modified | 实体首部 | Last-Modified: HTTP-date | Last-Modified: Thu, 03 Oct 1997 17:15:00 GMT | 提供这个实体最后一次被修改的相关信息。Last-Modified不应该是未来的时间,如果它比Date首部中发送的值还迟,HTTP/1.1服务器就会将Last-Modified时间重置。 |
Range | 实体首部 | Range: bytes=500-1500 | 说明报文所包含实体的范围。 | |
Cache-Control | 通用首部 | Cache-Control: no-cache Cache-Control: max-age=484200 | 用于传输对象的缓存信息。 max-age值定义了文档的最大试用期,最大合法生存时间(以秒为单位) | |
Connection | 通用首部 | Connection: connection-token | Connection:close | 用于扩展keep-alive连接的HTTP/1.1客户端,Keep-Alive连接用于控制信息。close意味着响应结束后,连接会被关闭。 |
Date | 通用首部 | Date: HTTP-date | Date: Tue, 3 Oct 1997 02:15:31 GMT | 报文创建的日期时间。缓存可以使用这个首部来判断相应的新鲜度。 |
Proxy-Connection | 通用首部 | Proxy-Connection: (connection-token) | Proxy-Connection: close | 在客户端和代理之间可以用它来指定与连接(主要是Keep-Alive连接)有关的选项。它并不是标准的首部,标准委员会把他当做一个临时首部,但它得到了浏览器和代理的广泛使用。 |
Trailer | 通用首部 | Trailer: field-name | Trailer: Content-Length | 用于说明报文拖挂中提供了哪些首部。 |
Transfer-Encoding | 通用首部 | Transfer-Encoding: transfer-coding | Transfer-Encoding: chunked | 如果需要通过某些编码来安全地传送HTTP报文主体,报文中就要包含Transfer-Encoding首部。它的值是一个对报文主体执行过的编码的列表。 |
Upgrade | 通用首部 | Upgrade; protocol | Upgrade: HTTP/1.1 | 此首部为报文发送者提供了一种手段,使其指定另一种可能完全不同协议并将此意愿向外广播。服务器发送101状态码响应时,必须包含此首部。 |
Via | 通用首部 | Via: (received-protocol received-by [comment]) | Via: 1.1 joes-hard-ware.com ( Joes-Server/1.0) | 用于在报文经过代理和网关时对其进行跟踪。如果报文是通过多个中间应用程序传输的,那么每个应用程序都会向其Via字符串中附加一些内容,必须通过HTTP/1.1代理和网关来插入Via首部。 |
MIME-Version | 扩展通用首部 | MIME-Version: DIGIT "." DIGIT | MIME-Version: 1 . 0 | MIME是HTTP的近亲。尽管俩者存在根本区别,但有些HTTP服务器确实构造了一些在MIME规范下同样有效的报文,这种情况下,就需要提供此首部 |
X-Pad | 扩展通用首部 | X-Pad: pad-text | X-Pad: bogosity | 用于解决某些浏览器中与响应首部长度相关的bug。 |
X-Serial-Number | 扩展通用首部 | X-Serial-Number: serialno | X-Serial-Number: 010014056 | 扩展首部,较老的HTTP应用程序会向报文中插入许可软件的序列号。 |
#实体的主体部分(entity-body):
包含一个由任意数据组成的数据块。是http报文的负荷,可以承载很多类型的数字数据:图片、视频、HTML文档、软件应用程序、信用卡事务、电子邮件等。