HTTP协议

欧洲孩子研究组织CERN蒂姆伯纳斯李博士提出的一种能让远隔两地的研究者们共享知识的设想,最初设想的基本理念是,借助多文档之间的相互关联形成的超文本,连成可相互参阅的WWW万维网。

WWW万维网的三项构建技术:把标准通用标记语言SGML作为页面的文本标记语言的HTML超文本标记语言;作为文档传输协议的HTTP;指定文档所在地址的统一资源定位符URL

为了更快地处理大量事务,确保协议的可伸缩性,HTTP协议是一种无状态协议,其自身不对请求和响应之间的通信状态进行保存,为了实现期望的保持状态功能,引入了Cookie技术。Cookie技术通过在请求响应报文中写入Cookie信息来控制客户端的状态,Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端再往服务端发送请求时,会自动在请求报文中加入Cookie值后发送出去;服务端接收到Cookie后,会检查对比服务器上的记录,得到之前的状态信息。

两台计算机之间使用HTTP协议通信时,在一条通信线路上必定有一端是客户端,另一端是服务端。且是先从客户端开始建立通信。

请求报文是由请求方法请求URI协议版本号、可选的请求首部字段内容实体构成。

响应报文是由协议版本状态码、用于解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

URI

URI统一资源标识符,由某个协议方案表示的资源的定位标识符协议方案是指访问资源所使用的协议类型名称,如采用HTTP协议时,协议方案就是HTTP。URI用字符串标识某一互联网资源。常见的几种URI:

1
2
3
4
5
6
7
8
ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2

绝对URI格式:

1
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1

http:为协议名不区分大小写最后附一个冒号,user:pass为登录认证信息即用户名和密码,www.example.jp为服务地址也可以是IPv4地址或IPv6地址,80为端口号若省略自动使用默认端口号dir/index.htm带层次的文件路径来定位特指的资源uid=1查询字符串可选ch1为片段标识符即文档内某个位置

URL

URL统一资源定位符,表示资源的地点,URL是URI的子集

DNS协议

为了更符合人类的记忆习惯,故用字母配合数字的表示形式来指定计算机名,但这种方式计算机理解不了,故通过DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务

请求方法

向请求URI指定的资源发送请求报文时,采用称为方法的命令,方法的作用在于,可以指定请求的资源按期望产生某种行为,且区分大小写,注意使用大写。

方法 说明 支持的HTTP协议版本
GET 获取资源 1.0、1.1
POST 传输实体主体 1.0、1.1
PUT 传输文件 1.0、1.1
HEAD 获取报文首部 1.0、1.1
DELETE 删除文件 1.0、1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议连接代理 1.1
LINK 建立和资源之间的联系 1.0
UNLINK 断开连接关系 1.0
GET

GET是用来获取资源用来请求访问已经被URI识别的资源,如果请求的资源是文本则原样返回,若是通用网关接口那样的程序,则返回执行后的输出结果。

POST

POST是用来传输实体的主体,虽然GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是使用POST方法,虽然POST功能与GET相似,但POST的主要目的并不是获取响应的主体内容

PUT

PUT用于传输文件,像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置,但是鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST表征状态转移标准的同类Web网站,就可能会开放使用PUT方法。

HEAD方法和GET方法一样,只是不返回报文主体部分,用于确认URI的有效性、通信状态及资源更新的日期时间

DELETE

DELETE方法用于删除文件,与PUT方法相反,DELETE方法按请求URI删除指定的资源,一样不带验证机制

OPTIONS

OPTIONS方法用于询问支持的方法,用来查询针对请求URI指定的资源支持的方法

TRACE

TRACE用于追踪路径,让Web服务器将之前的请求通信返回给客户端的方法。发送请求在Max-Forwards首部字段中填入数值,每经过一个服务器端,就将该数字减一,当数值刚好减到0时,就停止继续传输最后接收到请求的服务器端则返回状态码200 OK的响应。客户端可以通过TRACE方法查询发送出去的请求时怎样被加工修改的,因为请求想要链接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作容易引发XST跨站追踪

CONNECT

CONNECT方法要求在与代理服务器通信时建立隧道实现用隧道协议进行TCP通信,主要使用SSL安全套接层TLS传输安全层协议吧通信内容加密后经过网络隧道传输

持久连接

HTTP协议初始版本中,每进行一次HTTP通信就要断开一次TCP连接,使用浏览器浏览一个包含多个张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源,每次请求都会造成无所谓的TCP连接建立和断开

为了解决TCP连接问题,HTTP/1.1和一部分HTTP/1.0想出了持久连接HTTP keep-aliveHTTP connection reuse的方法,任意一端没有明确提出断开连接,则保持连接状态

