HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网中客户端与服务器之间传输超文本(如HTML、图片、JSON等)的核心协议,基于请求-响应模型TCP/IP协议族工作。其完整工作流程可拆解为以下9个核心步骤,涵盖从用户触发请求到最终资源展示的全链路细节:

步骤1:用户触发请求(客户端发起意图)

HTTP交互的起点是用户的操作,例如:

  • 在浏览器地址栏输入URL(如https://www.example.com/index.html);
  • 点击网页中的链接、提交表单、加载图片/CSS/JS等资源;
  • 手机App调用API接口(如GET /api/user)。

此时,客户端(浏览器、App等)需要明确:要访问的服务器是谁?要获取的资源是什么?

步骤2:解析URL(确定目标服务器与资源路径)

客户端首先解析用户输入的URL(Uniform Resource Locator,统一资源定位符),提取关键信息以定位目标。URL的基本结构为:

[协议]://[域名/IP]:[端口]/[路径]?[查询参数]#[锚点]  

例如http://www.example.com:80/path/file.html?id=1#top中:

  • 协议http(或https,后者基于TLS加密);
  • 域名/IPwww.example.com(需转换为IP地址);
  • 端口80(HTTP默认端口,可省略;HTTPS默认443);
  • 路径/path/file.html(服务器上的资源路径);
  • 查询参数?id=1(向服务器传递的额外参数,如GET请求的参数);
  • 锚点#top(仅客户端使用,用于定位页面内位置,不发送给服务器)。

步骤3:DNS域名解析(将域名转换为IP地址)

URL中的“域名”(如www.example.com)是人类易读的标识,而计算机通信依赖IP地址(如192.168.1.1)。因此,客户端需要通过DNS(域名系统) 将域名解析为IP地址,流程如下:

  1. 检查本地缓存:客户端(浏览器、操作系统)先查本地DNS缓存(如浏览器缓存、hosts文件、系统缓存),若有记录直接使用。
  2. 递归查询本地DNS服务器:若本地无缓存,客户端向“本地DNS服务器”(如运营商提供的114.114.114.114)发送查询请求(递归查询:客户端只等结果,不关心中间过程)。
  3. 迭代查询根域名服务器:本地DNS服务器若无记录,会向“根域名服务器”(全球共13组)查询。根服务器返回顶级域名服务器(如.com服务器)的地址。
  4. 查询顶级域名服务器:本地DNS服务器向.com服务器查询example.com的权威服务器地址。
  5. 查询权威域名服务器:本地DNS服务器向example.com的权威服务器查询www.example.com的IP地址,最终获取结果。
  6. 返回结果并缓存:本地DNS服务器将IP地址返回给客户端,并缓存该记录(缓存时间由域名的TTL(Time To Live)决定,通常几分钟到几小时)。

举例www.example.com最终解析为203.0.113.5

步骤4:建立TCP连接(基于三次握手)

HTTP协议依赖TCP(传输控制协议) 提供可靠的字节流传输(保证数据不丢失、不重复、按序到达)。因此,客户端需先与服务器的目标端口(如80)建立TCP连接,通过三次握手实现:

  1. 第一次握手(客户端→服务器):客户端发送SYN(同步)报文,包含一个随机序列号(如seq=100),表示“我要连接你”。
  2. 第二次握手(服务器→客户端):服务器接收SYN后,回复SYN+ACK(同步+确认)报文,包含:
    • 确认号ack=101(客户端序列号+1,表示已收到客户端的SYN);
    • 服务器自己的随机序列号seq=200
  3. 第三次握手(客户端→服务器):客户端接收SYN+ACK后,回复ACK(确认)报文,包含确认号ack=201(服务器序列号+1,表示已收到服务器的SYN)。

三次握手完成后,TCP连接建立,双方可开始传输数据。

注意

  • HTTP/1.0默认“非持久连接”(每次请求后关闭TCP连接);
  • HTTP/1.1默认“持久连接”(Keep-Alive,连接保持一段时间复用,减少握手开销);
  • HTTP/2通过“多路复用”在一个TCP连接上并行处理多个请求;
  • HTTP/3基于QUIC协议(UDP),无需三次握手,连接建立更快。

步骤5:客户端构建并发送HTTP请求报文

TCP连接建立后,客户端向服务器发送HTTP请求报文,包含“要做什么”“要什么资源”等信息。请求报文结构由4部分组成:

1. 请求行(Request Line)

格式:[请求方法] [请求URI] [HTTP版本]

  • 请求方法:表示客户端对资源的操作意图,常见包括:
    • GET:获取资源(如页面、图片,参数在URL中,无请求体);
    • POST:提交数据(如表单,参数在请求体中,更安全);
    • PUT:更新资源(全量替换);
    • DELETE:删除资源;
    • HEAD:类似GET,但只返回响应头(用于检查资源是否存在)。
  • 请求URI:服务器上的资源路径(如/path/file.html)。
  • HTTP版本:如HTTP/1.1(主流)、HTTP/2

示例GET /index.html HTTP/1.1

2. 请求头(Request Headers)

由多个“键值对”组成(格式:Key: Value),用于传递客户端信息、请求附加条件等,常见字段:

  • Host:目标服务器域名(如www.example.com,HTTP/1.1必需,用于虚拟主机区分);
  • User-Agent:客户端标识(如Mozilla/5.0 (Windows NT 10.0; ...),服务器可据此返回适配内容);
  • Accept:客户端可接受的资源类型(如text/html, application/json);
  • Accept-Encoding:客户端支持的压缩方式(如gzip, deflate,服务器可压缩响应体减小传输量);
  • Cookie:客户端存储的键值对(如sessionid=abc123,用于身份识别,由服务器通过Set-Cookie设置);
  • Connection: Keep-Alive:请求保持TCP连接(HTTP/1.1默认)。

示例

Host: www.example.com  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)  
Accept: text/html,application/xhtml+xml  
Cookie: username=test; sessionid=abc123  
3. 空行

