HTTP的请求和响应

HTTP 协议的请求报文和响应报文的结构基本相同:

  1. 起始行(start line)
  2. 头部字段集合(header)
  3. 空行
  4. 消息正文(entity)

其中,前两部分又经常被合称为:请求头 或者 响应头

报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”

下图来源于网络
HTTP的请求和响应

HTTP的请求和响应

浏览器发送 GET 请求的时候,HTTP 报文经常是只有 header 而没 body

请求行:请求中的起始行
HTTP的请求和响应

状态行:响应中的起始行
HTTP的请求和响应

头部字段集合:
key-value的形式

常用头字段,主要分四类:
1.通用字段:请求头和响应头都有
2.请求字段:仅出现在请求头里
3.响应字段:仅出现在响应头里
4.实体字段:属于通用字段,但专门描述body的额外信息

Host:请求字段,必须要有,尤其是一台计算机上托管了多个虚拟主机的时候,比如127.0.0.1上托管了”www.bai.com“, "www.hei.com", "www.huang.com" 三个网站,必须要指定请求由哪个主机处理

User-Agent:请求字段,用来描述发起请求的客户端,比如是Chrome、Mozilla、Safari,或者是spider

Date:通用字段,但通常出现在响应头里,表示 HTTP 报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略

Server:响应字段,它告诉客户端当前正在提供 Web 服务的软件名称和版本号,例如“Server: openresty/1.15.8.1”。但是出于安全考虑,一般不会给出具体的,比如“GitHub.com”。

HTTP的请求和响应

Content-Length:实体字段,表示报文里 body 的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定长的,需要使用 chunked 方式分段传输。