久连接减少了TCP连接重复建立断开所造成的额外开销,减轻了服务器端的负载,减少开销的那部分时间,使HTTP请求和响应能更早的结束,使Web页面的显示速度也得以提高。HTTP/1.1所有连接默认都是持久连接,但HTTP/1.0内并未标准化。虽然一部分服务器通过非标准手段实现了持久连接,但服务器不一定能支持持久连接,且还需要客户端也支持持久连接。

持久连接使得多数请求以管线化方式发送成为可能,管线化技术出现后,不用等待响应亦可直接发送下一个请求

HTTP报文

HTTP报文是HTTP协议交互的信息,由多行数据构成的字符串文本, 且CR(回车)+ LF(换行) 作换行符,分为请求报文响应报文。 HTTP报文分为首部主体两块,两者由首个CR+LF分割

请求报文和响应报文结构

请求报文首部含有请求行请求首部字段通用首部字段实体首部字段其他

响应报文首部含有状态行响应首部字段通用首部字段实体首部字段其他

请求行包含用户请求的方法请求URIHTTP版本状态行包含表明响应结果的状态码原因短语HTTP版本

首部字段包含表示请求响应各种条件属性各类首部,一般包含4首部,分别是通用首部请求首部响应首部实体首部其他可能包含HTTP的RFC里未定义的首部,如Cookie等。

编码提示传输效率

HTTP在传输数据时可按照数据原貌直接传输,也可在传输过程中通过编码提升传输速率,通过在传输时编码,能有效地处理大量
访问请求,但编码操作需要计算机来完成,因此会消耗更多CPU等资源。

HTTP协议中有一种被称为内容编码的功能,内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接收并负责解码。常用内容编码有以下几种:

  • gzip:GNU zip
  • compress:UNIX 系统的标准压缩
  • deflate:zlib
  • identity:不进行编码

HTTP通信过程中,请求编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面,在传输大容量数据时,通过把数据分割
成多块,能够让浏览器逐步显示页面,这种把实体主体分块的功能称为分块传输编码Chunked Transfer Coding,每一块都会用
十六进制来标记块的大小,而实体主体的最后一块会使用0(CR+LF)来标记;HTTP/1.1中存在一种称为传输编码Transfer Coding的机制,可在通信时按某种编码方式传输,但只定义作用于分块传输编码中

发送多种数据

发送邮件时可在邮件里写入文字并添加多份附件, 因为采用了MIMEMultipurpose Internet Mail Extensions多用途因特网邮件扩展机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。在MIME扩展中会使用一种称为多部分对象集合Multipart的方法来容纳多份不同类型的数据。

HTTP协议中也采纳了多部分对象集合,发送报文主体内可含多种类型实体,通常是在图片、文本、文件等上传时使用,多部分对象集合包含的对象如下:

  • multipart/form-data:Web表单文件上传时使用
  • multipart/byteranges:状态码206即Partial Content部分内容,响应报文包含了多个范围的内容时使用

HTTP报文中使用多部分对象集合时,需在首部字段里加上Content-type,且使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入--标记,如–AaB03x、–THIS_STRING_SEPARATES等,在多部分对象集合对应的字符串的最后插入--标记,如: –AaB03x–、 –THIS_STRING_SEPARATES–等作为结束。多部分对象集合的每个部分类型中,都可含有首部字段,可在某个部分中嵌套使用多部分对象集合

1
2
3
4
5
6
7
8
9
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="field1"
Joe Blow
--AaB03x
Content-Disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain
...(file1.txt的数据)...
--AaB03x--
1
2
3
4
5
6
7
8
9
10
11
12
13
HTTP/1.1 206 Partial Content
Date: Fri, 13 Jul 2012 02:45:26 GMT
Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 500-999/8000
...(范围指定的数据)...
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 7000-7999/8000
...(范围指定的数据)...
--THIS_STRING_SEPARATES--
范围请求

指定范围发送的请求叫做范围请求Range Request, 对一份10000字节大小的资源,若使用范围请求,可只请求5001~10000字节内的资源。执行范围请求时会用到首部字段Range来指定资源的byte范围:

1
2
3
4
5
6
# 5001~10000字节
Range: bytes=5001-10000
# 从5001字节之后全部的
Range: bytes=5001-
# 从一开始到3000字节和5000~7000字节的多重范围
Range: bytes=-3000, 5000-7000
1
2
3
GET /tip.jpg HTTP/1.1
Host: www.usagidesign.jp
Range: bytes =5001-10000

针对范围请求,响应会返回状态码206 Partial Content的响应报文,对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。若服务端无法响应范围请求, 则会返回状态码200 OK完整的实体内容

