报文
HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,描述报文的内容及含义,后面跟着可选的数据部分
组成
HTTP报文是简单的格式化数据块,没个报文都包含一条来自客户端的请求或者一条来自服务器的响应,由3个部分组成
- 对报文进行描述的起始行 —— start line
- 包含属性的首部块 —— header
- 可选的包含数据的主体部分 —— body
HTTP/1.0 200 OK
content-type: text/plain
content-length: 19
Hi, I'm a message
起始行和首部就是由行分隔的ASCII文本,主题是一个可选的数据块,可能是文本、二进制或者空
语法
HTTP报文分为两类
请求报文:
向web服务器请求一个动作
<method><request-URL><version>
<headers>
<entity-body>
响应报文
讲请求结果返回给客户端
<version><status><reason-phrase>
<headers>
<entity-body>
首部和方法配合,共同决定了服务器和客户端能做什么
通用首部
客户端和服务器都可以实用的就是通用首部
| 首部 | 描述 |
|---|---|
| Connection | 客户端和服务器是否保持连接 |
| Date | 日期,报文创建时间 |
| Update | 给出了发送端可能想要升级使用新版本或协议 |
| Via | 显示了报文经过的中间节点(代理、网关) |
| Trailer | 如果报文采用分块传输编码方式,可以利用这个首部列出位于报文trailer部分的首部集合 |
| Trailer-Encoding | 告诉接收端对报文采用什么编码格式 |
| Cache-Control | 随报文传送缓存指示 |
| Pragma | 早期的随报文传送指示方式 |
请求首部
| 首部 | 描述 |
|---|---|
| Client-IP | 客户端IP |
| From | 客户端邮件地址 |
| Host | 接收请求的服务器的主机名和端口号 |
| Referer | 提供了包含当前请求URI的文档的URL,告诉服务器自己来源 |
| User—Agent | 发起请求的客户端应用程序 |
| Accept | 告诉服务器能够发送那些媒体类型 |
| Accept-Charset | 告诉服务器能够发送那些字符集 |
| Accept-Encoding | 告诉服务器能够发送那些编码 |
| Accept-Language | 告诉服务器能够发送那些语言 |
| Expect | 允许客户端列出请求所要求的服务器行为 |
| If-Match | 如果ETag和文档当前ETag匹配,就获取文档 |
| If-Modified-Since | 除非在某个指定日期之后修改过,否则限制这个请求 |
| If-None-Match | 如果ETag和当前文档ETag不符合,获取资源 |
| If-Range | 允许对文档否个范围内的条件请求 |
| If-Unmodified-Since | 在某个指定日期之后没有修改过,否则现在请求 |
| Cookie | 客户端字符串 |
响应首部
| 首部 | 描述 |
|---|---|
| Age | 响应持续时间 |
| Server | 服务器应用软件名称和版本 |
| Allow | 列出了可用的请求方法 |
| Location | 告诉客户端实在在哪里,用于定向 |
| Content-Base | 解析主体中相对URL的基础URL |
| Content-Encoding | 主体编码格式 |
| Content-Language | 解析主体时适用的语言 |
| Content-Length | 主体的长度或尺寸 |
| Content-Location | 资源实际位置 |
| Content-MD5 | 主体的MD5校验和 |
| Content-Range | 在整个资源中此实体部分的字节范围 |
| Content-Type | 主体的MIME |
| ETag | 主体的实体标记 |
| Expires | 过期时间 |
| Last-Modified | 实体最后一次修改时间 |