《HTTP权威指南 陈涓 赵振平》读书笔记

news2024/10/1 12:13:37

目录

第一章 HTTP概述

第二章 URL与资源

第三章 HTTP报文

第四章 连接管理

第一章 HTTP概述

1、POST和PUT的区别

  • POST:将客户端数据发送到一个服务器网关应用程序
  • PUT:将来自客户端额数据存储到一个命名的的服务器资源中

2、HTTP报文:格式是纯文本,不是二进制代码,可以很方便的调试和拓展。报文分为请求报文和响应报文,格式很类似,主要包含以下三个部分:起始行、首部字段、(空行)、主体。

3、HTTP协议:应用程协议,网络通信的底层细节由TCP/IP传输协议实现,保证无差错、按序传输、流式数据(可以在任何时刻以任意尺寸将数据发送出去)

4、HTTP协议版本:0.9版本有很严重的设计缺陷,只应该用于老客户端的交互,只支持GET请求,不支持多媒体内容的MIME类型。1.0是一个广泛使用的版本,添加了版本号、各种HTTP首部,一些额外的方法以及多媒体对象的处理,使得包含生动图片的WEB页面和交互表格成为可能。1.0+支持keep-alive长连接、虚拟主机支持、代理连接。1.1是当使用的版本,引入重要的性能优化删除一些不好的特性。2.0重点关注的是性能的大幅优化以及更强大的服务逻辑远程执行框架。

5、WEB的结构组件

  • 代理:位于客户端和服务端之间的HTTP实体,接受所有客户端的HTTP请求转发给服务端,可以对请求进行修改。对于用户客户端来说这样的应用程序就是代理,比如可以进行客户端下载资源检测等。
  • 缓存:HTTP的仓库,使常用的页面副本可以保存在离客户端更近的地方,一种特殊的HTTP代理服务器,将客户端一次请求访问的资源缓存起来,接下来的请求可以从缓存中取出来。
  • 网关:连接其他应用程序的WEB服务器,一种特殊的服务器,作为其他服务器的中间实体使用,通常用于将HTTP流量转换成其他协议。
  • 隧道:对HTTP通信报文进行盲转发的特殊代理,建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序,通常会在一条或者多条HTTP连接上转发非HTTP数据,转发时候不会窥探数据,常见的一种用途就是通过HTTP链接承载加密的安全套接字层(SSL Secure Sockets Layer)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。如HTTPS连接建立的过程是通过HTTP请求先建立一条HTTP/SSL隧道,然后在HTTP信道上传输加密的SSL流量。
  • Agent代理:发起自动HTTP请求的半智能WEB客户端,代表用户发送HTTP请求的客户端程序,如WEB 浏览器。

第二章 URL与资源

1、URL字符集:默认的计算机系统字符集都通常倾向于以英语为中心。很多计算机使用的是US-ASCII字符集,使用7位二进制码表示英文打字机提供的大多数按键和少数不可打印控制字符(用于文本格式和硬件通知)。ASCII码历史悠久,可移植性好,但是能表示的语言太少,因此需要通过一种编码机制,通过转义表示不安全字符。例子

  • “~” :120(0x7E)
  • “空格” :32(0x20)
  • “%” :37(0x25)

在URL中,有几个字符被保留起来,有着特殊的含义,%、/、.、..、#、?、;、:、$,+、@&=、{}、|、\、^、~、[]、<>、0x00-0x1f、0x7f、>0x7f等,对于某些传输协议是支持非安全字符的。

2、常见的WEB方案

  • http
  • https
  • mailto:指向的是Email地址,与其他方案都不太通,他并不指任何可以直接访问的对象,如mailto:joe@joes-hardware.com
  • ftp:作为一种数据访问方案使用
  • rtsp、rtspu:RESP URL 是可以通过实时流传输协议解析的音、视频媒体资源标识符。方案中的u指的是使用UDP来获取资源的。
  • file:一台主机上可以直接访问的文件
  • news:访问特定的文章或者新闻组
  • telnet:交互式业务,通过telnet访问资源

第三章 HTTP报文

