用于HTTP协议交互的信息被称为HTTP报文。请求端的报文叫做请求报文,响应端的报文叫做响应报文。HTTP报文是由多行(用CR + LF作换行符)数据构成的字符串文本。
[CR + LF]: CR(Carriage return),回车符, 16进制0x0d。LF(Line Feed),换行符0x0a.
请求报文及响应报文结构


HTTP报文首部
请求行:请求方法 + 请求URI + HTTP版本状态行: HTTP版本 + 状态码(200) + 原因短语(OK)首部字段: 分为 请求首部字段、响应首部字段、通用首部字段,实体首部字段,还有其他没被记录在RFC的Cookie等。- 通用首部字段
Cache-Control: 控制缓存的行为Connection: 决定当前的事务完成后,是否会关闭网络连接。- 如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。HTTP/1.1默认为持久连接
- 如果该值为"close",表明客户端或服务器想要关闭该网络连接,这是HTTP/1.0请求的默认值
Date: 创建报文的日期时间Pragma: 它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,那时候 HTTP/1.1 协议中的 Cache-Control 还没有出来。设置值为“no-cache”时,与 Cache-Control: no-cache 效果一致。强制要求缓存服务器在返回缓存的版本之前将请求提交到源头服务器进行验证。建议只在需要兼容 HTTP/1.0 客户端的场合下应用 Pragma 首部。Transfer-Encoding: 传输报文主体时所采用的编码方式Via: 代理如武器信息Warning: 报文当前状态可能存在的问题。在响应中可以出现多个 Warning 首部。
- 请求首部字段
Accept: 用户代理可处理的媒体类型。例如:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, 其中;q=(q因子权重)Accept-Charset: 优先的字符集Accept-Encoding: 优先的编码Accept-Language: 优先的语言(自然语言)Authorization: Web认证信息Expect: 期待服务器的特定行为,例如:100-continue。目前没有已知的浏览器使用这个消息头From: 用户的电子邮件地址。比如用户过量的不合法的请求等。站点联系人会联系到你。Host: 请求资源所在的服务器If-Match: 比较实体标记(ETag)If-None-Match: 比较实体标记(与If-Match相反)If-Modified-Since: 比较资源的更新时间If-Unmodified-Since: 比较资源的更新时间(与If-Modified-Since相反)If-Range: 资源未更新时发送实体Byte的范围请求Range: 实体的字节范围请求Referer: 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。TE: 传输编码的优先级User-Agent: HTTP客户端程序的信息
- 响应首部字段
Etag: 实体标签(Entity Tag)的缩写。ETag一般不以明文形式相应给客户端。在资源的各个生命周期中,它都具有不同的值,用于标识出资源的状态。当资源发生变更时,如果其头信息中一个或者多个发生变化,或者消息实体发生变化,那么ETag也随之发生变化。生成规则由服务端确认。ETag之间的比较使用的是强比较算法,即只有在每一个字节都相同的情况下,才可以认为两个文件是相同的。在 ETag 前面添加 W/ 前缀表示可以采用相对宽松的算法。 值代表优先顺序,用相对质量价值表示,又称作权重。Trailer: 报文末端的首部一览Age: 消息头里包含消息对象在缓存代理中存贮的时长,以秒为单位。Server: HTTP服务器的安装信息。例如:TornadoServer/5.1.1Location: 令客户端重定向至指定URIVary: 代理服务器缓存的管理信息WWW-Authenticate: HTTP访问认证Accept-Ranges: 是否接受字节范围的要求Proxy-Authenticate: 代理服务器对客户端的认证信息Retry-After: 对再次发起请求时机的要求
- 实体首部字段
Allow: 用于枚举资源所支持的 HTTP 方法的集合。当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为相应返回。以此同时,还会把所有支持的HTTP方法写入首部字段Allow后返回。Content-Encoding: 是一个实体消息首部,用于对特定媒体类型的数据进行压缩。当这个首部出现的时候,它的值表示消息主体进行了何种方式的内容编码转换。这个消息首部用来告知客户端应该怎样解码才能获取在 Content-Type 中标示的媒体类型内容。例如Content-Encoding: gzipContent-Language: 实体主体使用的自然语言Content-Length: 实体主体部分的大小(单位是字节)。对实体主体进行编码传输时,不能再使用这个首部字段。由于实体主题大小的计算略微复杂,所以不再展开。Content-Location: 要返回的数据的地址选项。最主要的用途是用来指定要访问的资源经过内容协商后的结果的URL。Content-Type: 实体主体内对象媒体类型Last_Modified: 是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。 它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 ETag 要低,所以这是一个备用机制。包含有 If-Modified-Since 或 If-Unmodified-Since 首部的条件请求会使用这个字段。Expires: 响应头包含日期/时间, 即在此时候之后,响应过期。无效的日期,比如 0, 代表着过去的日期,即该资源已经过期
- 通用首部字段