深入理解 HTTP 协议 | 青训营

127 阅读9分钟

HTTP协议

在如今的网络时代,网络信息传输充斥着我们的生活。我们日常的浏览网页、刷短视频等行为都离不开网络信息的传输,而在传输的过程中就涉及到了一个非常重要的协议,HTTP协议。在本次的博客中,我们将通过简要的介绍以及对比,帮助大家更加深入地理解HTTP协议及其应用。

HTTP协议的基本定义和特点

HTTP 协议的基本定义

HTTP(Hypertext Transfer Protocol)是一种用于客户端和服务器之间通信的超文本传输协议,基于请求-响应模型,其中客户端发送请求并等待服务器的响应。

HTTP 协议的特点

  • 简单易用HTTP 使用简单的请求-响应模型,使得开发人员可以轻松地理解和使用该协议。
  • 无连接:每个 HTTP 请求都是独立的,服务器不会保持与客户端之间的连接状态。这样可以节省服务器资源,但也会带来一些额外的开销。
  • 无状态HTTP 是无状态的,即服务器不会在多个请求之间保留任何状态信息。每个请求都是独立的,服务器无法识别出它们是来自同一个客户端的请求。
  • 可扩展性HTTP 协议支持添加新的功能和扩展,使得它适用于不同的应用场景和需求。

HTTP 协议的发展历程

HTTP 协议的发展经历了多个版本的演进,主要包括 HTTP/0.9HTTP/1.0HTTP/1.1HTTP/2。每个版本都在之前版本的基础上进行了改进和扩展,以满足不断增长的互联网应用需求。

  • HTTP/0.9:最早的 HTTP 版本,仅支持 GET 方法,用于传输简单的 HTML 文档。
  • HTTP/1.0:引入了更多的请求方法(如 POSTPUTDELETE 等)和响应状态码,支持传输不仅仅是 HTML 文档的内容。
  • HTTP/1.1:目前最广泛使用的版本,引入了持久连接、管道化、虚拟主机等特性,提高了性能和效率。
  • HTTP/2:基于 Google 的 SPDY 协议发展而来,引入了多路复用、头部压缩、服务器推送等功能,进一步提升了性能,更快更稳定更简单

HTTP 报文结构

上文提及,客户端发送请求并等待服务器的响应,实际上就是通过传输HTTP报文来完成上述功能,由请求报文和响应报文组成。它们都包含了特定的字段和数据,用于在客户端和服务器之间传输信息。

实际传输过程中的报文如下:

image.png

请求报文

HTTP请求报文由请求行消息报头请求体三部分构成。

请求行

请求行包含请求方法、请求的URI和使用的协议版本。例如:GET /index.html HTTP/1.1

在请求行中,请求方法(Method)是数据通信和资源操作的关键部分。它定义了对资源的不同操作方式,如获取、提交、更新或删除。每个方法都有特定的用途和语义,开发者可以根据实际需求选择合适的方法来从客户端向服务端发起对应的请求。

常用请求方法:

Method主要应用场景
GET只被用于从服务器中获取指定资源
POST向服务器提交数据
PUT更新服务器上的资源
DELETE从服务器中删除资源
HEAD只获取资源的元数据,不返回实体内容
OPTIONS用于描述目标资源的通信选项

通过选择适当的请求方法,开发者可以实现各种类型的交互和操作,无论是简单的页面请求还是复杂的数据交换。了解和正确使用HTTP请求方法对于构建高效、安全和可靠的网络应用程序至关重要。

请求头部

请求头部包含附加的请求信息,以键值对的形式表示。常见的请求头部字段有:

  • Host:指定请求的主机名
  • User-Agent:指定发送请求的用户代理(浏览器或其他工具)
  • Content-Type:指定请求体的媒体类型
  • Accept:指定客户端接受的响应类型
  • Authorization: 提供身份验证凭据,用于访问受保护的资源。
  • Cookie: 用于在客户端和服务器之间传递会话信息的标识符。
  • Referer: 指明发送请求的来源页面的URL。

请求体

请求体(Request Body)是HTTP请求中包含的可选部分,用于向服务器发送额外的数据。请求体通常用于POSTPUT等请求方法中,用于传递表单数据、JSON数据等内容。

以下是一些请求体的示例:

  • 表单数据:
Content-Type: application/x-www-form-urlencoded

username=johndoe&password=secretpassword
  • JSON 数据:
Content-Type: application/json

{
  "name": "John Doe",
  "age": 25,
  "email": "johndoe@example.com"
}

在实际开发中,我们需要根据实际需求选择适当的Content-Type和请求体格式来发送数据到服务器,以确保服务器能够正确解析和处理请求体中的数据。

