HTTP协议基础知识 | 青训营

62 阅读6分钟

前言

在进行 Web 开发的过程中,HTTP 协议是我们必须要理解且至关重要的内容。

Web 是指万维网(World Wide Web)的简称,它是一个全球范围的互联网信息系统,由许多通过超文本链接相互关联的网页组成。通过万维网,用户可以通过网页浏览器访问和浏览各种信息资源,如文本、图片、音频、视频等。

本文将从 HTTP 协议的基础知识出发,帮助读者更好地理解相关内容。

HTTP 是什么

HTTP 是一种用于在万维网 WWW 上进行通信的应用层协议,全称为超文本传输协议(Hypertext Transfer Protocol),从这一名字中我们就可以解释其基本概念:

  1. 超文本Hypertext):超文本是一种非线性的、非顺序的文本形式,通过超链接将不同的文本片段之间相关联。在 HTTP 中,超文本主要指的是网页上的文本内容,可以包括文字、图片、视频等多种媒体形式。
  2. 传输Transfer):传输指的是在万维网中进行超文本数据传输。它基于客户端-服务器模型,可以将页面(HTML)从服务器传输到客户端(通常是浏览器),或者将浏览器发送的请求传输到服务器。
  3. 协议Protocol):协议是指在通信过程中所遵循的规则和约定。HTTP 协议定义了客户端(通常是浏览器)和 Web 服务器之间通信的规范,包括请求和响应的格式、请求方法、状态码、头部信息等。

综上,HTTP 协议是一种用于在万维网上进行通信的应用层协议,通过传输超文本数据来实现浏览器和服务器之间的通信。

HTTP 的报文结构

HTTP报文分为请求报文和响应报文两种类型,其结构如下:

  • 请求报文结构:

    • 请求行:包括请求方法、请求目标URL和HTTP协议版本。
    • 请求头:包括若干个字段,每个字段由字段名和字段值组成,用于描述客户端的相关信息和请求的附加属性。
    • 空行:请求头和请求体之间必须有一个空行,用于分隔请求头和请求体。
    • 请求体:可选的,一般用于POST请求,包含要发送给服务器的数据。

image.png

  • 响应报文结构:

    • 状态行:包括HTTP协议版本、状态码和相应的状态描述。
    • 响应头:包括若干个字段,每个字段由字段名和字段值组成,用于描述服务器的相关信息和响应的附加属性。
    • 空行:响应头和响应体之间必须有一个空行,用于分隔响应头和响应体。
    • 响应体:服务器返回的实际数据,可以是HTML、JSON、图片等任意类型的数据。

总体结构为:请求行/状态行 + 请求头/响应头 + 空行 + 请求体/响应体。

HTTP 协议版本

HTTP协议有多个版本,每个版本都有不同的特性和改进。以下是HTTP协议的几个主要版本:

  1. HTTP/0.9:这是最早的版本,于1991年发布。它只支持GET请求,并且响应只返回HTML文档,没有响应头部信息。
  2. HTTP/1.0:于1996年发布,是第一个被广泛采用的HTTP协议版本。它引入了多种请求方法(GET、POST、HEAD等)和响应状态码(如200、404等),并支持响应头部信息,以及通过请求头部中的"Host"字段来指定服务器的域名。
  3. HTTP/1.1:于1999年发布,是目前最广泛使用的HTTP协议版本。它在1.0的基础上引入了持久连接(Keep-Alive)、管道化(Pipeline)请求、缓存控制、分块传输编码(Chunked Transfer-Encoding)等新特性,提高了性能和效率。
  4. HTTP/2:于2015年发布,是HTTP/1.1的升级版本。它采用二进制格式传输数据,引入了多路复用(Multiplexing)、头部压缩(Header Compression)、服务器推送(Server Push)等新特性,进一步提高了性能和效率。
  5. 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请求和响应之间的所有数据包。

image.png

同时,我们可以利用chrome浏览器的开发者工具查看http包的详细信息。

Chrome 开发者工具(简称 DevTools)是一组网页制作和调试的工具,内嵌于 Google Chrome 浏览器中。

在chrome浏览器开发者工具的network网络面板中,我们可以看到网页加载期间发出的所有HTTP请求和响应。每个请求都会显示请求的URL、请求方法、状态码、大小、加载时间等基本信息。点击请求列表中的任意请求,右侧面板将显示该请求的详细信息,包括请求和响应的头部、主体、Cookie、缓存状态等。

image.png