1
2
3
4
5
HTTP/1.1 206 Partial Content
Date: Fri, 13 Jul 2012 04:39:17 GMT
Content-Range: bytes 5001-10000/10000
Content-Length: 5000
Content-Type: image/jpeg
内容协商

同一Web网站可能存在着多份内容相同但使用语言不同的页面,如英语版和中文版的Web页面,当浏览器默认语言为英语或中文, 访问相同URI的Web页面时,则会显示对应的英语版或中文版的Web页面。

内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源,内容协商会以响应资源的语言字符集编码方式等作为判断的基准,在请求报文中的以下首部字段就是判断的基准:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商技术有:服务器驱动协商客户端驱动协商透明协商三种类型

  • 服务器驱动协商:以请求首部字段为参考,在服务器端自动处理
  • 客户端驱动协商:用户从浏览器显示的可选项列表中手动选择,也可利用JS脚本在Web页面上自动选择,如PC版与手机版的选择
  • 透明协商:是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法

HTTP状态码

状态码3位数字原因短语组成,数字中的第一位指定了响应类别后两位无分类,响应类别有以下5种:

状态码 类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

2XX成功

2XX的响应结果表明请求被正常处理了,在响应报文内, 随状态码一起返回的信息会因方法的不同而发生改变。如使用GET方法时,对应请求资源的实体会作为响应返回;使用HEAD方法时,对应请求资源的实体首部不随报文主体作为响应返回。

204 No Content

服务器接收的请求已成功处理,但在返回的响应报文不含实体的主体部分,也不允许返回任何实体的主体,当从浏览器发出请求处理后, 返回204响应则浏览器显示页面不发生更新;一般在只需要从客户端往服务器发送信息, 而对客户端不需要发送新信息内容的情况下使用。

206 Partial Content

表示客户端进行了范围请求,而服务器成功执行了这部分GET请求,响应报文中包含由Content-Range指定范围的实体内容。

3XX重定向

3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求

301 Moved Permanently

永久性重定向,表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI,若已经把资源对应的URI保存为书签,这时应按Location首部字段提示的URI重新保存。

302 Found

临时性重定向,表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问,代表的资源不是被永久移动, 只是临时性质的。 已移动的资源对应的URI将来还有可能发生改变,用户把URI保存成书签, 但不会像301状态码那样去更新书签, 而是仍旧保留返回 302状态码的页面对应的URI。

303 See Other

表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源,303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源

304 Not Modified

表示客户端发送附带条件的请求时,如GET方法请求报文中包含If-MatchIf-ModifiedSinceIf-None-MatchIf-RangeIf-Unmodified-Since中任一首部,服务器端允许请求访问资源,但未满足条件的情况,返回不包含任何响应的主体部分,和重定向没有关系。

307 Temporary Redirect

临时重定向302有着相同的含义,尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守,307会遵照浏览器标准,不会从POST变成GET,但对于处理响应时的行为,每种浏览器有可能出现不同的情况。

4XX客户端错误

4XX响应结果表明客户端是发生错误的原因所在

400 Bad Request

表示请求报文中存在语法错误,需修改请求的内容后再次发送请求,浏览器会像200 OK一样对待该状态码。

401 Unauthorized

表示发送的请求需要有通过HTTP认证,如BASIC认证、DIGEST认证等认证信息,若之前已进行过1次请求,则表示用户认证失败,返回含有401的响应必须包含一个适用于被请求资源WWW-Authenticate首部用以质询用户信息。当浏览器初次接收到401响应,会弹出认证对话窗口

403 Forbidden

表示对请求资源的访问被服务器拒绝,服务器端没有必要给出拒绝的详细理由,也可在实体的主体部分对原因进行描述,如未获得文件系统的访问授权访问权限出现某些问题等情况。

404 Not Found

表示服务器上无法找到请求的资源,也可在服务器端拒绝请求且不想说明理由时使用

5XX服务器错误

5XX的响应结果表示服务器本身发生错误

500 Internal Server Error

表示服务器端在执行请求时发生了错误,也可能是Web应用存在的bug或某些临时的故障

501 Not Implemented

表示服务器端不支持当前请求所需要的某个功能,当服务器无法识别请求的方法,且无法支持其对任何资源的请求

502 Bad Gateway

表示作为网关或代理服务器尝试执行请求时,从上游服务器接收到无效的响应,表示服务器端脚本解释器或代理端脚本语言端未启动或无响应,以及反向代理端无响应。

503 Service Unavailable

服务器暂时处于超负载或正在进行停机维护,现在无法处理请求,若事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。

504 Gateway Timeout

