HTTP报文

HTTP报文

HTTP虽然被称为超文本传输协议,但其本质上不管“传输”,将其交给TCP来做,而是在HTTP报文中定义一些列格式并规定了组成部分,解析规则以及处理策略,在TCP/IP层之上实现了更为灵活丰富的功能如:连接控制,缓存控制,数据编码,内容协商...总而言之,其精华部分在于报文内容

报文结构

HTTP协议请求报文和响应报文结构基本相同,由三大部分组成:

  • start line 起始行 : 描述请求和响应的基本信息;

  • header 头部字段集合 : 使用key-value 的形势更加详细地说明报文;

  • entity 消息正文 : 实际传输的数据,它不一定是纯文本,可以是图片,视频等二进制数据

Tips :可以没有entity 但必须有header 和 start line

大体结构如下:

HTTP报文结构.png

抓包详情:

详细结构

start line

请求报文中的请求行:

  • 请求方法: 是一个动词 ,如GET/POST 表示对资源的操作;

  • 请求目标: 通常是一个 URI ,标记了请求方法要操作的资源;

  • 版本号: 表示报文使用的HTTP协议版本。

如下图:

HTTP报文请求行.png

三个部分用空格分隔,末尾CRLF换行表示结束。

响应报文中的状态行:

  • 版本号: 表示报文使用的HTTP协议版本;

  • 状态码: 一个三位数字,表示处理结果,如200成功;

  • 原因: 作为状态码的补充,是更加详细的解释文字,帮助人理解原因。

如下图:

HTTP报文状态行.png

请求行或状态行加上头部字段就构成了HTTP报文的请求头和响应头。结构如下图所示:

请求头:

HTTP请求头部.png

响应头:

HTTP响应头部.png

头部字段都是以key-value的形式表达,key与value之间用':' 分隔 ,用CRLF换行表示字段结束。

头部字段非常灵活,不仅可以使用标准里面的Host,Connection等已有的键,我们还可以自定义key-value,给HTTP协议带来了无限的扩展可能。

但有以下几点需要注意:

  • 字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;

  • 字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正确的字段名;

  • 字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;

  • 字段的顺序是没有意义的,可以任意排列不影响语义;

  • 字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。

常用头字段

HTTP 协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:

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

先来介绍一些基础的头字段:

  • Host : 它属于请求字段,只能出现在请求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段,也就是说,如果请求头里没有 Host,那这就是一个错误的报文。Host 字段告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用 Host 字段来选择,有点像是一个简单的“路由重定向”

  • User-Agent : 只出现在请求头里。它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。

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

  • Server : 是响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号,例如在我们的实验环境里它就是“Server: openresty/1.15.8.1”,即使用的是 OpenResty 1.15.8.1。

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

Tips :

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

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

posted @   WHelegiac  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示