HTTP由浅入深

发布于:2025-05-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

概述

超文本传输协议(HTTP, Hypertext Transfer Protocol) 是一种用于传输超媒体文档(例如 HTML)的应用层协议。它最初被设计用于 Web 浏览器与 Web 服务器之间的通信,但也广泛应用于其他客户端与服务器的交互。

HTTP 遵循经典的[客户端-服务器(Client-Server)模型:客户端发起请求,服务器处理并返回响应。HTTP 是一种无状态协议,即服务器在两个请求之间不保留任何状态信息。

特点
  1. 简单快速:客户端向服务器请求服务时,仅需发送请求方法和路径。常用的方法有 GET、HEAD、POST 等。由于协议本身结构简单,HTTP 服务器实现轻量,通信速度较快。
  2. 灵活:HTTP 允许传输任意类型的数据,通过 Content-Type 头来标识传输的数据类型。
  3. 无连接:HTTP 的无连接性指每次请求完成后,客户端与服务器的连接就会断开。这种方式有助于节省服务器资源,提升处理效率。
  4. 无状态:HTTP 协议本身不记录请求之间的状态信息。如果需要在多个请求之间保留用户状态,通常通过 Cookie、Session、Token 等机制实现。无状态的好处是服务器响应更快,但也带来了开发上的额外工作。
  5. 支持 B/S 和 C/S 模式:HTTP 既可用于浏览器/服务器(Browser/Server)架构,也适用于客户端/服务器(Client/Server)通信,因而应用广泛。
URL

HTTP 使用统一资源标识符(URI, Uniform Resource Identifier)来标识和定位资源。**URL(Uniform Resource Locator,统一资源定位符)**是 URI 的一种形式,包含了访问某个资源所需的完整信息。

下面通过一个新的 URL 示例来说明其组成部分:

https://example.com:8443/docs/tutorial/index.html?user=alice&lang=zh#section2

这个 URL 可以分为以下几个部分:

  1. 协议(Scheme)https
    指明使用的协议是 HTTPS,即 HTTP 的加密版本,保障数据的安全性。
  2. 域名(Host)example.com
    表示服务器的地址,既可以是域名也可以是 IP 地址。
  3. 端口(Port):8443
    指定服务器监听的端口号。若省略此部分,将使用协议的默认端口(HTTPS 默认为 443)。
  4. 路径(Path)/docs/tutorial/
    表示服务器上资源的目录结构,也称为虚拟目录。
  5. 文件名(File)index.html
    表示请求的具体资源文件,若省略则通常由服务器返回默认首页文件。
  6. 查询参数(Query)?user=alice&lang=zh
    用于向服务器传递额外信息。多个参数通过 & 分隔,键值对之间用 = 连接。
  7. 锚点(Fragment)#section2
    表示页面中的某个位置(例如跳转到 HTML 的某个 id),不会参与服务器通信,仅由前端解析处理。

HTTP 与 HTTPS

概述

HTTP(Hypertext Transfer Protocol,超文本传输协议)
用于从 Web 服务器传输超文本(如 HTML 文件、图片、视频等)到客户端浏览器,是一种基于 TCP/IP 的请求-响应协议,默认端口为 80

HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议)
是 HTTP 的安全版本,在 HTTP 的基础上增加了 SSL/TLS 加密机制,提供数据加密、完整性校验和身份验证,默认端口为 443

HTTP 工作原理

HTTP 使用“客户端 - 服务器”模型工作:

  1. 客户端发起请求:浏览器等客户端向服务器发起 HTTP 请求;
  2. 服务器处理请求:服务器解析请求、读取资源或处理业务逻辑;
  3. 服务器返回响应:返回 HTML 页面、图片、JSON 数据等内容;
  4. 客户端渲染页面:浏览器接收响应并渲染出完整页面。

常见的 Web 服务器有:ApacheNginxIIS(Internet Information Services) 等。

HTTP 的三个特性:

  • 无连接:每次请求/响应后即断开连接;
  • 无状态:服务器不保存任何关于客户端的会话状态;
  • 媒体独立:只要客户端和服务器能识别 MIME 类型,任何格式的数据都可通过 HTTP 传输。
HTTPS 的作用

HTTPS 通过 SSL/TLS 协议 提供如下安全保障:

  • 加密传输:防止数据被第三方窃听;
  • 数据完整性:防止传输过程中的数据被篡改;
  • 身份验证:确保数据是从真实的服务器发出的。