表示作为网关代理服务器尝试执行请求时,未能及时从上游服务器或者辅助服务器收到响应,即响应超时

505 HTTP Version Not Supported

表示服务器不支持或拒绝支持在请求中使用的HTTP版本

511 Network Authentication Required

表示客户端需要经过验证以获得网络连接许可

HTTP首部字段

使用首部字段是为了给浏览器和服务器提供报文主体大小使用的语言认证信息等内容,HTTP首部字段是由首部字段名字段值构成的,中间用冒号:分隔,对于重复的HTTP首部字段,在规范内尚未明确,不同的浏览器内部处理逻辑不同;字段值对应单个HTTP首部字段可有多个值

1
Keep-Alive: timeout=15, max=100

HTTP首部字段根据实际用途被分为以下4类型:

  • 通用首部字段:请求报文和响应报文两方都会使用的首部
  • 请求首部字段:从客户端向服务器端发送请求报文时使用的首部,补充了请求附加内容、客户端信息、响应内容相关优先级等信息
  • 响应首部字段:从服务器端向客户端返回响应报文时使用的首部,补充了响应附加内容,也会要求客户端附加额外的内容信息
  • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息

HTTP首部字段将定义成缓存代理非缓存代理的行为,分成2种类型:

  • 端到端首部:此类别中的首部会转发给请求响应对应最终接收目标,且必须保存在由缓存生成的响应中,且规定它必须被转发
  • 逐跳首部:此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发,HTTP/1.1和之后版本,若要使用逐跳首部需提供 Connection首部字段,只有以下8个字段属于逐跳首部:
    • Connection
    • Keep-Alive
    • Proxy-Authenticate
    • Proxy-Authorization
    • Trailer
    • TE
    • Transfer-Encoding
    • Upgrade

通用首部字段

请求报文和响应报文双方都会使用的首部

首部字段名 说明 备注
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理 逐跳首部
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览 逐跳首部
Transfer-Encoding 指定报文主体的传输编码方式 逐跳首部
Upgrade 升级为其他协议 逐跳首部
Via 代理服务器的相关信息
Warning 错误通知
Cache-Control

操作缓存的工作机制,多个指令之间通过逗号,分隔

1
Cache-Control: private, max-age=0, no-cache
缓存请求指令 参数 说明
no-cache 强制向源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age = [ 秒] 必需 响应的最大Age值
max-stale( = [ 秒]) 可省略 接收已过期的响应
min-fresh = [ 秒] 必需 期望在指定时间内的响应仍有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension - 新指令标记(token)
缓存响应指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再向源服务器进行确认
proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
max-age = [ 秒] 必需 响应的最大Age值
s-maxage = [ 秒] 必需 公共缓存服务器响应的最大Age值
cache-extension - 新指令标记(token)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 使用public指令时,明确表明其他用户也可利用缓存
Cache-Control: public
# 当指定private指令后,响应只以特定的用户作为对象,缓存服务器会对该特定用户提供资源缓存服务,对于其他用户发送的请求,代理服务器不会返回缓存
Cache-Control: private
# no-cache指令的目的是为了防止从缓存中返回过期的资源,客户端将不会接收缓存过的响应,缓存服务器必须把客户端请求转发
给源服务器,服务器返回响应中包含no-cache指令,则缓存服务器不能对资源进行缓存
# 不缓存过期资源
Cache-Control: no-cache
# 由服务器返回的响应中,若对no-cache字段名具体指定参数值,客户端在接收到该被指定参数值的首部字段对应的响应报文后不能使用缓存,无参数值的首部字段可使用缓存,且只能在响应指令中指定该参数
Cache-Control: no-cache=Location
# 暗示请求或响应中包含机密信息,该指令规定缓存不能在本地存储请求或响应的任一部分,真正的不进行缓存
Cache-Control: no-store
# 当客户端发送请求包含max-age指令时,若判定缓存资源的缓存时间数值比指定时间的数值更小,则客户端接收缓存的资源,当指定max-age值为0则缓存服务器通常需要将请求转发给源服务器
# 当服务器返回响应中包含max-age指令时,缓存服务器将不对资源的有效性再作确认,而max-age数值代表资源保存为缓存的最长时间
# HTTP/1.1在同时存在Expires首部字段时,会优先处理max-age指令,而忽略Expires首部字段,HTTP/1.0相反
Cache-Control: max-age=604800(单位 :秒)
# 和max-age指令相同,s-maxage指令只适用于供多位用户使用的公共缓存服务器,使用s-maxage指令后,则直接忽略对Expires首部字段及
max-age指令的处理
Cache-Control: s-maxage=604800(单位 :秒)
# 要求缓存服务器返回至少还未过指定时间的缓存资源,若min-fresh=60秒,则60秒后的资源无法作为响应返回
Cache-Control: min-fresh=60(单位 :秒)
# 指示缓存资源即使过期也照常接收,未指定参数值表示无论经过多久客户端都会接收响应,若指定了具体数值即使过期,只要仍处于max-stale指定时间内,仍旧会被客户端接收
Cache-Control: max-stale=3600(单位 :秒)
# 表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性
# 若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout
Cache-Control: only-if-cached
# 代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效,若代理无法连通源服务器再次获取有效资源,则缓存必须给客户端一条 504状态码,且会忽略请求max-stale指令
Cache-Control: must-revalidate
# 所有缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性
Cache-Control: proxy-revalidate
# 无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型,可防止缓存或代理压缩图片等类似操作
Cache-Control: no-transform
# 通过cache-extension标记(token),可扩展Cache-Control首部字段内的指令,若缓存服务器不能理解community这个新指令,则会直接忽略,extension tokens仅对能理解它的缓存服务器有意义
Cache-Control: private, community="UCI"
Connection

