应用层协议:HTTP
目录
HTTP:超文本传输协议
1.1 HTTP报文
1.1.1 请求报文
1.1.2 响应报文
1.2 HTTP请求过程和原理
1.2.1 请求过程
1、域名(DNS)解析
2、建立TCP连接(三次握手)
3、发送HTTP请求
4、服务器处理请求
5、返回HTTP响应
6、浏览器渲染(客户端侧)
7、断开TCP连接(四次挥手)
1.2.2 核心原理
1.3 HTTP的不同版本
1.3.1 HTTP1.0
1.3.2 HTTP1.1(常用)
1.3.3 HTTP2.0(常用)
1.3.4 HTTP3.0
应用层协议是网络模型中最高层的协议,直接为用户应用程序提供服务,定义了应用程序之间如何进行通信和数据交换的规则。
HTTP:超文本传输协议
-
功能: HTTP 是用于在 HTTP 应用程序(Web 浏览器和 Web 服务器)之间传输超文本文档(如 HTML 文件)的基础协议。它定义了客户端(浏览器)如何请求资源(如网页、图片)以及服务器如何响应这些请求。它是一种无状态协议(服务器默认不记住之前的请求)。
无状态:HTTP 协议本身不保留之前请求或响应的任何信息。
- 端口: HTTP - 80
1.1 HTTP报文
-
HTTP 请求 (HTTP Request): 客户端向服务器发送一个格式化的消息,说明它想要什么(例如,“给我 index.html 页面” 或 “把这个表单数据提交到服务器”)。
-
HTTP 响应 (HTTP Response): 服务器处理请求后,向客户端返回一个格式化的消息,包含请求的结果(例如,返回 index.html 文件的内容,或告知表单提交成功/失败)。
1.1.1 请求报文
请求行 (Request Line):
-
方法 (Method)
:定义要对资源执行的操作(如GET
,POST
,PUT
,DELETE
,HEAD
,OPTIONS
等)。
-
请求目标 (Request Target)
:通常是资源的 URL 路径(有时包含查询参数),例如/index.html
或/search?q=term
。 -
HTTP 版本
:如HTTP/1.1
。 -
示例:
GET /index.html HTTP/1.1
请求头 (Request Headers):
-
一系列键值对 (
Header-Name: Header-Value
),提供关于请求的额外信息。 -
常见头:
-
Host
: 目标服务器的主机名和端口(必需,尤其在虚拟主机环境下)。 -
User-Agent
: 客户端标识(浏览器类型、版本、操作系统等)。 -
Accept
: 客户端可接受的响应内容类型(MIME 类型),如text/html, application/json
。 -
Accept-Language
: 客户端接受的自然语言(如en-US, zh-CN
)。 -
Accept-Encoding
: 客户端接受的内容编码(压缩方式),如gzip, deflate, br
。 -
Connection
: 控制连接选项(如keep-alive
表示希望保持连接)。 -
Cookie
: 将之前服务器设置的 Cookie 发送回服务器。解决HTTP无状态的问题。 - sec-fetch-dest :期望获得什么类型的资源
- sec-fetch-mode :navigate,表示这是一个浏览器的页面切换请求
- sec-fetch-site:表示一个请求发起的来源和目标资源来源之间的关系,cross site :跨域请求, same-origin :同源请求。
- sec-fetch-user :? 1 表示的true。
- upgrade-insecure-requests :1,表示当前浏览器告诉服务器,浏览器是可以处理https 请求的,即使访问的 https 请求中又包含了其他的http请求。
-
user-agent:描述浏览器的信息
-
Content-Type
(用于 POST/PUT 等):请求体(Body)的数据类型(如application/x-www-form-urlencoded
,multipart/form-data
,application/json
)。 -
Content-Length
(用于有 Body 的请求):请求体的大小(字节数)。 -
Authorization
: 包含用于访问受保护资源的凭证(如Basic <credentials>
,Bearer <token>
)。
-
空行 (Empty Line):
-
分隔头部和请求体。
请求体 (Request Body - 可选):
-
包含发送给服务器的数据。主要用于
POST
,PUT
,PATCH
等方法提交表单数据、上传文件或发送 JSON/XML 等结构化数据。 -
GET
,HEAD
,DELETE
,OPTIONS
等方法通常没有请求体。
1.1.2 响应报文
状态行 (Status Line):
-
HTTP 版本
:如HTTP/1.1
。 -
状态码 (Status Code)
:一个三位数字代码,表示请求处理结果(如200 OK
,404 Not Found
,500 Internal Server Error
)。
1xx (信息性响应): 表示请求已被接收,需要继续处理。
100 Continue
: 客户端应继续发送请求体。
101 Switching Protocols
: 服务器应客户端要求切换协议(如升级到 WebSocket)。2xx (成功): 表示请求已成功被服务器接收、理解、并接受。
200 OK
: 请求成功。GET 请求返回资源,POST/PUT 请求返回操作结果。
201 Created
: 请求成功并创建了新资源(通常在 POST 或 PUT 后)。
202 Accepted
: 请求已接受处理,但处理尚未完成(异步操作)。
204 No Content
: 请求成功,但响应没有内容(如 DELETE 成功)。3xx (重定向): 表示需要客户端采取进一步的操作才能完成请求。
301 Moved Permanently
: 请求的资源已永久移动到新 URL(Location 头中)。客户端应更新书签。
302 Found
(曾用名Moved Temporarily
): 请求的资源临时移动到另一个 URL(Location 头中)。客户端本次应访问新 URL,但以后仍可用旧 URL。
304 Not Modified
: 资源未被修改(用于缓存)。客户端可直接使用缓存的版本。
307 Temporary Redirect
: 类似于 302,但要求客户端必须保持原请求方法不变(如 POST 重定向后必须还是 POST)。
308 Permanent Redirect
: 类似于 301,但要求客户端必须保持原请求方法不变。4xx (客户端错误): 表示请求包含语法错误或无法完成。
400 Bad Request
: 请求语法错误或参数无效,服务器无法理解。
401 Unauthorized
: 请求需要用户认证(登录)。通常伴随WWW-Authenticate
头。
403 Forbidden
: 服务器理解请求,但拒绝执行(权限不足)。
404 Not Found
: 服务器找不到请求的资源(URL 错误或资源已被删除)。
405 Method Not Allowed
: 请求中使用的 HTTP 方法不被目标资源支持(如对只读资源用 POST)。
408 Request Timeout
: 服务器在等待请求发送时超时。
429 Too Many Requests
: 客户端在规定时间内发送了过多请求(限流)。5xx (服务器错误): 表示服务器在处理请求时发生错误。
500 Internal Server Error
: 服务器内部错误,无法完成请求(代码崩溃、配置错误等)。
501 Not Implemented
: 服务器不支持完成请求所需的某个功能(如请求了一个未实现的方法)。
502 Bad Gateway
: 作为网关或代理的服务器,从上游服务器收到无效响应。
503 Service Unavailable
: 服务器暂时过载或停机维护,无法处理请求(稍后重试)。
504 Gateway Timeout
: 作为网关或代理的服务器,未能及时从上游服务器获得响应。
-
状态文本 (Reason Phrase)
:对状态码的简短文字描述(如OK
,Not Found
)。 -
示例:
HTTP/1.1 200 OK
或HTTP/1.1 404 Not Found
响应头 (Response Headers):
-
一系列键值对,提供关于响应的额外信息。
-
常见头:
-
Server
: 服务器软件信息(如Apache/2.4.41
,nginx/1.18.0
)。 -
Date
: 响应生成的日期和时间。 -
Content-Type
: 响应体的数据类型(MIME 类型),如text/html; charset=UTF-8
,image/jpeg
,application/json
。 -
Content-Length
: 响应体的大小(字节数)。 -
Content-Encoding
: 响应体使用的压缩编码(如gzip
),指示客户端需要解压。 -
Connection
: 连接选项(如keep-alive
)。 -
Cache-Control
: 指示客户端和中间代理如何缓存此响应。 -
Set-Cookie
: 服务器要求客户端存储一个或多个 Cookie。 -
Location
: 在重定向响应(3xx)中,指定客户端应跳转的新 URL。 -
WWW-Authenticate
: 在 401 Unauthorized 响应中,指定服务器要求的认证方式。
-
空行 (Empty Line):
-
分隔头部和响应体。
响应体 (Response Body - 可选):
-
包含服务器返回给客户端的实际数据内容。最常见的是 HTML 文档,但也可能是图片、视频、CSS、JavaScript、JSON、XML 等。
-
状态码为
204 No Content
或304 Not Modified
的响应通常没有响应体。
1.2 HTTP请求过程和原理
1.2.1 请求过程
1、域名(DNS)解析
-
浏览器解析URL中的域名(如
www.example.com
) -
查询本地DNS缓存 → 系统Hosts文件 → 递归查询DNS服务器 → 获取目标服务器的IP地址(如
93.184.216.34
)。
2、建立TCP连接(三次握手)
-
目的:确保双方具备可靠数据传输能力。
-
端口:HTTP默认 80
3、发送HTTP请求
浏览器构建 HTTP 请求,包括请求行、请求头和请求体;然后将请求发送到服务器。
请求报文结构:
GET /index.html HTTP/1.1 // 请求行(方法+路径+协议版本)
Host: www.example.com // 必需头部
User-Agent: Mozilla/5.0 // 客户端标识
Accept: text/html // 可接受的响应类型
Connection: keep-alive // 保持连接
(空行) // 头部结束标记
(可选请求体,如POST提交的数据) // GET请求无请求体
4、服务器处理请求
-
Web服务器(如Nginx/Apache)接收请求
-
路由解析(匹配URL到具体处理程序)
-
应用逻辑执行(如查询数据库)
-
生成响应内容(HTML/JSON等)。
5、返回HTTP响应
响应报文结构:
HTTP/1.1 200 OK // 状态行(协议版本+状态码)
Content-Type: text/html; charset=utf-8 // 响应数据类型
Content-Length: 1024 // 数据长度
Set-Cookie: session_id=abc123 // 会话管理
(空行) // 头部结束标记
<!DOCTYPE html> // 响应体(实际数据)
<html>...</html>
6、浏览器渲染(客户端侧)
-
解析HTML → 构建DOM树
-
加载CSS/JS → 渲染页面
-
执行JavaScript逻辑。
7、断开TCP连接(四次挥手)
-
HTTP/1.1 默认
keep-alive
(复用连接) -
超时或显式关闭时触发 TCP四次挥手:
1.2.2 核心原理
1、无状态协议
-
每次请求独立,服务器不保存客户端状态
-
解决方案:Cookies/Session/JWT Token 维持会话状态。
- Cookies:服务器通过 Set-Cookie 响应头将状态信息存储在客户端,客户端在后续请求中发送该 Cookie 以维持状态。
- Session:服务器生成一个唯一的会话 ID,存储在 Cookie 中,并在服务器端维护与该会话 ID 关联的状态信息。
- Token:使用 JWT(JSON Web Token)等机制在客户端存储状态信息,客户端在每次请求中发送该 Token。
2、持久连接(HTTP/1.1 Keep-Alive)
-
单TCP连接处理多个请求/响应,减少握手开销
-
对比HTTP/1.0(每个请求新建连接)。
3、管道化技术(Pipelining)
-
客户端连续发送多个请求而不等响应
-
实际因队头阻塞问题被弃用(必须按照请求相同的顺序回送HTTP响应) → HTTP/2 多路复用解决。
1.3 HTTP的不同版本
1.3.1 HTTP1.0
非持久连接:默认情况下,每个 HTTP 请求/响应对之后,连接会被关闭,属于短连接。这意味着对于同一个网站的每个资源请求,如 HTML 页面上的图片和脚本,都需要建立一个新的 TCP 连接。可以设置Connection: keep-alive
强制开启长连接。
1.3.2 HTTP1.1(常用)
持久连接:HTTP 1.1 引入了持久连接(也称为 HTTP keep-alive),默认情况下不会立即关闭连接,可以在一个连接上发送多个请求和响应。极大减轻了 TCP 连接的开销。
持久连接的超时时间:
HTTP/1.1 规范本身没有定义默认的 keep-alive 超时时间。
实际的默认超时时间取决于使用的具体 Web 服务器软件和 HTTP 客户端库/应用程序的配置。
常见 Web 服务器的典型默认值范围在 5 秒到 120 秒之间(例如 Nginx 默认为 75 秒)。
客户端(如浏览器)通常也有自己的默认值(可能几分钟)。
服务器和客户端可以通过
Keep-Alive: timeout=
头部进行协商,最终超时通常由服务器决定或配置。
管道化处理:HTTP 1.1 支持客户端在前一个请求的响应到达之前发送下一个请求,以提高传输效率。有队头阻塞问题(必须按照请求相同的顺序回送HTTP响应)
1.3.3 HTTP2.0(常用)
二进制分帧:将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。帧是数据传输的最小单位, 以二进制传输代替原本的明文传输。这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
多路复用:一个 TCP 连接上可以同时进行多个 HTTP 请求/响应,解决了 HTTP 1.x 的队头阻塞问题。尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输的过程中,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,仍然会阻塞在它之后传输的流数据。
头部压缩:HTTP 协议不带状态,所以每次请求都必须附上所有信息。HTTP 2.0 引入了头部压缩机制,可以使用 gzip 或 compress 压缩后再发送,减少了冗余头部信息的带宽消耗。
服务端推送:服务器可以主动向客户端推送资源,而不需要客户端明确请求。
1.3.4 HTTP3.0
基于QUIC协议(UDP):HTTP/2.0 基于 TCP 协议,而 HTTP/3.0 则基于 QUIC 协议,Quick UDP Connections,直译为快速 UDP 网络连接。基于 UDP 的 QUIC 协议,让不同的流之间真正的实现相互独立传输,互不干扰。
版本 | 核心改进 | 解决的问题 |
---|---|---|
HTTP/1.0 | 支持Header、多种请求方法 | 基础标准化 |
HTTP/1.1 | 持久连接、分块传输 | TCP连接复用 |
HTTP/2 | 二进制分帧、多路复用、头部压缩 | 队头阻塞、性能优化 |
HTTP/3 | 基于QUIC协议(UDP)、0-RTT握手 | TCP队头阻塞、延迟更低 |
相关文章:

