前言
在进行 Web 开发的过程中,HTTP 协议是我们必须要理解且至关重要的内容。
Web 是指万维网(World Wide Web)的简称,它是一个全球范围的互联网信息系统,由许多通过超文本链接相互关联的网页组成。通过万维网,用户可以通过网页浏览器访问和浏览各种信息资源,如文本、图片、音频、视频等。
本文将从 HTTP 协议的基础知识出发,帮助读者更好地理解相关内容。
HTTP 是什么
HTTP 是一种用于在万维网 WWW 上进行通信的应用层协议,全称为超文本传输协议(Hypertext Transfer Protocol),从这一名字中我们就可以解释其基本概念:
- 超文本(Hypertext):超文本是一种非线性的、非顺序的文本形式,通过超链接将不同的文本片段之间相关联。在 HTTP 中,超文本主要指的是网页上的文本内容,可以包括文字、图片、视频等多种媒体形式。
- 传输(Transfer):传输指的是在万维网中进行超文本数据传输。它基于客户端-服务器模型,可以将页面(HTML)从服务器传输到客户端(通常是浏览器),或者将浏览器发送的请求传输到服务器。
- 协议(Protocol):协议是指在通信过程中所遵循的规则和约定。HTTP 协议定义了客户端(通常是浏览器)和 Web 服务器之间通信的规范,包括请求和响应的格式、请求方法、状态码、头部信息等。
综上,HTTP 协议是一种用于在万维网上进行通信的应用层协议,通过传输超文本数据来实现浏览器和服务器之间的通信。
HTTP 的报文结构
HTTP报文分为请求报文和响应报文两种类型,其结构如下:
-
请求报文结构:
- 请求行:包括请求方法、请求目标URL和HTTP协议版本。
- 请求头:包括若干个字段,每个字段由字段名和字段值组成,用于描述客户端的相关信息和请求的附加属性。
- 空行:请求头和请求体之间必须有一个空行,用于分隔请求头和请求体。
- 请求体:可选的,一般用于POST请求,包含要发送给服务器的数据。
-
响应报文结构:
- 状态行:包括HTTP协议版本、状态码和相应的状态描述。
- 响应头:包括若干个字段,每个字段由字段名和字段值组成,用于描述服务器的相关信息和响应的附加属性。
- 空行:响应头和响应体之间必须有一个空行,用于分隔响应头和响应体。
- 响应体:服务器返回的实际数据,可以是HTML、JSON、图片等任意类型的数据。
总体结构为:请求行/状态行 + 请求头/响应头 + 空行 + 请求体/响应体。
HTTP 协议版本
HTTP协议有多个版本,每个版本都有不同的特性和改进。以下是HTTP协议的几个主要版本:
- HTTP/0.9:这是最早的版本,于1991年发布。它只支持GET请求,并且响应只返回HTML文档,没有响应头部信息。
- HTTP/1.0:于1996年发布,是第一个被广泛采用的HTTP协议版本。它引入了多种请求方法(GET、POST、HEAD等)和响应状态码(如200、404等),并支持响应头部信息,以及通过请求头部中的"Host"字段来指定服务器的域名。
- HTTP/1.1:于1999年发布,是目前最广泛使用的HTTP协议版本。它在1.0的基础上引入了持久连接(Keep-Alive)、管道化(Pipeline)请求、缓存控制、分块传输编码(Chunked Transfer-Encoding)等新特性,提高了性能和效率。
- HTTP/2:于2015年发布,是HTTP/1.1的升级版本。它采用二进制格式传输数据,引入了多路复用(Multiplexing)、头部压缩(Header Compression)、服务器推送(Server Push)等新特性,进一步提高了性能和效率。
- HTTP/3:正在开发中,预计会在不久的将来发布。HTTP/3采用了QUIC协议作为传输协议,可以提供更低的延迟和更好的安全性,主要用于移动网络环境和高延迟网络环境。
HTTP/1.1 的特点
- 简单灵活:HTTP/1.1使用简单的请求和响应格式,易于理解和实现。它允许客户端和服务器之间进行灵活的通信,可以通过自定义的HTTP头部字段进行扩展。
- 无状态:HTTP/1.1是无状态的协议,即服务器不会保存客户端的状态信息。每个请求都是独立的,服务器仅根据请求和响应的内容进行处理。这种无状态的特性使得服务器的设计更加简单和可扩展。
- 持久连接:HTTP/1.1引入了持久连接(Keep-Alive),允许在单个TCP连接上发送多个请求和响应。这样可以减少连接的建立和关闭的开销,提高了性能和效率。持久连接还支持管道化请求,允许同时发送多个请求,减少网络延迟。
- 缓存控制:HTTP/1.1引入了一些新的缓存控制头部字段,如Cache-Control和ETag,使得客户端和服务器可以对缓存进行更精细的控制。这样可以减少对服务器的请求量,提高性能和效率。
- 安全性:HTTP/1.1可以通过TLS(Transport Layer Security)协议进行加密,形成HTTPS协议,提供了数据传输的加密和身份认证。
HTTP协议分析
我们可以使用 wireshark 软件进行抓包,进而分析 HTTP 协议的具体细节。
在wireshark中,我们首先要选择捕获网络流量的网络接口。然后就可以开始捕获网络流量,Wireshark将开始显示捕获的数据包列表。
在过滤器栏中输入"http"并按下回车键。这将过滤显示只包含HTTP协议的数据包。
在数据包列表中,找到HTTP请求的第一个数据包。选中此数据包并在下方的详细信息窗格中展开"Hypertext Transfer Protocol"部分。在详细信息窗格中,你可以查看HTTP请求的各个字段,如请求方法、URL、头部和主体等。
如果想追踪整个HTTP流,右键点击选中的HTTP请求数据包,然后选择"Follow" -> "HTTP Stream"。这将打开一个新窗口,显示HTTP请求和响应之间的所有数据包。
同时,我们可以利用chrome浏览器的开发者工具查看http包的详细信息。
Chrome 开发者工具(简称 DevTools)是一组网页制作和调试的工具,内嵌于 Google Chrome 浏览器中。
在chrome浏览器开发者工具的network网络面板中,我们可以看到网页加载期间发出的所有HTTP请求和响应。每个请求都会显示请求的URL、请求方法、状态码、大小、加载时间等基本信息。点击请求列表中的任意请求,右侧面板将显示该请求的详细信息,包括请求和响应的头部、主体、Cookie、缓存状态等。