Connection首部字段具备:控制不再转发给代理的首部字段管理持久连接HTTP/1.1版本的默认连接都是持久连接

1
2
3
4
5
6
7
# 在客户端发送请求和服务器返回响应内,使用Connection首部字段,可控制不再转发给代理的首部字段
Connection: 不再转发的首部字段名
# HTTP/1.1版本的默认连接都是持久连接,当服务器端想明确断开连接时,则指定Connection首部字段的值为Close
Connection: close
# HTTP/1.1之前的HTTP版本的默认连接都是非持久连接,若旧版本HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive
# 服务端加上首部字段Keep-Alive及首部字段Connection后返回响应
Connection: Keep-Alive

Date

表明创建HTTP报文的日期和时间,HTTP/1.1协议使用在RFC1123中规定的日期时间的格式,之前的HTTP协议版本中使用在RFC850中定义的格式:

1
2
3
4
5
6
# HTTP/1.1
Date: Tue, 03 Jul 2012 04:40:59 GMT
# 之前的HTTP协议版本
Date: Tue, 03-Jul-12 04:40:59 GMT
# 还有一种格式,它与C标准库内的asctime()函数的输出格式一致
Date: Tue Jul 03 04:40:59 2012
Pragma

Pragma属于通用首部字段,只用在客户端发送的请求中,是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义客户端会要求所有的中间服务器不返回缓存的资源

所有中间服务器若都能以HTTP/1.1为基准,那直接采用Cache-Control: no-cache指定缓存的处理方式即可,但要整体掌握全部中间服务器使用的HTTP协议版本是不现实的,因此发送的请求会同时含有下面两个首部字段:

1
2
Cache-Control: no-cache
Pragma: no-cache
Trailer

事先说明在报文主体后记录了哪些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时,如下指定首部字段Trailer的值为Expires,在报文主体之后即分块长度0之后出现了首部字段Expires:

1
2
3
4
5
6
7
8
9
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Content-Type: text/html
...
Transfer-Encoding: chunked
Trailer: Expires
...(报文主体)...
0
Expires: Tue, 28 Sep 2004 23:59:59 GMT
Transfer-Encoding

规定了传输报文主体时采用的编码方式HTTP/1.1的传输编码方式仅对分块传输编码有效

Upgrade

用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可用来指定一个完全不同的通信协议,如下Connection的值被指定为Upgrade,则产生作用的Upgrade对象仅限于客户端和邻接服务器,使用Upgrade时还需额外指定Connection:Upgrade,对于附有Upgrade的请求,服务器可用101 Switching Protocols状态码作为响应返回:

1
2
3
GET /index.htm HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
Via

用于追踪客户端与服务器之间请求和响应报文的传输路径,报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发,还可避免请求回环,也可增加1个新的Via首部写入服务器信息,经常会和TRACE方法一起使用,代理服务器接收到由TRACE方法发送过来的请求,当Max-Forwards为0时,代理服务器会将自身的信息附加到Via首部后,返回该请求的响应。

Warning

HTTP/1.1的Warning首部是从HTTP/1.0的响应首部Retry-After演变过来的,该首部通常会告知用户一些与缓存相关的问题的警告,HTTP/1.1中定义了7种警告,且警告码具备扩展性