应用层协议:HTTP
目录 HTTP:超文本传输协议 1.1 HTTP报文 1.1.1 请求报文 1.1.2 响应报文 1.2 HTTP请求过程和原理 1.2.1 请求过程 1、域名(DNS)解析 2、建立TCP连接(三次握手) 3、发送HTTP请求 4、服务器处理请求 5、返回H…...

复习——C++
1、scanf和scanf_s区别 2、取地址,输出 char ba; char* p&b; cout<<*p; cout<<p; p(char*)"abc"; cout<<*p; cout<<p; cout<<(void*)p; 取地址,把b的地址给p 输出*p,是输出p的空间内的值…...

SPI通信协议(软件SPI读取W25Q64)
SPI通信协议 文章目录 SPI通信协议1.SPI通信2.SPI硬件和软件规定2.1SPI硬件电路2.2移位示意图2.3SPI基本时序单元2.3.1起始和终止条件2.3.2交换一个字节(模式1) 2.4SPI波形分析(辅助理解)2.4.1发送指令2.4.2指定地址写2.4.3指定地…...
PostgreSQL-基于PgSQL17和11版本导出所有的超表建表语句
最新版本更新 https://code.jiangjiesheng.cn/article/368?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 基于pgsql 17.4 研究 查询psql版本:SELECT version(); 查看已知1条建表语句和db中数据关系 SELECT create_hypert…...