一个单独的CRLF(回车+换行,\r\n),用于分隔请求头和请求体。

4. 请求体(Request Body)

可选,仅在POST/PUT等方法中存在,用于传递数据(如表单数据、JSON)。

  • 表单数据(Content-Type: application/x-www-form-urlencoded):username=test&password=123
  • JSON数据(Content-Type: application/json):{"username":"test","password":"123"}

完整请求报文示例

GET /index.html HTTP/1.1  
Host: www.example.com  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)  
Accept: text/html,application/xhtml+xml  
Cookie: username=test; sessionid=abc123  (空行)  
(GET方法无请求体)  

步骤6:服务器接收并处理请求

服务器(如Nginx、Apache、Tomcat)通过监听端口(如80)接收请求报文后,按以下流程处理:

  1. 解析请求报文:提取请求方法、URI、版本、请求头、请求体等信息。
  2. 验证请求合法性
    • 检查Host是否匹配服务器配置(虚拟主机场景);
    • 验证权限(如Cookie中的session是否有效,是否登录);
    • 检查请求格式(如Content-Length是否与请求体长度一致)。
  3. 定位资源并处理
    • 静态资源(如.html.jpg):直接从服务器文件系统读取(如Nginx直接返回/var/www/html/index.html);
    • 动态资源(如API接口):通过CGI、FastCGI、WSGI等接口调用后端程序(如Python的Django、Java的Spring),执行逻辑(如查询数据库、处理数据)。
  4. 生成响应内容:后端程序处理完成后,生成响应数据(如HTML页面、JSON结果),返回给服务器。

步骤7:服务器构建并发送HTTP响应报文

服务器处理完成后,向客户端返回HTTP响应报文,包含“处理结果”“返回资源”等信息。响应报文结构与请求报文类似,由4部分组成:

1. 状态行(Status Line)

格式:[HTTP版本] [状态码] [原因短语]

  • HTTP版本:如HTTP/1.1
  • 状态码:3位数字,表示请求处理结果,分为5类:
    • 1xx(信息):请求已接收,继续处理(如100 Continue);
    • 2xx(成功):请求正常处理(如200 OK);
    • 3xx(重定向):需进一步操作(如301 Moved Permanently永久重定向,302 Found临时重定向);
    • 4xx(客户端错误):请求有误(如404 Not Found资源不存在,403 Forbidden权限不足);
    • 5xx(服务器错误):服务器处理失败(如500 Internal Server Error)。
  • 原因短语:状态码的文字描述(如OK对应200)。

示例HTTP/1.1 200 OK

2. 响应头(Response Headers)

传递服务器信息、响应附加条件等,常见字段:

  • Content-Type:响应体的MIME类型(如text/html; charset=utf-8表示HTML文本,image/jpeg表示JPG图片);
  • Content-Length:响应体的字节长度(客户端可据此判断是否接收完整);
  • Content-Encoding:响应体的压缩方式(如gzip,客户端需解压);
  • Set-Cookie:服务器向客户端设置Cookie(如sessionid=abc123; Path=/; Max-Age=3600);
  • Cache-Control:缓存控制(如max-age=3600表示客户端可缓存1小时);
  • Location:重定向的目标URL(配合3xx状态码使用)。

示例

Content-Type: text/html; charset=utf-8  
Content-Length: 1024  
Set-Cookie: sessionid=def456; Path=/; Max-Age=3600  
Cache-Control: max-age=3600  
3. 空行

同样是CRLF,分隔响应头和响应体。

4. 响应体(Response Body)