1、报文的组成部分:三个部分分别是对报文描述的起始行start line,包含属性的首部header,可选包含数据的主体body部分。起始行和首部是由行分隔符的ASCII码,每行都以一个由两个字符组成的行终止序列作为结束(回车符ASCII是13,换行符ASCII码是10),主体可以包含文本数据与二进制数据,也可以为空,首部的Content-Type说明了主体是什么形式。一个报文可以由0个或多个首部。

2、常用的HTTP方法

  • GET
  • HEAD:从服务器获取响应报文的首部,可以用于检测资源的情况,类型以及是否存在。
  • POST:向服务器发送需要处理的数据
  • PUT:向服务器发送需要存储的数据
  • TRACE:对可能经过代理服务器传送到服务器上的报文进行追踪,TRACE请求主要用于诊断,用于验证请求是否如愿的穿过请求、响应链,请求中不能带有实体的body部分,响应的主体body中是服务器收到请求的精确副本。
  • OPTIONS:请求服务器告知支持的各种功能,可以是方法,或者对某些特殊资源支持哪些方法。 出于安全考虑,并不是所有域名访问后端服务都可以。其实在正式跨域之前,浏览器会根据需要发起一次预检(也就是option请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源或者域)。参考:https://www.jianshu.com/p/5cf82f092201
  • DELETE

3、常见的HTTP状态码:主要被分为5大类

  • 100-199信息类状态码
    • 100-Continue状态码,客户端如果想要在发送包含body的报文之前查看服务器是否会接受他,可以事先发一个携带值为100 Coninue 的 Expect 请求,服务端必须针对这个请求响应,是否接受客户端发送的报文。
  • 200-299成功状态码
    • 200-OK表示请求没问题,实体的主体部分包含了所请求的资源
    • 201-Created用于创建服务器对象的请求如PUT,响应的实体主体部分中应该包含了引用已创建资源的URL保存在Location字段。
    • 202-Accepted请求已被接受,但服务器还未执行任何动作,不能保证服务区会完成这请求。
    • 203-Non-Authoritative Information实体首部包含的信息不是来自于源端服务器,而是来自资源的一份副本,并没对资源的元数据进行校验。
  • 300-399重定向状态码:告知客户端使用替代位置来访问他们所感兴趣的资源,配合可选的Location首部告诉客户端资源以被移走。
    • 300-Multiple Choices客户端请求一个实际指向多个资源的URL时会返回这个状态码,比如服务器上某个HTML不同的语言版本,返回这个状态码会带上一个选项列表,这样用户可以选择。
    • 301-Moved Permanently:请求的URL移除,响应的Location首部应该包含资源所处的URL。
    • 302-Found:类似301,但是在HTTP1.0客户端发起一个POST请求,收到302之后会接受Location首部指定的重定向URL,并向那个URL发送一个GET请求,而不是像原始请求中发起POST请求。但是HTTP1.1规定使用303状态码实现上述行为,为了避开这个问题,HTTP1.1规定使用307代码取代302进行临时重定向。
    • 305-Use Proxy:用来说明必须使用一个代理访问资源,代理的位置使用Location给出。
  • 400-499客户端错误状态码
    • 400错误请求
    • 401未认证
    • 403服务端禁止
    • 404资源找不到
    • 405方法不允许
    • 406服务端不接受此类型body
    • 408客户端处理时间长,服务端关闭连接
  • 500-599服务器错误状态码
    • 500服务器内部错误
    • 501客户端发起的请求超出服务端的能力范围
    • 502网关无法访问
    • 503服务暂时不可用,可以在响应中包含一个Retry-After首部告知什么时候可用。

4、HTTP首部信息,如

