[详解《图解HTTP》+ 拓展] 第三章:HTTP报文中的HTTP信息结构

147 阅读4分钟

该系列博客是记录自己的学习笔记,若有错误请大佬们指出

狗头声明,本文适用于:新手学习进步,老鸟回顾消遣
该系列以《图解HTTP》为基本路线,该书有11章节,所以本系列也决定编写11篇水文技术博客进行适当的拓展和补充,希望可以帮助大家。

HTTP 协议的核心部分就是它传输的报文内容;但是一下子把所有的字段都堆在这里就很没用,所以本章先学习报文的结构和一些简单的字段,其他功能的字段分散在其他篇章分别详解。

HTTP 报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
大致可分为报文首部和报文主体两块。通常,并不一定要有报文主体,但是一定要有首部

image.png 报文示例:

image.png

可知:头部字段都是key: value形式,更详细地说明报文,用来各种处理说明。实体则是实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。


HTTP报文的构成

HTTP 协议的请求报文和响应报文的结构基本相同,组成如下:

  • header,“请求头(请求头=请求行+请求头部字段)”或“响应头(响应头=状态行+响应头部字段)”
  • 空行,隔开报文的头部与实体
  • body,消息正文,又称为“实体”。

头部字段注意点:

  • 字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
  • 字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。
  • 字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
  • 字段的顺序是没有意义的,可以任意排列不影响语义;
  • 字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。

头部字段

HTTP 协议的头部字段分为四大类:

  • 通用字段:在请求头和响应头里都可以出现;
  • 请求字段:仅能出现在请求头里
  • 响应字段:仅能出现在响应头里
  • 实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。

这几个概念后续学习其他头部字段的时候都会说明。

在本章了解几个常用的简单头部字段

常用的一些简单头部字段

1、Host

属于请求字段,只能出现在请求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段,也就是说,如果请求头里没有 Host,那这就是一个错误的报文。

Host 字段告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用 Host 字段来选择,否则服务器就会找不到合适的虚拟主机,无法处理。

《图解HTTP》的讲解这个字段放在了第五章的第一节,我觉得整理到这里作为补充更合适:

image.png

image.png

image.png

image.png

2、User-Agent

请求字段,只出现在请求头里。

它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。

但由于历史的原因,User-Agent 非常混乱,每个浏览器都自称是“Mozilla”“Chrome”“Safari”,互相“伪装”,导致 User-Agent 变得越来越长,最终变得毫无意义。不过有新手爬虫会在 User-Agent 里用“spider”标明自己是爬虫,所以可以利用这个字段实现简单的反爬虫策略。

3、Date

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

4、Server

响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号

image.png

image.png

Server 字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑客就有可能利用 bug 攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息。

比如 GitHub,它的 Server 字段里就看不出是使用了 Apache 还是 Nginx,只是显示为“GitHub.com”。

image.png

5、Content-Length

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

其他的头部字段是为了缓存、代理等等相关,并不是简单能说明清楚;后续由专门的篇章,会详解相关的头部字段。