JavaWeb:前后端分离开发-部门管理
今日内容 前后端分离开发 准备工作 页面布局 整体布局-头部布局 Container 布局容器 左侧布局 资料\04. 基础文件\layout/index.vue <script setup lang"ts"></script><template><div class"common-layout"><el-containe…...
ArcGIS计算多个栅格数据的平均栅格
3种方法计算多个栅格数据的平均栅格 1->使用“ 栅格计算器”工具 原理就是把多幅影像数据相加,然后除以个数,就能得到平均栅格。 2-> 使用“像元统计数据”工具,如果是ArcGIS pro,则是“像元统计”工具。使用这个工具可以…...

字节开源FlowGram:AI时代可视化工作流新利器
字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器 字节FlowGram创新性地融合图神经网络与多模态交互技术,构建了支持动态拓扑重构的可视化流程引擎。该系统通过引入 f ( G ) ( V ′ , E ′ ) f(\mathcal{G})…...
如何选择合适的分库分表策略
选择合适的分库分表策略需要综合考虑业务特点、数据规模、访问模式、技术成本等多方面因素。以下是系统性的选择思路和关键决策点: 一、核心决策因素 业务需求分析 数据规模:当前数据量(如亿级)、增长速度(如每日新增百…...

(LeetCode 每日一题)3403. 从盒子中找出字典序最大的字符串 I (贪心+枚举)
题目:3403. 从盒子中找出字典序最大的字符串 I 题目:贪心枚举字符串,时间复杂度0(n)。 最优解的长度一定是在[1,n-numFriends]之间。 字符串在前缀都相同的情况下,长度越长越大。 C版本: class Solution { public:st…...

GPIO的内部结构与功能解析
一、GPIO总体结构 总体构成 1.APB2(外设总线) APB2总线是微控制器内部连接CPU与外设(如GPIO)的总线,负责CPU对GPIO寄存器的读写访问,支持低速外设通信 2.寄存器 控制GPIO的配置(输入/输出模式、上拉/下拉等&#x…...
Python训练打卡Day42
Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中,我们经常需要查看或修改模型中间层的输出或梯度。然而,标准的前向传播和反向传播过程通常是一个黑盒,我们很难直接访问中间层的信…...
深度学习中的负采样
深度学习中的负采样 负采样(Negative Sampling) 是一种在训练大型分类或概率模型(尤其是在输出类别很多时)中,用来加速训练、降低计算量的方法。 它常用于: 词向量训练(如 Word2Vecÿ…...

php7+mysql5.6单用户中医处方管理系统V1.0
php7mysql5.6中医处方管理系统说明文档 一、系统简介 ----------- 本系统是一款专为中医诊所设计的处方管理系统,基于PHPMySQL开发,不依赖第三方框架,采用原生HTML5CSS3AJAX技术,适配手机和电脑访问。 系统支持药品管理、处方开…...
Java 大视界 — Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制
/*Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(简化示例)*/// 1. Event.java - 异常事件模型 package com.security.model;public class Event {private String id;private String type; // 如: "入侵", "火警"pr…...

智慧物流园区整体解决方案
该智慧物流园区整体解决方案借助云计算、物联网、ICT 等技术,从咨询规划阶段介入,整合供应链上下游资源,实现物流自动化、信息化与智能化。方案涵盖智慧仓储管理(如自动化立体仓储系统、温湿度监控)、智慧物流(运输管理系统 TMS、GPS 监控)、智慧车辆管理(定位、调度、…...
审批流程管理系统开发记录:layui前端交互的实践
一、需求拆解与技术选型 本次开发围绕企业审批流程管理场景,需实现以下核心功能: 前端申请表单与流程进度可视化底部滑动审批弹窗交互多版本MySQL数据库支持流程数据的增删改查与状态管理技术栈选择: 前端采用LayUI框架,利用其时间线组件(lay-timeline)实现流程进度展示…...

【会员专享数据】1960—2023年我国省市县三级逐年降水量数据(Shp/Excel格式)
之前我们分享过1960-2023年我国0.1分辨率的逐日、逐月、逐年降水栅格数据(可查看之前的文章获悉详情),是研究者Jinlong Hu与Chiyuan Miao分享在Zenodo平台上的数据,很多小伙伴拿到数据后反馈栅格数据不太方便使用,问我…...
2025年精通MVCC
今年找工作,无一例外又问到了MVCC这个知识点。几乎每次换工作都会被问到这个面试有用,工作毫无 * 用的知识。但是环境就是这样,既然如此,我们用一篇文章彻底搞懂MVCC 1.MVCC是什么 MVCC(Multi-Version Concurrency C…...
硬路由与软路由
目录 核心区别 ⚙️ 性能与功能定位 如何选择? 核心区别 硬路由: 本质: 专用的硬件设备。构成: 厂家将特定的路由器操作系统(通常是高度定制化、封闭或精简的)固化在专用的硬件平台上。硬件:…...

OpenCV C++ 心形雨动画
❤️ OpenCV C 心形雨动画 ❤️ 本文将引导你使用 C 和 OpenCV 库创建一个可爱的心形雨动画。在这个动画中,心形会从屏幕顶部的随机位置落下,模拟下雨的效果。使用opencv定制自己的专属背景 目录 简介先决条件核心概念实现步骤 创建项目定义心形结构…...

Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结 上一篇笔记:Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理 目前上来说,这个系列的笔记本质上来说,是对不理解的知识点进行的一个梳理&…...

安卓Compose实现鱼骨加载中效果
安卓Compose实现鱼骨加载中效果 文章目录 安卓Compose实现鱼骨加载中效果背景与简介适用场景Compose骨架屏与传统View实现对比Shimmer动画原理简介常见问题与优化建议参考资料 本文首发地址 https://h89.cn/archives/404.html 背景与简介 在移动应用开发中,加载中占…...
使用qt 定义全局钩子 捕获系统的键盘事件
使用qt 定义全局钩子 捕获系统的键盘事件 即使焦点不在自定义软件上,也能够触发 以下待接口代码: class Hook :public QObject { Q_OBJECT public: Hook(); enum Type { CTRL_E, CTRL_W, SPACE, Enter, C };//自定义枚举,定义“修改”、“撤回…...
FreeType 字体信息检查工具 - 现代C++实现
文章目录 获取字体的版权信息工具简介主要特点1. 现代C实现2. 完整的功能3. 健壮的错误处理4. 国际化支持 使用说明技术亮点 获取字体的版权信息 #include <iostream> // 标准输入输出流库 #include <string> // 字符串处理库 #include <vector>…...
el-table 树形数据,子行数据可以异步加载
1、 <el-tableborder:header-cell-style"tableStyle?.headerCellStyle"ref"tableRef":data"tableData"row-key"id":default-expand-all"false" // 默认不展开所有树形节点:tree-props"{ children: children, hasC…...

【使用JAVA调用deepseek】实现自能回复
在Spring Boot系统中接入DeepSeek服务,并将其提供给用户使用,通常需要以下步骤: 一、准备工作 (1)注册DeepSeek开发者账号 访问DeepSeek官网,注册并创建应用,获取API Key。 API文档࿱…...

【Linux系列】rsync命令详解与实践
博客目录 高效文件同步的艺术:rsync 命令详解与实践rsync 命令解析rsync 的核心优势1. 增量传输:效率的革命2. 归档模式(-a):保留文件所有属性3. 人性化输出(-h)与进度显示(--progress) 实际应用场景1. 文件备份与版本管理2. 跨设备同步3. 大…...

Windows系统工具:WinToolsPlus 之 SQL Server Suspect/质疑/置疑/可疑/单用户等 修复
数据库在数据库列表状态是 Suspect/质疑/置疑/可疑/单用户等 非正常状态时, 使用WinToolsPlus 数据库页签 先设置 数据源 , 选择 需要清理日志的数据库, 点击 Suspect/质疑/置疑/可疑/单用户 按钮即可进修复。 修复过程会有数据库服务停止和启…...

C++——智能指针 unique_ptr
unique_ptr的实现原理:简单粗暴的防拷贝 目录 一、使用C11中的新用法unique_ptr 二、使用c11模拟实现 三、使用c98特性实现 四、模拟实现unique_ptr 五、发现问题 一、使用C11中的新用法unique_ptr 由于限制了拷贝以及赋值 导致缺陷:unique_ptr管理…...

【Python训练营打卡】day43 @浙大疏锦行
DAY 43 复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 我选择的是music_instruments 链接:Musical Instruments (kaggle.com) #导包 import torch import torch.nn as…...