在这里插入图片描述

  • 通用首部:请求报文、响应报文都可以拥有
    • Connection:比如keep-alive长连接就是设置在这块。
    • Date:报文创建的时间
    • MIME-Version:给出了发送端使用的MIME版本
    • Trailer:如果报文采用了分块传输编码,就可以用这个首部列出位于报文
    • Transfer-Encoding:报文的编码方式
    • Update:发送端可能想要升级使用的新版本或者协议
    • Via:显示报文经过的中间节点(代理、网关)
  • 请求首部:请求报文特有的,他们为服务器提供一些额外的信息
    • Accept:比如客户端希望接受什么类型的数据
    • Referer:提供了包含当前请求URL的文档URL
    • User-Agent:将发起请求的应用程序名称告知服务器
    • Expect、If-Match、If-Modified-Since、If-Range和Range等条件请求首部:If-Range表示允许对文档的某个范围进行条件请求配合Range来限制资源指定范围。
    • Authorization、Cookie:安全认证请求首部,Cookie是客户端向服务端传送的一个令牌,并不是真正的安全首部,但是确实隐藏了安全功能。
    • Max-Porward、Proxy-Authorization、Proxy-Connection代理请求首部,供代理使用的属性信息。
  • 响应首部:响应报文特有的,以便为客户端提供信息
    • Server:比如客户端在根哪种类型的服务器进行交互
    • Age:响应持续的时间(从最初创建开始)
    • Retry-After:如果资源不可用的话,在此日期或时间重试
    • Warning:比状态码后面的原因短语更详细的一些警告报文
    • Accept-Ranges、Vary协商首部
  • 实体首部:描述HTTP报文的负荷,提供实体及其内容的大量信息,在请求报文和响应报文中都会存在。
    • Allow:列出可以对此实体执行的请求方法
    • Location:告知客户端实体实际存储在那个URL上去
    • Content-xxx:主体body相关,如Content-Type、Content-Ecoding等
    • ETag-资源版本标识符、Expires-缓存失效时间、Last-Modified-实体最后一次被修改的时间:实体缓存首部相关。
  • 扩展首部:非标准的首部,由应用程序开发者创建,由HTTP应用程序转发
  • 通用缓存首部:HTTP/1.0引入第一个允许HTTP应用程序缓存对象本地副本的首部,如Pragma允许缓存,HTTP/1.1改成了Cache-Controller

第四章 连接管理

1、TCP连接:世界上几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是全球计算机和网络设备都使用的常用分组交换网络分层协议集。HTTP连接实际上就是TCP连接及其使用规则,TCP提供一条可靠的比特流传输管道,TCP的数据是通过名为IP分组(IP数据报)的小数据块发送的,可以将HTTP理解 HTTP over TCP over IP 这个协议栈,HTTPS就是在HTTP和TCP之间插入一个TLS、SSL的密码加密层。
在这里插入图片描述
2、TCP套接字API:套接字API允许用户创建TCP的端点数据结构,将这些端点与远程服务器的TCP端点进行连接,并对数据流进行读写,隐藏了底层网络协议和握手细则,以及TCP数据流与IP分组之间的分段和重装细节。

在这里插入图片描述

3、TCP性能:HTTP紧挨着TCP,位于其上层,所以HTTP事务的性能很大程度上取决于底层TCP通道的性能。

4、HTTP事务的时延:与建立TCP连接以及传输请求和响应报文的时间相比,事务处理的时间可能是很短的,除非客户端或者服务端超载或正在处理复杂的动态资源,否则HTTP时延就是有TCP网络时延造成的。HTTP事务的时延主要由一下几种原因,主要取决于硬件速度,网络和服务器的负载,请求和响应报文的大小以及客户端和服务端之间的距离,TCP协议的复杂度同样也会对时延产生巨大的影响。

  • 客户端首先需要根据URI确定Web服务器的IP地址和端口号,如果最近没有对URI中的主机进行访问,通过DNS解析系统将URI中的主机名转换成一个IP地址可能需要花费数10s的时间。
  • 在建立TCP连接通道的时候需要三次握手,会有建立时延,这个值通常只有一两秒中,如果数百个HTTP事务,这个值也会快速叠加上去。
  • 报文的传输时延