响应报文

HTTP响应报文由状态行响应头部响应体三部分构成。

状态行

状态行包含响应的状态码和状态描述。例如:HTTP/1.1 200 OK

状态码由三位数字组成,分为五个不同的类别:

  • 1xx - 信息性状态码(Informational):表示请求已被接收,并且服务器正在处理。

  • 2xx - 成功状态码(Successful):表示请求已成功被服务器接收、理解和处理。

  • 3xx - 重定向状态码(Redirection):表示客户端需要采取进一步的操作才能完成请求。

  • 4xx - 客户端错误状态码(Client Error):表示客户端发送的请求有错误,服务器无法处理。

  • 5xx - 服务器错误状态码(Server Error):表示服务器在处理请求时发生了错误。

常见的状态码包括:

  • 200 OK:请求成功,服务器已成功处理请求。
  • 301 Moved Permanently:资源(网页等)被永久转移到其他URL
  • 302 Found:请求的资源已被临时移动到其他位置。
  • 401 Unauthorized:请求未经授权。
  • 404 Not Found:请求的资源不存在。
  • 500 Internal Server Error:服务器在处理请求时发生了内部错误。
  • 504 Gateway Timeout:网关或者代理的服务器响应超时。

通过查看状态码,客户端可以了解到请求的处理结果,从而根据不同的状态码采取相应的处理措施。开发者在编写网络应用程序时,可以根据不同的状态码来进行错误处理、重定向或其他操作,以提供更好的用户体验。

响应头部

响应头部包含附加的响应信息,以键值对的形式表示。常见的响应头部字段有:

  • Content-Type:指定响应体的媒体类型
  • Content-Length:指定响应体的长度
  • Server:指定响应的服务器类型
  • Set-Cookie: 用于在客户端设置cookie的值。
  • Location: 用于重定向的目标URL。
  • Cache-Control: 指定响应的缓存策略。
  • Access-Control-Allow-Origin: 指定允许访问该资源的域。

响应体

响应体(Response Body)是HTTP响应中包含的实际数据部分,用于向客户端返回请求的结果或所请求的资源。根据不同的请求和服务器处理结果,响应体可以包含各种类型的数据,如文本、HTMLJSONXML、图片、视频等。

以下是一些响应体的示例:

  • 纯文本响应:
HTTP/1.1 200 OK
Content-Type: text/plain

Hello, world!
  • HTML 页面:
HTTP/1.1 200 OK
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
  <title>Example Page</title>
</head>
<body>
  <p>This is an example HTML page.</p>
</body>
</html>
  • JSON 数据:
HTTP/1.1 200 OK
Content-Type: application/json

{
  "name": "John Doe",
  "age": 25,
  "email": "johndoe@example.com"
}
  • 图片:
HTTP/1.1 200 OK
Content-Type: image/jpeg

<binary image data>

在实际的开发中,我们需要根据服务器的处理结果和客户端的需求,选择适当的Content-Type和响应体格式来返回数据给客户端,以确保客户端能够正确解析和处理响应体中的数据。

HTTP和HTTPS的区别

在浏览网页的过程中,我们经常会看到以HTTPHTTPS开头的地址。这两种协议写法相似,而它们实际上又有什么共同点与区别呢?

HTTP的不足

  • 通信使用明文传输,内容可能会被监听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

HTTPS的概述

HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密和认证保护数据传输安全的HTTP协议。与常规的HTTP协议(使用默认的端口80)相比,HTTPS(默认端口为443)使用加密的SSL(Secure Sockets Layer)或其继任者TLS(Transport Layer Security)协议来建立安全的通信通道。

HTTPS的主要目标是确保在客户端和服务器之间传输的数据的机密性、完整性和身份验证。它通过以下方式提供安全性:

  • 加密数据HTTPS使用共享密钥加密(对称)和公钥加密算法(非对称)两者并用的混合加密机制来加密传输的数据。这意味着即使有人能够截获通信,也无法解读其中的内容。

  • 数据完整性HTTPS使用消息认证码MAC)来验证数据的完整性。这样,当数据在传输过程中被篡改时,接收方可以检测到并拒绝不完整或被篡改的数据。

  • 身份验证HTTPS使用数字证书来验证服务器的身份,并确保客户端与正确的服务器进行通信。数字证书由受信任的证书颁发机构(CA)签发,用于证明服务器的身份和可信度。

在浏览器使用HTTPS发送请求到服务器并获取数据:

HTTPS协议.png

第一次写技术博客,花了比较多的时间查阅资料,但依然有许多不足,希望以后可以逐步完善,多产出一些实用的技术总结与分享!