7 HTTP 的报文

1 报文结构

TCP的报文

  • TCP头部数据:20字节,发送方的端口号、接收方的端口号、包序号、标志位。
  • 实际传输的数据:通常大小是 1460 字节

HTTP协议的报文

起始行+头部字段集合+消息正文

  1. 起始行(strat line):描述请求或响应的基本信息
  2. 头部字段集合(header):使用 key-value 形式更详细地说明报文,前面这两部分合称请求头响应头
  3. 消息正文(entity):实际传输的数据,二进制数据,也叫实体body

报文必须有 header,但是可以没有body(如 get 请求报文),在 header 之后必须要有一个“空行”,即“CRLF”,十六进制的“0D0A”。
各个web服务器都不允许过大的请求头,因为头部太大会占用太多服务器资源,影响运行效率。

2 请求行:request line

请求方法+请求目标+版本号,空格隔开,CRLF 换行结束。

  1. 请求方法:是一个动词,如 get/post ,表示对资源的操作
  2. 请求目标:通常是一个 URI,标记了 请求方法要操作的资源
  3. 版本号:表示报文使用的HTTP协议版本

3 状态行:status line

版本号+状态码+原因

  1. 版本号:表示报文使用的 HTTP 协议版本
  2. 状态码:三位数,如 200 是成功,500 是服务器错误
  3. 原因:作为数字状态码补充,是更为详细的解释文字,帮助人理解原因
  4. 以上三部分空格分隔,CRLF 换行结束
    image

4 头部字段

  1. 请求行或状态行再加上头部字段集合就构成了 HTTP 报文里完整的请求头 或 响应头。
  2. 头部字段 是 key-value 的形式,key和value之间用 “:” 分隔,最后用 CRLF 换行表示字段结束
  3. HTTP 头部支持自定义
    image
    image

使用头字段的注意点:

  1. 字段名 不区分大小写
  2. 字段名 不允许出现空格
  3. 字段名后面必须紧接着 “:”,不能有空格,而 “:” 后的字段值前可以有多个空格
  4. 字段的顺序是没有意义的,可以任意排列不影响语义
  5. 字段原则上不能重复,除非这个字段本身的语义允许

5 常用头字段

种类很多,基本分为 四大类:

  1. 通用字段:在请求头和响应头里都可以出现
  2. 请求字段:只能出现在请求头里,补充说明请求信息或额外条件
  3. 响应字段:仅能出现在响应头里,补充说明响应报文的信息
  4. 实体字段:实际上属于通用字段,但是专门描述 body 的额外信息。

对报文的解析实际上就是对头字段的处理。

基本的头信息

1. Host 字段(必须)

  1. 请求字段,只能出现在请求头。
  2. 唯一一个 HTTP/1.1 规范里要求必须出现的字段,如果没有就是一个错误报文。
  3. Host 字段告诉请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机,服务端就需要用 Host 字段来选择。
  4. Host 字段可以区分IP相同但是域名不同的网站。

2. Uesr-Agent

  1. 请求字段,只能出现在请求头。
  2. 使用一个字符串来描述发起HTTP请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。
  3. 实际上每个浏览器自称 “chrome”,“Mozilla” 等,是这个字段越来越长却毫无意义。

3. Date 字段

  1. 通用字段,通常出现在响应头里。
  2. 表示HTTP 报文的创建时间。
  3. 和其他字段搭配绝对缓存策略。

4. Server 字段

  1. 响应字段,只能出现在响应头里。
  2. 告诉客户端当前正在提供Web服务的软件名称和版本号。
  3. 非必须,容易暴露信息给外界被黑客攻击。
  4. 一般会给出一个无关紧要的描述信息。

基本的实体字段

1. Content-length

  1. 表示报文里body的字段长度,也就是请求头或响应头空行后数据的长度。
  2. 服务器看到这个字段就知道后续有多少数据,可以直接接受。
  3. 没有这个字段,表示 body 是不定长的,需要使用 chunked 方式分段传输。
原文地址:https://www.cnblogs.com/hqq2019-10/p/14723678.html