5、TCP相关时延

  • TCP三次握手建立连接:现在的TCP栈都允许在客户端第三次握手发送的ACK确认分组中包含需要的真实数据。
  • TCP慢启动拥塞机制:防止网络拥塞的机制,由于这种机制,新连接的传输速度会比已经交换过一定数据的、已经平稳的连接慢一些,所以HTTP中有一些可以重用现存连接的工具。
  • 数据聚集的Nagle算法:TCP有一个数据流接口,应用程序可以通过他将任意尺寸的数据放入TCP栈(即使每次只有一个字节也可以)但是TCP段中包含40个字节的首部标记和首部,如果TCP段中的有用数据太少,网络的性能就会严重下降。Nagle算法试图在发送一个分组之前,将大量的TCP数据绑定在一起,以提高网络效率。Nagle算法鼓励发送全尺寸(LAN上最大的尺寸分组是1500字节,在因特网上是几百字节)的TCP段,如果其他分组仍然在传输过程中,就将那部分数据缓存起来,只有当挂起的分组被确认,或者缓存中积累够了足够发送一个全尺寸分组数据的时候,才会将缓存的数据发送出去。Nagle算法会引发几种HTTP性能问题,首先,小的HTTP报文可以无法填满一个分组,可能会因为等待那些永远不会到来的额外数据产生时延,其次,Nagle算法会阻止数据的发送,直到有确认分组抵达为止,但确认分组自身自身会被延迟确认算法延迟100-200毫秒,可以通过参数TCP_NODELAY禁用Nagle算法,如果这麽做,最好确定向TCP段写入大块数据。
  • 用于捎带确认的TCP延迟确认方法:由于因特网自身无法确保可靠的分组传输(因特网路由器超负载的话可以随意丢弃分组),因此TCP实现了基于滑动窗口的确认机制,现在很多TCP栈都实现了一种"延迟确认"算法,延迟确认算法会在一个特定的窗口时间(通常是100~200ms)内将输出确认放在缓冲区,已寻找能够捎带他的输出报文分组,也就是把去确认信息和输出的报文信息放一块,如果在那个时间没有输出数据分组,就会将确认信息放在单独的分组中传送。但是HTTP具有双峰特征的请求-应答行为降低了捎带信息的可能,导致确认报文一直在缓存中等待,通常延迟确认算法会引入相当大的时延,可以调整或禁止延迟确认算法。
  • TIME_WAIT时延和端口耗尽:当某个客户端TCP端点关闭TCP连接时候,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP、port,这类信息只会维护较短的一段时间,通常是所估计最大分段使用期间的两倍,称为2MSL(通常为两分钟),保证客户端最后发送的ACK能够到达服务器,帮助其正常关闭。

6、HTTP连接的处理

  • 常被误解的Connection首部
  • 串行事务处理时延,假如每次请求资源都需要建立一个请求,那么连接时延和慢启动时延就会叠加起来,会造成速度很慢,几种现存和新兴的方法可以提高HTTP的连接性能,
    • 并行连接:通过多条TCP连接发起并发的HTTP请求资源。即使并行连接的速度可能会更快,但并不一定总是更快,客户端的网络带宽不足导致多个HTTP事务竞争带宽,这样带来的性能提升很小。而且打开大量的连接会消耗很多的内存资源,从而引发自身的性能问题,比如Web服务器需要处理大量的用户连接请求,假如100个用户同时发请求,每个用户打开100个连接,服务器就要负责处理1w个连接,这会造成服务器性能严重下降,对高负荷的代理来说也是同样如此。因此浏览器一般会限制并行连接的数量为一个较小的值(通常是4个),服务器可以随意关闭来自特定客户端的超量连接。
    • 持久连接:重用TCP连接,以消除连接及关闭时延。站点局部性原理指的是用户可能再一段时间内更多访问某站点上的资源,因此再HTTP1.0允许HTTP设备再事务处理结束之后将TCP连接保持打开状态,比如keep-alive支持长连接字段,HTTP1.1的 persistent 连接称为持久连接,可以一定程度避免建立连接、慢启动机制的时延。但是管理持久连接时要特别小心,不然就会累计出大量的空闲连接,耗费本地以及远程客户端和服务器上的资源。使用keep-alive首部是将连接保持在活跃状态,发出keep-alive请求之后,客户端和服务端并不一定会同意进行keep-alive会话,如果同意,需要在响应头中带上keep-alive字段,他们可以在任意时刻关闭空闲的keep-alive连接,另外可以通过选项调节行为,比如timeout参数是响应头keep-alive存在时配置的,他估计服务器希望将连接保持在活跃状态的时间,比如max是在keep-alive存在响应首部发送的,他估计了服务器还希望多少个事务保持此连接的活跃状态。
    • 管道化连接:通过共享的TCP连接发起并发的HTTP请求。
    • 复用的连接:交替传送请求和响应报文。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下通过cwRsync备份到服务器服务器之间使用rsync备份传输