HTTPS 的信任依赖于操作系统中预装的 CA(证书颁发机构)

  • 浏览器需要信任 CA;
  • 服务器必须使用有效的证书;
  • 证书必须匹配访问的域名;
  • 协议加密过程必须完整并有效。
区别总结
对比维度 HTTP HTTPS
是否加密 明文传输 SSL/TLS 加密传输
端口号 80 443
安全性 不安全,易被监听或篡改 安全,具备加密、认证与完整性校验功能
证书要求 无需证书 需部署 SSL 证书
性能 较快,无加密开销 稍慢,有加解密过程
SEO 影响 可能被降权 更受搜索引擎优待
浏览器提示 显示“不安全” 显示“安全锁”
成本 免费 需购买或申请 SSL 证书
适用场景 非敏感信息传输场景(如新闻博客) 涉及隐私或敏感信息(如电商、登录等)

请求报文

HTTP 请求报文由三部分组成:

  1. 请求行(Request Line)

  2. 请求头(Request Header)

  3. 请求体(Request Body,可选)

    请求报文示例

GET / HTTP/1.1                 # 请求方法为GET,请求首页(/),使用HTTP/1.1协议
Host: baidu.com               # 指定目标主机(域名)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.6367.60
                              # 浏览器类型和操作系统信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
                              # 客户端可接收的内容类型
Accept-Encoding: gzip, deflate, br
                              # 支持的内容压缩编码方式(节省带宽)
Accept-Language: zh-CN,zh;q=0.9
                              # 客户端可接受的语言
Connection: keep-alive        # 表示使用长连接,保持 TCP 连接不断开
Cookie: BIDUPSID=...; BAIDUID=...; ...
                              # 携带的 Cookie,用于身份识别、会话保持等
请求行

格式如下:

请求方法 请求资源路径 协议版本

示例:

POST /chapter17/user.html HTTP/1.1

常见请求方法
方法 说明
GET 请求数据附在 URL 中;不安全,有长度限制;无请求体
POST 数据放在请求体中;适用于表单提交、上传等场景
HEAD 只请求响应头,不返回实体内容
PUT 用于更新或上传资源
DELETE 请求服务器删除资源
OPTIONS 返回服务器支持的请求方法
TRACE 回显服务器收到的请求(用于测试和诊断)
CONNECT 用于建立网络隧道(主要用于 HTTPS)
请求头

请求头用于描述客户端环境和请求内容,常见字段如下:

Header 字段 说明
Host 请求主机名
User-Agent 客户端软件信息
Accept 可接受的内容类型
Content-Type 请求体数据类型
Content-Length 请求体的字节长度
Cookie 客户端存储的 cookie 数据
Referer 发起请求的源页面地址
请求体

请求体通常包含实际发送的数据,仅 POST、PUT 等方法使用。GET 方法没有请求体。

Content-Type 详解

Content-Type 指定了请求体中数据的类型。以下是常见类型说明:

Content-Type 说明
text/plain 纯文本格式
text/html HTML 格式
text/css CSS 格式
text/javascript JavaScript 格式
image/gif GIF 图片
image/jpeg JPEG 图片
image/png PNG 图片
application/x-www-form-urlencoded 表单默认格式,key=value&key2=value2
application/json JSON 格式,常用于 API 请求
multipart/form-data 用于表单上传文件
text/xml 以 XML 格式提交数据
application/octet-stream 任意二进制数据流,如文件下载/上传
常见场景 Content-Type 对应关系
场景 请求方法 Content-Type
普通表单提交 POST application/x-www-form-urlencoded
上传文件 POST multipart/form-data
提交 JSON 数据 POST application/json
REST 接口 PUT 请求 PUT application/json 或其他格式
下载文件 GET application/octet-stream

响应报文

HTTP 响应报文由三部分组成:

  1. 响应行(Status Line)
  2. 响应头(Response Header)
  3. 响应体(Response Body)

响应报文示例

HTTP/2 200 OK                    # 响应协议版本为HTTP/2,状态码200表示请求成功
Server: JSP3/2.0.14              # 服务器软件及版本信息
Date: Fri, 16 May 2025 07:59:09 GMT  # 响应生成时间(GMT格式)
Content-Type: text/javascript; charset=utf-8
                                # 响应内容的类型为JavaScript,字符编码为utf-8
