# HTTP 报文格式

我们知道，TCP 报文会在要实际传输的数据前附加一个 20 字节的头部数据，用来存储 TCP 协议必需的额外信息。类似地，HTTP 协议也会在要实际传输的数据前附加一些头数据，不过它的头数据都是 ASCII 码的文本，不用借助解析器就能看懂，因为 HTTP 是一个纯文本的协议。

HTTP 协议的核心，就是它传输的报文内容。HTTP 协议的规范文档详细地定义了报文的格式，规定了组成部分、解析规则、处理策略。因此，它可以在 TCP/IP 层之上实现更灵活更丰富的功能，比如连接控制，缓存管理、数据编码、内容协商等。

HTTP 协议规定，报文必须有 header，但可以没有 body，且在 header 之后必须要有一个“空行”。

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FXjz76aggo7V4L9irZZhv%2Fimage.png?alt=media\&token=1820ab90-0ec6-4e08-acd7-c7ca7152a02d)![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FQooJczidIQGpjNmBBP7Z%2Fimage.png?alt=media\&token=0ffae912-bbae-4a79-86a6-f2d52c52ab93)

<table><thead><tr><th width="131">组成部分</th><th>说明</th></tr></thead><tbody><tr><td>start line <mark style="color:red;">*</mark></td><td>描述请求或响应的基本信息</td></tr><tr><td>header <mark style="color:red;">*</mark></td><td>使用 key-value 形式详细地说明报文</td></tr><tr><td>空行 <mark style="color:red;">*</mark></td><td><code>CRLF</code>，十六进制的 <code>0D0A</code></td></tr><tr><td>entity body</td><td>实际传输的数据<br>可以是纯文本，也可以是图片、视频等二进制数据</td></tr></tbody></table>

* 在请求报文里，start line 叫 request line（请求行）
* 在响应报文里，start line 叫 status line（状态行）