1
2
3
# 时间部分可省略
Warning: 113 gw.hackr.jp:8080 "Heuristic expiration" Tue, 03 Jul 2012 05:09:44 GMT
Warning: [警告码][警告的主机:端口号]"[警告内容]" ([日期时间])
警告码 警告内容 说明
110 Response is stale(响应已过期) 代理返回已过期的资源
111 Revalidation failed(再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
112 Disconnection operation(断开连接 操作) 代理与互联网连接被故意切断
113 Heuristic expiration(试探性过期) 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
199 Miscellaneous warning(杂项警告) 任意的警告内容
214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容

请求首部字段

客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息客户端信息对响应内容相关的优先级等内容

首部字段名 说明 备注
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与If-Match相反)
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息 逐跳首部
Range 实体的字节范围请求
Referer 对请求中URI的原始获取方
TE 传输编码的优先级 逐跳首部
User-Agent HTTP 客户端程序的信息
Accept

可通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。 可使用type/subtype这种形式,一次指定多种媒体类型,若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号;进行分隔,权重值q的范围是0~1,可精确到小数点后3默认权重为q=1.0

1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  • 文本文件:text/html、text/plain、text/css等、application/xhtml+xml、application/xml等
  • 图片文件:image/jpeg、image/gif、image/png等
  • 视频文件:video/mpeg、video/quicktime等
  • 应用程序使用的二进制文件:application/octet-stream、application/zip等
Accept-Charset

用来通知服务器用户代理支持的字符集及字符集的相对优先顺序可一次性指定多种字符集,可用权重q值来表示相对优先级,该首部字段应用于内容协商机制的服务器驱动协商。

1
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
Accept-Encoding

用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序可一次性指定多种内容编码,采用权重q值来表示相对优先级,也可使用星号*作为通配符,指定任意的编码格式

1
Accept-Encoding: gzip, deflate
  • gzip:由文件压缩程序gzipGNU zip生成的编码格式
  • compress:由UNIX文件压缩程序compress生成的编码格式
  • deflate:组合使用zlib格式及由deflate压缩算法生成的编码格式
  • identity不执行压缩不会变化的默认编码格式
Accept-Language

告知服务器用户代理能够处理自然语言集,指中文或英文等,以及自然语言集的相对优先级,可一次指定多种自然语言集,按权重值q表示相对优先级

1
Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
Authorization

告知服务器用户代理的认证信息(证书值),通常想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中

1
Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

Expect

客户端使用Expect首部字段来告知服务器,期望出现的某种特定行为,因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed,客户端可利用该首部字段,写明所期望的扩展

1
2
# 等待状态码100响应的客户端在发生请求时,需要指定
Expect: 100-continue
From

告知服务器使用用户代理的用户的电子邮件地址,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式,使用代理时,应尽可能包含From首部字段

Host

告知服务器请求的资源所处的互联网主机名和端口号,Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段,Host和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决,相同的IP地址下部署运行着多个域名,则服务器无法理解是哪个域名对应的请求。则需要使用首部字段Host来明确指出请求的主机名,若服务器未设定主机名,则直接发送一个空值即可:

1
Host:
If-Match

形如If-xxx这种样式的请求首部字段,都可称为条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时才会执行请求,告知服务器匹配资源所用的实体标记ETag值,此时服务器无法使用弱ETag,服务器会比对If-Match字段值和资源ETag值,仅当两者一致才会执行请求,否则返回状态码412 Precondition Failed,还可用星号*指定If-Match的字段值,此时服务器将会忽略ETag,只要资源存在就处理请求。

If-Modified-Since

用于确认代理或客户端拥有的本地资源的有效性,获取资源的更新日期时间,可通过确认首部字段Last-Modified来确定,在If-Modified-Since字段指定的日期时间后资源发生了更新,服务器会接受请求,告知服务器If-Modified-Since字段值早于资源的更新时间, 则希望能处理该请求,若在指定If-Modified-Since字段值的日期时间之后请求的资源都没有过更新,则返回状态码304 Not Modified

1
If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT
If-None-Match

与首部字段If-Match作用相反,用于指定If-None-Match字段值的实体标记ETag值与请求资源的ETag不一致时告知服务器处理该请求,在GET或HEAD方法中使用首部字段If-None-Match可获取最新的资源,这与使用首部字段If-Modified-Since时有些类似

If-Range

告知服务器若指定的If-Range字段值ETag值或者时间和请求资源的ETag值或时间一致时,则作为范围请求处理,反之则返回全体资源

If-Unmodified-Since

与首部字段If-Modified-Since的作用相反,告知服务器指定的请求资源只有在字段值内指定的日期时间之后未发生更新的情况下,才能处理请求,若在指定日期时间后发生了更新,则返回状态码412 Precondition Failed

1
If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT
Max-Forwards

通过TRACE方法或OPTIONS方 法,发送包含首部字段MaxForwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目,服务器在往下一个服务器转发请求之前Max-Forwards值减1后重新赋值,当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应