服务器返回的实际资源内容,如:

  • HTML文本(<html><body>Hello</body></html>);
  • JSON数据({"code":200,"data":"success"});
  • 二进制数据(图片、视频等)。

完整响应报文示例

HTTP/1.1 200 OK  
Content-Type: text/html; charset=utf-8  
Content-Length: 150  
Set-Cookie: sessionid=def456; Path=/; Max-Age=3600  (空行)  
<html>  <head><title>Example</title></head>  <body>Hello, World!</body>  
</html>  

步骤8:客户端接收并解析响应

客户端(如浏览器)接收响应报文后,按以下逻辑处理:

  1. 解析状态码:判断请求是否成功(如200则继续,404则显示“页面不存在”)。
  2. 处理响应头
    • 若有Set-Cookie,则保存Cookie到本地(用于后续请求);
    • 若有Cache-Control,则缓存响应体(下次请求可直接使用缓存);
    • 若状态码为3xx,则根据Location重定向到新URL。
  3. 解析响应体
    • 浏览器:渲染HTML(解析DOM)、执行JS、加载CSS/图片等(这些资源可能触发新的HTTP请求);
    • App:解析JSON/XML数据,更新界面。

步骤9:关闭或复用TCP连接

响应处理完成后,TCP连接的生命周期取决于HTTP版本:

  • HTTP/1.0(非持久连接):默认每次请求后关闭连接,通过四次挥手

    1. 客户端发送FIN(结束)报文;
    2. 服务器回复ACK确认;
    3. 服务器发送FIN报文;
    4. 客户端回复ACK确认。
  • HTTP/1.1(持久连接):默认开启Keep-Alive(可通过Connection: close关闭),连接保持一段时间(如30秒),期间客户端可复用连接发送新请求,减少握手开销。

  • HTTP/2:通过“多路复用”在一个TCP连接上并行处理多个请求(无需等待前一个请求完成),效率更高。

  • HTTP/3:基于QUIC协议(UDP),连接建立更快(无需三次握手),且支持“连接迁移”(网络切换时不中断连接)。

总结

HTTP工作流程是“客户端发起请求→DNS解析→TCP连接→请求报文传输→服务器处理→响应报文返回→客户端解析→连接管理”的闭环,每个环节都依赖具体的协议规则(如DNS解析、TCP握手、HTTP报文格式)。理解这一流程有助于排查网络问题(如404错误、连接超时)、优化性能(如复用连接、合理缓存)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93504.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93504.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93504.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式实用面试题与代码解析专栏

正则表达式是前端表单验证、字符串匹配的核心工具,简洁高效的正则能大幅提升代码性能。本专栏整理了7道高频面试题,包含核心正则表达式、代码实现及关键知识点解析,帮你快速掌握正则实用技巧。 一、正则基础:核心概念与语法 在学习面试题前,先明确几个高频基础语法,这是…

【数据可视化-89】基孔肯雅热病例数据分析与可视化:Python + pyecharts洞察疫情动态

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

云智智慧停充一体云-allnew全新体验-路内停车源码+路外停车源码+充电桩源码解决方案

采用Java主流的微服务技术栈&#xff0c;基于 Spring Cloud Alibaba 的微服务解决方案进行封装的快速开发平台&#xff0c;包含多种常用开箱即用功能的模块&#xff0c;通用技术组件与服务、微服务治理&#xff0c;具备RBAC功能、网关统一鉴权、Xss防跨站攻击、自动生成前后端代…

利用pypy加速pyxlsbwriter生成xlsb文件

上文介绍了python通过DuckDB和pyxlsbwriter模块生成xlsb文件&#xff0c;因为python是解释执行&#xff0c;它的速度有点慢&#xff0c;pypy是另一种python解释器&#xff0c;它使用即时编译&#xff08;JIT&#xff09;技术来提高执行速度。 因为DuckDB与pypy不兼容&#xff0…

【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略

Spring Boot 集成 MyBatis-Plus 全攻略 1. 为什么选择 MyBatis-Plus 零侵入&#xff1a;在 MyBatis 基础上增强&#xff0c;不影响现有功能。内置 CRUD&#xff1a;无需写 XML/SQL&#xff0c;直接调用 BaseMapper 方法。强大插件&#xff1a;分页插件、性能分析、乐观锁、多租…

LangChain 多任务应用开发

Q: LangChain dify coze是竞品关系 都是AI Agent搭建平台&#xff0c;dify和coze 属于低代码&#xff0c;langChain属于高代码&#xff0c;coze优于dify Q&#xff1a;向量数据库是存储向量&#xff0c;做相似度检索的&#xff0c;可以用faiss milvus chromdb Q&#xff1a;使用…

实用技巧:Oracle中精准查看表占用空间大小

