该系列博客是记录自己的学习笔记,若有错误请大佬们指出
狗头声明,本文适用于:新手学习进步,老鸟回顾消遣
该系列以《图解HTTP》为基本路线,该书有11章节,所以本系列也决定编写11篇水文技术博客进行适当的拓展和补充,希望可以帮助大家。
HTTP 协议的核心部分就是它传输的报文内容;但是一下子把所有的字段都堆在这里就很没用,所以本章先学习报文的结构和一些简单的字段,其他功能的字段分散在其他篇章分别详解。
HTTP 报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
大致可分为报文首部和报文主体两块。通常,并不一定要有报文主体,但是一定要有首部。
报文示例:
可知:头部字段都是key: value形式,更详细地说明报文,用来各种处理说明。实体则是实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
HTTP报文的构成
HTTP 协议的请求报文和响应报文的结构基本相同,组成如下:
- header,“请求头(
请求头=请求行+请求头部字段)”或“响应头(响应头=状态行+响应头部字段)” - 空行,隔开报文的头部与实体
- body,消息正文,又称为“实体”。
头部字段注意点:
- 字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
- 字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。
- 字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
- 字段的顺序是没有意义的,可以任意排列不影响语义;
- 字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。
头部字段
HTTP 协议的头部字段分为四大类:
- 通用字段:在请求头和响应头里都可以出现;
- 请求字段:仅能出现在请求头里
- 响应字段:仅能出现在响应头里
- 实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。
这几个概念后续学习其他头部字段的时候都会说明。
在本章了解几个常用的简单头部字段
常用的一些简单头部字段
1、Host
属于请求字段,只能出现在请求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段,也就是说,如果请求头里没有 Host,那这就是一个错误的报文。
Host 字段告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用 Host 字段来选择,否则服务器就会找不到合适的虚拟主机,无法处理。
《图解HTTP》的讲解这个字段放在了第五章的第一节,我觉得整理到这里作为补充更合适:
2、User-Agent
是请求字段,只出现在请求头里。
它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。
但由于历史的原因,User-Agent 非常混乱,每个浏览器都自称是“Mozilla”“Chrome”“Safari”,互相“伪装”,导致 User-Agent 变得越来越长,最终变得毫无意义。不过有新手爬虫会在 User-Agent 里用“spider”标明自己是爬虫,所以可以利用这个字段实现简单的反爬虫策略。
3、Date
通用字段,但通常出现在响应头里,表示 HTTP 报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略。
4、Server
响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号
Server 字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑客就有可能利用 bug 攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息。
比如 GitHub,它的 Server 字段里就看不出是使用了 Apache 还是 Nginx,只是显示为“GitHub.com”。
5、Content-Length
实体字段,它表示报文里 body 的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定长的,需要使用 chunked 方式分段传输。
其他的头部字段是为了缓存、代理等等相关,并不是简单能说明清楚;后续由专门的篇章,会详解相关的头部字段。