Proxy-Authorization

接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息,该行为与客户端和服务器之间HTTP访问认证类似

1
Proxy-Authorization: Basic dGlwOjkpNLAGfFY5
Range

只需获取部分资源的范围请求,告知服务器资源的指定范围,接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content,无法处理该范围请求时,则会返回状态码200 OK全部资源

1
Range: bytes=5001-10000
Referer

告知服务器请求的原始资源的URI,客户端一般都会发送Referer首部字段给服务器,但当直接在浏览器地址栏输入URI或出于安全性的考虑时,也可不发送该首部字段,因为原始资源的URI中查询字符串可能含有ID和密码等保密信息,写进Referer转发给其他服务器,可能导致保密信息泄露。

1
Referer: http://www.hackr.jp/index.htm
TE

告知服务器客户端能够处理响应的传输编码方式及相对优先级,与首部字段Accept-Encoding功能相似,但用于传输编码,还可指定伴随trailer字段的分块传输编码的方式,应用后者时只需把trailers赋值给该字段值

1
2
TE: gzip, deflate;q=0.5
TE: trailers
User-Agent

将创建请求的浏览器用户代理名称等信息传达给服务器

1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1

响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息服务器信息,以及对客户端的附加要求等信息

首部字段名 说明 备注
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息 逐跳首部
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
Accept-Ranges

告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源

1
2
3
4
# 不能处理范围请求时
Accept-Ranges: none
# 能处理范围请求时
Accept-Ranges: bytes
Age

告知客户端源服务器在多久前创建了响应,若创建该响应的服务器是缓存服务器,则Age值是指缓存后的响应再次发起认证到认证完成的时间值,代理创建响应时必须加上首部字段Age

1
2
# 单位为秒
Age: 600
ETag

告知客户端实体标识,它是一种可将资源以字符串形式做唯一性标识的方式,服务器会为每份资源分配对应的ETag值,当资源更新时ETag值也需要更新,生成ETag值时并没有统一算法规则,而仅仅是由服务器来分配

1
2
ETag: "82e22293907ce725faf67773957acd12"
ETag: W/"usagi-1234"

资源被缓存时,就会被分配唯一标识,对于同一URI资源中文版和英文版对应资源是不同的,但两者的URI相同仅凭URI指定缓存资源相当困难,若下载过程中出现连接中断、再连接的情况,都会依照ETag值来指定资源,且ETag值有强弱之分ETag不论实体发生多么细微的变化都会改变其值,ETag只用于提示资源是否相同,只有资源发生了根本改变,产生差异时才会改变ETag值,此时会在字段值最开始处附加W/

Location

将响应接收方引导至某个与请求URI位置不同的资源,该字段会配合3xx:Redirection响应提供重定向URI,几乎所有浏览器在接收到包含Location首部字段的响应后,都会强制性地尝试对已提示的重定向资源的访问

Proxy-Authenticate

把由代理服务器所要求的认证信息发送给客户端,与客户端和服务器之间的HTTP访问认证行为相似,不同之处在于其认证行为是在客户端与代理之间进行的,客户端与服务器之间进行认证时,首部字段WWW-Authorization有着相同的作用

1
Proxy-Authenticate: Basic realm="Usagidesign Auth"
Retry-After

告知客户端应该在多久之后再次发送请求,主要配合状态码503 Service Unavailable3xx Redirect响应一起使用

1
2
3
4
# 120秒后再发起请求
Retry-After: 120
# 指定为具体的日期时间
Retry-After: Wed,04 Jul 2022 06:34:24 GMT
Server

告知客户端当前服务器上安装的HTTP服务器应用程序的信息,还有可能包括版本号和安装时启用的可选项

1
Server: Apache/2.2.17 (Unix)
Vary

可对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令,从代理服务器接收到源服务器返回包含Vary指定项的响应后,若再要进行缓存,仅对请求中含有相同Vary指定首部字段的请求返回缓存,即使对相同资源发起请求,但由于Vary指定的首部字段不相同,也必须要从源服务器重新获取资源

1
Vary: Accept-Language

WWW-Authenticate

用于HTTP访问认证,告知客户端适用于访问请求URI所指定资源的认证方案如BasicDigest、带参数提示的质询challenge等,状态码401 Unauthorized响应中肯定带有首部字段WWW-Authenticate

1
2
# realm字段的字符串是为了辨别请求URI指定资源所受到的保护策略
WWW-Authenticate: Basic realm="Usagidesign Auth"

实体首部字段

包含在请求报文响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息

首部字段名 说明 备注
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位 :字节)
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间
Allow