目录实用技巧&#xff1a;Oracle中精准查看表占用空间大小一、为什么需要精准统计表空间占用&#xff1f;二、完整查询SQL&#xff1a;覆盖表、LOB、索引三、SQL语句关键逻辑解析1. 基础表&#xff1a;dba_tables 与 dba_tablespaces2. 子查询1&#xff1a;统计表段空间&#x…

openEuler等Linux系统中如何复制移动硬盘的数据

在 openEuler 系统中,提示 “You should mount volume first” ,意思是需要先挂载移动硬盘的分区才能访问: 安装必要软件(针对特殊文件系统) 如果移动硬盘是 NTFS 等非 Linux 原生支持的文件系统格式,需要安装对应的支持软件,以挂载 NTFS 格式移动硬盘为例,需要安装 …

java如何把字符串数字转换成数字类型

在Java中将字符串数字转换为数字类型有多种方法&#xff0c;以下是详细说明和示例代码&#xff1a; 一、基础转换方法 Integer.parseInt() String str "123"; int num Integer.parseInt(str); // 转换为intDouble.parseDouble() String str "3.14"; dou…

WPFC#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表

WPF&C#超市管理系统10. 订单详情10.1 页面布局10.2 功能实现11. 顾客注册12. 商品销售排行查询与库存提示14. LiveChart报表总结10. 订单详情 10.1 页面布局 页面分三行布置&#xff0c;第一行复用OutstorageView界面的第一行&#xff0c;将属性和命令修改为顾客相关第二…

【Linux】文件基础IO

1.关于文件的共识原理 1.文件内容属性 2.文件分为打开的文件和没打开的文件 3.打开的文件&#xff1a; 文件被打开必须先被加载到内存&#xff0c;所以本质是研究进程和文件的关系&#xff0c;一个进程可以打开多个文件。操作系统内部一定存在大量被打开的文件&#xff0c;要进…

基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现

基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现

Java研学-SpringCloud(五)

一 Nacos 配置中心 1 引入依赖 – services.pom每个微服务都需要<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2 配置文件 –…

.NET 中的延迟初始化:Lazy<T> 与LazyInitializer

标签&#xff1a;线程安全、延迟初始化、按需初始化、提升启动性能 项目地址&#xff1a;NitasDemo/12Lazy/LazyDemo at main Nita121388/NitasDemo 目录Lazy<T>1. 概念2. 基本用法 3. 异常处理 4. 线程安全模式 5. 示例1. 线程安全模式 (ExecutionAndPublication)2. 发…

【LLIE专题】LLIE低照度图像结构先验提取方法

Zero-Shot Day-Night Domain Adaptation with a Physics Prior&#xff08;ICCV,2021&#xff09;专题介绍一、研究背景二、方法1. 物理反射模型与颜色不变特征的推导&#xff08;原理推导、物理依据&#xff09;2. 颜色不变特征的计算&#xff08;特征计算公式整个过程&#x…

Font Awesome Kit 使用详解

在现代网页设计中&#xff0c;图标是提升用户体验的关键元素。而 Font Awesome 作为最受欢迎的图标库&#xff0c;其最新版本 Font Awesome 7 通过 Kit 功能提供了更便捷高效的集成方式。本文将带你全面了解如何使用 Font Awesome Kit&#xff0c;让你的网站图标管理变得轻松高…

第七十八章:AI的“智能美食家”:输出图像风格偏移的定位方法——从“滤镜病”到“大师风范”!

AI图像风格偏移前言&#xff1a;AI的“火眼金睛”——输出图像风格偏移的定位方法&#xff01;第一章&#xff1a;痛点直击——“画风跑偏”&#xff1f;AI生成艺术的“审美危机”&#xff01;第二章&#xff1a;探秘“画风密码”&#xff1a;什么是风格偏移&#xff1f;它藏在…

Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案

Kotlin 原生实现 (Android) 1.1 AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.afloia.smartconnect"><applicationandroid:name".MainApplication"android:label"Smart …

已开源:Highcharts.NET,Highcharts Android,与Highcharts iOS集成

近期了解到&#xff0c;Highcharts官方宣布将Highcharts.NET&#xff0c;Highcharts Android&#xff0c;与Highcharts iOS集成转换为开源。对于Highcharts提供世界一流的数据可视化工具&#xff0c;一直致力于将资源集中在可以为您提供最大价值的地方。官方提到&#xff1a;这…

KingbaseES:一体化架构与多层防护,支撑业务的持续稳定运行与扩展

声明&#xff1a;文章为本人真实测评博客&#xff0c;非广告 目录 引言 一、什么是KingbaseES&#xff1f; 二、KingbaseES核心特性 1. 一键迁移&#xff0c;极速性能&#xff0c;安全无忧​ 2. 性能强劲&#xff0c;扩展性强&#xff0c;助力企业应对大规模并发挑战​ …