Windows下通过cwRsync备份到服务器&服务器之间使用rsync备份传输 Linux服务器配置Rsync服务端1、安装Rsync2、配置rsyncd.conf3、创建目录、密码文件并修改权限4、启动rsync服务 Windows配置cwRsync客户端1、下载并解压cwRsync客户端2、打开cmd&#xff0c;执行同步命令 Wi…

好程序员:一篇文章看懂JavaScript 学习路线!前端自学!

如果你是一名编程初学者&#xff0c;刚刚学完HTML和CSS&#xff0c;那就不得不接触JavaScript。今天&#xff0c;好程序员给大家分享一篇2023最新版&#xff0c;JavaScript学习路线。 1. HTML and CSS 语法、结构、响应式设计、引导 2. JavaScript语言基础 语法、数据、类型、…

Cloud Studio 高阶玩家:强大的 YAML 模板

Cloud Studio 高阶玩家&#xff1a;强大的 YAML 模板 1. 功能简介 编程免不了要写配置文件&#xff0c;怎么写配置也是一门学问。YAML 是专门用来写配置文件的语言&#xff0c;非常简洁和强大。 了解到一些用户在Cloud Studio开发项目的时候&#xff0c;环境上需要依赖一些组…

Java设计模式-策略模式

简介 在软件开发中&#xff0c;设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式&#xff08;Strategy Pattern&#xff09;是其中一种常见的设计模式&#xff0c;它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类&#xff0c;使得它们…

软件测试项目测试报告总结

测试计划概念&#xff1a;就在软件测试工作实施之前明确测试对象&#xff0c;并且通过资源、时间、风险、测试范围和预算等方面的综合分析和规划&#xff0c;保证有效的实施软件测试。 需求挖掘的6个方面&#xff1a; 1、输入方面 2、处理方面 3、结果输出方面 4、性能需求…

蓝牙耳机怎么挑选?工程师盘点目前最值得入手的蓝牙耳机

蓝牙耳机已经成为手机标配&#xff0c;各大品牌也陆续加入蓝牙耳机行业&#xff0c;市场十分繁荣。我身为从业人员对整个行业有着深入的了解&#xff0c;考虑到很多朋友还不知道蓝牙耳机怎么挑选&#xff0c;我整理了目前最值得入手的蓝牙耳机&#xff0c;分别是&#xff1a; 1…

保护你的 shell脚本

什么是shell&#xff1f; shell 是一种脚本语言 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是 特定格式的指令&#xff0c;系统可以使用脚本解析器 翻译或解析 指令 并执行&#xff08;它不需要编译&#xff09; shell 既是应用程序 又是一种脚本语言&#xff…

1. python学习环境准备

文章目录 前言本专栏文章旨在记录《Python编程从入门到实践》一书的学习笔记。 一、编程环境二、使用步骤1.修改默认python版本2.终端退出python解释器3.编写.py文件4.运行.py文件 三、Python帮助文档的使用总结 前言 本专栏文章旨在记录《Python编程从入门到实践》一书的学习…

N9305语音芯片在新能源车充电桩上的方案

语音芯片技术作为近年来蓬勃发展的人工智能领域的重要组成部分&#xff0c;正在被广泛运用于诸多领域&#xff0c;并为人类生活带来了很多便利和创新。其中&#xff0c;新能源充电桩的运用就是一个很好的例子。随着电动汽车的普及&#xff0c;充电桩的需求量不断增加。为了提高…

BGP路由选择实验