用于通知客户端能够支持Request-URI指定资源的所有HTTP方法,当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回,同时把所有能支持的HTTP方法写入首部字段Allow后返回

Content-Encoding

告知客户端服务器对实体的主体部分选用的内容编码方式,指在不丢失实体信息的前提下所进行的压缩,支持的四种编码方式:gzipcompressdeflateidentity

1
Content-Encoding: gzip
Content-Language

告知客户端实体主体使用的自然语言,如中文、英语等

1
Content-Language: zh-CN
Content-Length

表明实体主体部分的大小,单位是字节,对实体主体进行内容编码传输时不能再使用Content-Length首部字段,因为实体主体大小的计算方法略微复杂

1
Content-Length: 15000
Content-Location

给出与报文主体部分相对应的URI,和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI,如使用Accept-Language的服务器驱动型请求,当返回的页面内容与实际请求的对象不同时,首部字段Content-Location内会写明URI

1
Content-Location: http://www.hackr.jp/index-ja.html
Content-MD5

客户端会对接收的报文主体执行相同的MD5算法,然后与首部字段Content-MD5的字段值比较,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。

1
2
# 对报文主体执行MD5算法获得的128位二进制数,再通过Base64编码后将结果写入Content-MD5字段值
Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
Content-Range

针对范围请求返回响应时使用的首部字段Content-Range告知客户端作为响应返回的实体的哪个部分符合范围请求,单位字节,表示当前发送部分及整个实体大小

1
Content-Range: bytes 5001-10000/10000
Content-Type

说明实体主体内对象的媒体类型,和首部字段Accept一样,字段值用type/subtype形式赋值,charset使用iso-8859-1或euc-jp等字符集进行赋值

1
Content-Type: text/html; charset=UTF-8
Expires

将资源失效的日期告知客户端,Expires字段值指定的时间之前,响应的副本会一直被缓存服务器保存,当超过指定时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。源服务器不希望缓存服务器对资源缓存时,最好在Expires字段内写入与首部字段Date相同的时间值,当首部字段Cache-Control有指定max-age指令时,会优先处理max-age指令

1
Expires: Wed, 04 Jul 2012 08:26:05 GMT
Last-Modified

指明资源最终修改的时间,一般该值是Request-URI指定资源被修改的时间,但类似使用CGI脚本进行动态数据处理时,该值可能会变成数据最终修改时的时间

1
Last-Modified: Wed, 23 May 2012 09:59:55 GMT
Cookie首部字段

Cookie的工作机制是用户识别及状态管理,Web 网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内,当用户访问该Web网站时,可通过通信方式取回之前发放的Cookie,调用Cookie时,可校验Cookie的有效期、发送方的域、路径、协议等信息

首部字段名 说明 首部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应首部字段
Cookie 服务器接收到的Cookie信息 请求首部字段

当服务器准备开始管理客户端的状态时,会事先告知各种信息,一旦Cookie从服务器端发送至客户端,服务器端就不存在可显式删除Cookie的方法,但可通过覆盖已过期Cookie实现对客户端Cookie的实质性删除操作

1
2
3
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;
Set-Cookie: name=value; secure
Set-Cookie: name=value; HttpOnly
属性 说明 备注
NAME=VALUE 赋予Cookie的名称和其值(必需项)
expires=DATE Cookie的有效期(若不明确指定则默认为浏览器关闭前为止 浏览器可发送Cookie的有效期
path=PATH 服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录 用于限制指定Cookie发送范围的文件目录
domain=域名 作为Cookie适用对象的域名 (若不指定则默认为创建Cookie的服务器的域名 不指定domain属性显得更安全
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问 为防止跨站脚本攻击对Cookie信息窃取

告知服务器当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie,接收到多个Cookie时,同样可以多个Cookie形式发送

1
Cookie: status=enable

其他首部字段

X-Frame-Options

属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题,其主要目的是为了防止点击劫持clickjacking攻击

1
2
3
4
# DENY:拒绝
X-Frame-Options: DENY
# SAMEORIGIN:仅同源域名下的页面匹配时许可
X-Frame-Options: SAMEORIGIN
X-XSS-Protection

属于HTTP响应首部,针对跨站脚本攻击XSS的一种对策,用于控制浏览器XSS防护机制的开关

1
2
3
# 0:将XSS过滤设置成无效状态
# 1:将XSS过滤设置成有效状态
X-XSS-Protection: 1
DNT

属于HTTP请求首部,拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法

1
2
# 0:同意被追踪;1:拒绝被追踪
DNT: 1
P3P

属于HTTP响应首部,通过利用P3P在线隐私偏好平台技术,让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私目的

1
P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"