Expires: Mon, 16 Sep 2024 07:12:27 GMT
                                # 资源过期时间(一般用于缓存)
Last-Modified: Thu, 12 Sep 2024 08:43:04 GMT
                                # 资源最后修改时间
Etag: "63487d8c50e44137f8b6ce2a04407f8f"
                                # 资源的唯一标识(方便缓存和验证)
Cache-Control: max-age=31536000
                                # 缓存控制,表示资源最大缓存时间为31536000秒(1年)
Age: 621073                     # 资源在缓存中已经存在的秒数
Accept-Ranges: bytes            # 支持客户端的范围请求(断点续传)
Content-Md5: Y0h9jFDkQTf4ts4qBEB/jw==
                                # 响应内容的MD5校验值(完整性校验)
X-Cache-Status: HIT             # 缓存命中,表示资源来自缓存
Timing-Allow-Origin: *          # 允许任何源访问资源加载时间数据(用于性能分析)
Access-Control-Allow-Origin: * # 允许跨域访问,任何域都可以访问此资源
// 以下是响应体示例(JavaScript代码)
define("@baidu/aging-tools-pc/dist/index",["san","tslib"],function(n,t){
    function e(n){
        if(o[n])return o[n].exports;
        var t=o[n]={i:n,l:!1,exports:{}};
        return i[n].call(t.exports,t,t.exports,e),t.l=!0,t.exports
    }
    // 省略后续代码
})
响应行

格式如下:

HTTP/协议版本 状态码 状态描述

示例:

HTTP/1.1 200 OK

状态码详解

HTTP 状态码由 3 位数字组成,第一个数字表示响应的类别:

1xx:信息响应(Informational)
  • 100 Continue:继续请求
  • 101 Switching Protocols:切换协议
2xx:成功(Success)
  • 200 OK:请求成功
  • 204 No Content:请求成功但无响应体,常用于无需页面刷新的请求
  • 206 Partial Content:部分内容响应,用于支持范围请求(Content-Range)
3xx:重定向(Redirection)
  • 301 Moved Permanently:永久重定向
  • 302 Found:临时重定向
  • 303 See Other:重定向到另一个地址,要求使用 GET 请求
  • 307 Temporary Redirect:临时重定向,不会更改请求方法(如 POST 不变)
  • 304 Not Modified:资源未修改,使用缓存(与条件请求有关)
4xx:客户端错误(Client Error)
  • 400 Bad Request:语法错误,服务器无法理解
  • 401 Unauthorized:未授权,需要身份验证(需带 WWW-Authenticate 响应头)
  • 403 Forbidden:服务器拒绝请求
  • 404 Not Found:请求资源不存在
  • 415 Unsupported Media Type:请求类型不支持
5xx:服务器错误(Server Error)
  • 500 Internal Server Error:服务器内部错误
  • 503 Service Unavailable:服务器暂时无法处理请求
响应头

响应头是由服务器返回的键值对,用于说明响应信息及控制客户端行为。

常见响应头字段
字段名 描述
Location 重定向地址,需与 3xx 状态码搭配使用
Content-Type 响应体的数据类型,如 text/html;charset=UTF-8
Content-Disposition 文件下载方式,如 attachment;filename=xx.zip
Set-Cookie 设置客户端 Cookie
Content-Encoding 响应体的压缩方式,如 gzip
Content-Length 响应体的字节长度
Refresh 定时刷新页面,如 3;url=http://example.com
Server 服务器信息,如 Apache-Coyote/1.1(可配置)
Last-Modified 响应资源的最后修改时间
Cache-Control 缓存控制,如 privatepublicno-cachemax-age=秒数no-store
响应体

响应体是服务器真正发送给客户端的“正文”内容,通常为 HTML 页面、JSON 数据、图片或其他资源。

浏览器将响应体加载到内存后,进行解析、渲染并展示页面内容。

参考文章

  1. http中文文档(https://developer.mozilla.org/zh-CN/docs/Web/HTTP)
  2. HTTP/HTTPS 简介(https://www.runoob.com/http/http-intro.html)
  3. Http协议详解(深入理解)(https://blog.csdn.net/weixin_38087538/article/details/82838762)

网站公告

今日签到

点亮在社区的每一天
去签到