测试环境拓扑图 每一种规则测试完后记得恢复初始状态&#xff01;&#xff01; 各设备BGP Router_ID为loopback 0的地址。 AR1 配置 [V200R003C00] #sysname AR1 # interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.0 # interface LoopBack0ip address 1.1.…

远程桌面连接怎么使用?

远程桌面连接是一种远程控制计算机的技术&#xff0c;它允许用户通过Internet或局域网远程访问另一台计算机的桌面界面。使用远程桌面连接技术&#xff0c;可以帮助用户在家里或在外出时访问工作计算机&#xff0c;或者在不同的地方协作完成任务。在本文中&#xff0c;我们将介…

k8s 基于MutatingWebhookConfiguration实现node超卖和sidecar注入

k8s 基于MutatingWebhookConfiguration实现node超卖和sidecar注入 源码在:https://github.com/Seaiii/MutatingWebhook我写了几个脚本&#xff0c;可以直接运行。 一、MutatingWebhookConfiguration原理 MutatingWebhookConfiguration 是 Kubernetes 中的一种资源对象&#…

【代码随想录】刷题Day31

1.分发饼干 455. 分发饼干 贪心的思路就是&#xff1a;小的饼干尽量去匹配胃口小的孩子&#xff0c;这样才能实现尽可能多孩子吃到。 那么代码就很好写了&#xff1a; 1.排序g和s&#xff0c;这样方便查找小的数 2.饼干的位置不停遍历&#xff0c;对应我们需要一个ret代表当前…

语义分割mask转json

文章目录 1 mask2json ——代码实现1.1 通过mask获取每个类别对应的灰度值1.2 mask 转 json 2 mask2json ——利用工具转2.1支持数据增强2.2 支持多种格式转换 本文介绍两种语义分割mask转json的方法&#xff1a; 方法1&#xff1a;是参考语义分割mask转json&#xff08;改进版…

教你用python的Streamlit库制作可视化网页应用

目录 步骤1&#xff1a;安装 Streamlit步骤2&#xff1a;创建一个新的 Python 文件步骤3&#xff1a;导入必要的库步骤4&#xff1a;编写应用程序代码步骤5&#xff1a;运行应用程序常用组件 当涉及到编写交互式应用程序时&#xff0c;Streamlit 是一个非常流行和强大的 Python…

图神经网络:处理点云

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 简单前置工作学习文献阅读Point的实现模型问题 简单前置工作学…

用项目管理思维来过5·20,真实太酷啦!

明天就是一年一度的520啦&#xff0c;阿道单身多年的同事刚京在四月成功使用SWOT分析模型相亲成功&#xff0c;牵手女嘉宾。二人眼看着就要迎来在一起后的第一个节日520&#xff0c;刚京却因为没有头绪而陷入了不知所措的焦虑。 团队成员齐上阵&#xff0c;用项目管理思维&…

使用 Apache Flink 开发实时 ETL

Apache Flink 是大数据领域又一新兴框架。它与 Spark 的不同之处在于&#xff0c;它是使用流式处理来模拟批量处理的&#xff0c;因此能够提供亚秒级的、符合 Exactly-once 语义的实时处理能力。Flink 的使用场景之一是构建实时的数据通道&#xff0c;在不同的存储之间搬运和转…

<组件封装:Vue + elementUi 通过excel文件实现 “ 批量导入 ” 表单数据,生成对应新增信息 >

Vue elementUi 通过excel文件实现 “ 批量导入 ” 表单数据&#xff0c;生成对应新增信息 &#x1f449; 前言&#x1f449; 一、封装组件对应API及绑定事件> Attributes> Event &#x1f449; 二、实现案例> HTML父组件模板> 子组件模板 &#x1f449; 三、效果演…

线程相关基础知识

一、相关概念 1.1 cpu 中央处理器&#xff08;central processing unit, 简称cpu &#xff09;&#xff0c;计算机系统的 运算 和 控制 核心 1.2 cpu核心数和线程数 cpu核心数指cpu 内核数量&#xff0c;如双核、四核、八核。 cpu线程数是一种逻辑的概念&#xff0c;就是模…