HTTP头部

HTTP请求头由哪些部分构成,它们的作用分别是什么?

在设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。HTTP 协议传输的消息也是这样规定的,每一个 HTTP 包都分为 HTTP 头和 HTTP 体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的 HTML 代码就是 HTTP 的消息体,那么消息头可以通过浏览器的开发工具(F12)或者插件可以看到。

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:

  • 请求报文:客户端向服务器发送的请求报文。
  • 响应报文:从服务器到客户的回答。

一个HTTP请求头由请求行(request line)、请求头部(header)2个部分组成,下图给出了请求报文的一般格式。

img

我们从一个常见的HTTP请求开始吧,比如我们访问 leetcode-cn.com 的时候,浏览器发出的 HTTP 请求头部是:

1
2
3
4
5
Host: leetcode-cn.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3835.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br

这一切在你输入完网址并按下 Enter 之后浏览器会替你发送给 leetcode-cn.com的服务器,我们分别来看看这些字段代表了什么。

request_response

img

HTTP 返回头

HTTP 返回头也由两个部分组成,分别是:状态行消息报头,如下图:

img

在发出了之前的请求报文之后,leetcode-cn.com 的服务器就会进行返回,其中部分 HTTP 头部信息可能如下:

1
2
3
4
5
HTTP/2.0 200 OK
date: Sat, 12 Oct 2019 12:47:09 GMT
content-type: text/html; charset=utf-8
server: nginx/1.15.8
content-encoding: br

对于其中的字段来说,可以整理为以下表格:

img

另外,第一行中的 200 OK 也就是大家所熟悉的 HTTP 状态码了,常见的状态码分类有:

img

其中,面试时常被问到的特定状态码有:

  • 404 Not Found:服务器无法根据客户端的请求找到资源(网页)。
  • 304 Not Modified:未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。
  • 502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应,一般来说是后端服务器挂掉时前端网页服务器进行的返回。
  • 500 Internal Server Error:服务器内部错误,无法完成请求。

参考文献

[1]https://mp.weixin.qq.com/s/Mcbfg1uLwk7pUo8tE48VGA