当前位置: 首页 > news >正文

【Java 面试 八股文】计算机网络篇

操作系统篇

    • 1. 什么是HTTP? HTTP 和 HTTPS 的区别?
    • 2. 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?
    • 3. 如何理解UDP 和 TCP? 区别? 应用场景?
      • 3.1 TCP 和 UDP 的特点
      • 3.2 适用场景
    • 4. 如何理解TCP/IP协议?
    • 5. DNS协议 是什么?说说DNS 完整的查询过程?
      • 5.1 什么是 DNS 协议?
      • 5.2 DNS 解析的完整查询过程
      • 5.3 DNS 查询的类型
      • 5.4 DNS 解析优化
    • 6. 说说 HTTP1.0/1.1/2.0 的区别?
      • 6.1 HTTP 1.0
      • 6.2 HTTP 1.1
      • 6.3 HTTP 2.0
      • 6.4 HTTP 3.0(基于 QUIC)
      • 总结
    • 7. 说说HTTP 常见的状态码有哪些,适用场景?
    • 8. 说一下 GET 和 POST 的区别?
    • 9. 说说 HTTP 常见的请求头有哪些? 作用?
    • 10. 说说地址栏输入 URL 敲下回车后发生了什么?
    • 11. 说说TCP为什么需要三次握手和四次挥手?
      • 三次握手(TCP 建立连接)
      • 四次挥手(TCP 断开连接)
    • 12. 说说对WebSocket的理解?应用场景?

1. 什么是HTTP? HTTP 和 HTTPS 的区别?

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于客户端(浏览器)和服务器之间通信的协议,主要用于传输网页数据,如HTML、CSS、JavaScript以及API请求等。它是无状态的,即每个请求都是独立的,服务器不会记录之前的请求信息。

HTTP 和 HTTPS 的区别:

1. 安全性:

  • HTTP:数据是明文传输的,容易被中间人攻击、窃听和篡改。
  • HTTPS:使用 SSL/TLS(安全套接层/传输层安全协议) 加密数据,提高数据的机密性和完整性,防止信息被窃取或篡改。

2. 端口号:

  • HTTP 默认使用 80 端口。
  • HTTPS 默认使用 443 端口。

3. 证书:

  • HTTP 不需要任何证书。
  • HTTPS 需要由 CA(证书颁发机构) 签发的 SSL/TLS 证书 进行身份认证,确保通信方的真实性。

4. 性能:

  • 由于 HTTPS 需要进行加密和解密,理论上比 HTTP 稍慢,但现代硬件优化(如 TLS 1.3)使 HTTPS 的性能影响可以忽略不计。

总结:
HTTPS 相比 HTTP 更安全,能够有效防止数据泄露,尤其适用于涉及用户隐私和敏感信息的场景,如登录页面、支付页面等。因此,现在大部分网站都推荐使用 HTTPS。


2. 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

HTTPS 比 HTTP 更安全,主要是因为它在 HTTP 的基础上加入了 SSL/TLS(安全套接层/传输层安全协议),通过加密、身份验证和数据完整性保护来防止数据被窃取、篡改或伪造。

HTTPS 主要通过以下三方面来提升安全性:

1. 数据加密(防窃听)

  • HTTPS 采用 对称加密非对称加密 结合的方式,确保数据在传输过程中是加密的,即使黑客截获数据包,也无法解密。
  • 非对称加密(RSA、ECDSA):用于安全地交换对称密钥。
  • 对称加密(AES、ChaCha20):用于数据的高速加密传输。

2. 认证机制(防中间人攻击)

  • HTTPS 采用 SSL/TLS 证书 来验证服务器的身份,防止用户访问伪造网站。
  • CA(证书颁发机构) 颁发的 数字证书 可以保证网站的真实性,避免钓鱼攻击和中间人攻击。

3. 数据完整性(防篡改)

  • HTTPS 使用 消息摘要算法(如 SHA-256) 计算数据的哈希值,并通过 HMAC(哈希消息认证码) 进行完整性校验,确保数据在传输过程中不会被篡改。
  • 若数据被篡改,接收方计算出的哈希值与发送方的不匹配,通信将被中断。

总结
HTTPS 通过 加密 确保数据不被窃听,通过 身份认证 防止钓鱼网站,通过 完整性校验 防止数据被篡改,因此比 HTTP 更安全。现在,大部分网站、银行系统、电商平台等都采用 HTTPS 来保障数据安全。


3. 如何理解UDP 和 TCP? 区别? 应用场景?

3.1 TCP 和 UDP 的特点

UDP(User Datagram Protocol,用户数据报协议)和 TCP(Transmission Control Protocol,传输控制协议)是两种常见的 传输层协议,它们在数据传输方式、可靠性、连接管理等方面存在明显区别。

UDP(User Datagram Protocol),用户数据包协议,是一个简单的 面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层。

特点如下:

  • UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务
  • 传输途中出现丢包,UDP 也不负责重发
  • 当包的到达顺序出现乱序时,UDP没有纠正的功能。
  • 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为

TCP(Transmission Control Protocol),传输控制协议,是一种可靠、面向字节流的通信协议,把上面应用层交下来的数据看成无结构的字节流来发送

特点如下:

  • TCP充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。
  • 此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
  • 根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)
特性TCP(面向连接)UDP(无连接)
连接方式需要 三次握手 建立连接,通信前后需要维护连接无需连接,直接发送数据
可靠性可靠传输:有确认机制(ACK)、重传机制、流量控制和拥塞控制不可靠传输:无确认机制,可能丢包
数据顺序有序传输,接收方能按顺序组装数据无序传输,可能乱序到达
传输效率较低(因需保证可靠性)较高(因无连接管理,减少开销)
数据单位字节流 传输,无固定边界数据报(Datagram) 传输,具有边界
应用场景适用于数据可靠性高的场景,如文件传输、Web请求 适用于实时性高丢包可接受的场景,如视频通话、直播、DNS查询

3.2 适用场景

适用于 TCP 的场景(强调可靠性)

  • HTTP/HTTPS(网页浏览):网页加载需要完整的数据,不允许丢失
  • FTP(文件传输):传输文件时必须保证数据完整性
  • SMTP/POP3/IMAP(电子邮件):邮件内容不能丢失或错乱
  • 数据库连接(MySQL、PostgreSQL):数据交互需要高可靠性

适用于 UDP 的场景(强调实时性)

  • 视频直播、在线会议(如 Zoom、直播推流):即使丢失部分数据,也要保证流畅
  • 在线游戏:丢包影响不大,低延迟比数据完整性更重要
  • DNS(域名解析):查询请求很短,丢失可重试,无需建立连接
  • VoIP(网络语音通话):轻微丢包不会影响通话体验,减少延迟更重要

4. 如何理解TCP/IP协议?

TCP/IP(Transmission Control Protocol/Internet Protocol)是一组用于 互联网通信 的协议,它定义了计算机如何通过网络进行数据传输。TCP/IP 是 分层协议,确保数据能够从一台计算机可靠地传输到另一台计算机。

TCP/IP 的分层模型

TCP/IP 层对应 OSI 层主要协议作用
应用层应用层、表示层、会话层HTTP、HTTPS、FTP、SMTP、DNS提供具体应用服务(如网页浏览、邮件等)
传输层传输层TCP、UDP负责端到端通信,提供可靠或非可靠传输
网络层网络层IP、ICMP、ARP负责寻址与路由,将数据包从源传输到目标
链路层数据链路层、物理层以太网、Wi-Fi、PPP负责物理设备间的通信

TCP/IP 是互联网通信的核心协议,提供数据传输的基础。
TCP 负责可靠传输,IP 负责寻址和路由。
TCP 适用于可靠传输场景,UDP 适用于高实时性场景。


5. DNS协议 是什么?说说DNS 完整的查询过程?

5.1 什么是 DNS 协议?

DNS(Domain Name System,域名系统)是一种 将域名转换为 IP 地址 的协议。由于人们更容易记住 www.google.com 这样的域名,而计算机网络使用 IP 地址(如 142.250.190.14)来标识服务器,因此 DNS 充当了 域名解析服务,帮助用户找到目标服务器的 IP 地址。

DNS 是 应用层协议,通常使用 UDP 53 端口 进行查询,但某些情况下(如大数据包或安全需求)会使用 TCP 53 端口。

5.2 DNS 解析的完整查询过程

当用户在浏览器中输入 www.example.com 并回车后,DNS 解析过程如下:

📌 查询步骤:

1. 浏览器缓存(本地缓存):

  • 浏览器会先检查本地缓存(如之前访问过 www.example.com)。
  • 如果有对应的 IP 地址,则直接使用,无需 DNS 查询

2. 操作系统缓存(本机 DNS 缓存):

  • 如果浏览器没有找到,会向操作系统(ipconfig /displaydns)查询本机缓存。
  • 如果缓存中有,则直接返回。

3. 本地 DNS 服务器(ISP 提供的解析服务器)

  • 如果本机缓存中没有,操作系统会向 本地 DNS 服务器(通常由 ISP 提供,如电信、联通、移动)查询。
    本地 DNS 服务器如果有缓存,就直接返回 IP 地址(递归查询)

4. 根 DNS 服务器(Root Servers):

  • 若本地 DNS 服务器没有缓存,它会向 根 DNS 服务器 发起请求(全球 13 个根服务器,如 .)。
  • 根服务器不会直接返回 IP,而是告诉本地 DNS 去找 顶级域(TLD)DNS 服务器(如 .com)。

5. 顶级域(TLD)DNS 服务器(如 .com 服务器):

  • TLD 服务器负责管理 .com.cn.net 等顶级域。
  • 它会告诉本地 DNS,去找 权威 DNS 服务器(如 example.com 的 DNS 服务器)。

6. 权威 DNS 服务器(Authoritative DNS):

  • 该服务器存储了 example.com 的真实 IP 地址,并返回给本地 DNS 服务器。

7. 本地 DNS 服务器缓存并返回:

  • 本地 DNS 服务器缓存该结果,减少下次查询时间。
  • 然后返回给客户端(用户设备)。

8.浏览器与服务器建立连接

  • 解析完 IP 地址后,浏览器使用 TCP/IP 与目标服务器建立 HTTP/HTTPS 连接。

5.3 DNS 查询的类型

  • 递归查询(Recursive Query)
    本地 DNS 服务器 负责查到底,直到找到 IP 地址(用户 → 本地 DNS → 找 IP)。
  • 迭代查询(Iterative Query)
    本地 DNS 服务器 逐步向上查询,直到找到 IP 地址(本地 DNS → 根 DNS → TLD DNS → 权威 DNS)。

5.4 DNS 解析优化

  • 本地缓存(浏览器、系统、DNS 服务器缓存)加速解析。
  • CDN(内容分发网络) 通过就近服务器提供解析,提高访问速度。
  • 负载均衡 通过多个 IP 地址优化解析,减少服务器压力。

6. 说说 HTTP1.0/1.1/2.0 的区别?

HTTP(HyperText Transfer Protocol)是 超文本传输协议,主要用于 客户端(浏览器)和服务器之间的数据通信。随着 Web 需求的增长,HTTP 先后经历了 HTTP/1.0 → HTTP/1.1 → HTTP/2.0 的演进,提升了性能、并发能力和安全性。

6.1 HTTP 1.0

特点:

  • 无连接(非持久连接):每次请求都要建立 TCP 连接,完成后立刻关闭,导致 资源浪费
  • 串行请求:浏览器请求资源时,每个请求必须等上一个完成才能继续,低效
  • 无 Host 头:不支持虚拟主机,多个网站共用同一 IP 时,服务器无法识别请求属于哪个网站。
  • 不支持压缩:数据传输量大,加载慢。

缺点:

  • 每个请求都会创建新连接,增加服务器开销
  • 队头阻塞(Head-of-line Blocking):必须等待前一个请求完成,才能发送下一个。

6.2 HTTP 1.1

相较 HTTP/1.0 的改进:

支持持久连接(Keep-Alive)

  • 默认 复用 TCP 连接,多个请求可复用一个 TCP 连接,减少 频繁建立/断开连接的开销
  • 通过 Connection: keep-alive 头部控制。

支持管道化(Pipelining)

  • 允许多个请求同时发送,不必等待前一个请求结束(但仍会受到队头阻塞影响)。

支持 Host 头

  • 允许在同一 IP 地址上托管多个网站(虚拟主机)。

支持分块传输(Chunked Transfer Encoding)

  • 服务器可以 逐块 发送数据,不必等全部内容生成后再返回,提升性能。

增加缓存控制(Cache-Control)

  • 增加 Cache-Control 头,支持 缓存管理,减少重复请求。

断点续传(Range 请求)

  • 允许客户端请求某个资源的一部分(如视频流),提升下载体验。

缺点:

  • 仍然存在队头阻塞(HOL Blocking),同一 TCP 连接仍需等待上一个请求完成。
  • 不支持多路复用,并发请求仍需多个 TCP 连接。

6.3 HTTP 2.0

HTTP/2 主要优化了性能,解决了 HTTP/1.1 并发低的问题。

二进制帧传输(Binary Framing)

  • HTTP/1.x 使用 纯文本,HTTP/2 使用 二进制(更高效)。
  • 结构化数据传输,减少解析成本。

多路复用(Multiplexing)——最大改进点

  • 允许 多个请求同时在一个 TCP 连接上传输,而不会互相阻塞,消除队头阻塞
  • 之前 HTTP/1.1 一个 TCP 连接一次只能传输一个请求,HTTP/2 一个连接可并行处理多个请求

✅ Header 压缩(HPACK):

  • HTTP/1.x 的请求头较大,每次请求都要携带,浪费带宽。
  • HTTP/2 采用 HPACK 压缩算法,减少 重复头部,提升传输效率。

✅ 服务器推送(Server Push):

  • 服务器可主动推送资源(如 CSS、JS),减少客户端请求,提高加载速度。

缺点:

  • 仍然基于 TCP,虽然解决了 HTTP/1.1 的队头阻塞问题,但 TCP 层仍可能有 队头阻塞。
  • 服务器需额外支持 HTTP/2,如 Nginx 需开启 HTTP/2 配置。
  • 浏览器和服务器都需支持 HTTP/2(现代浏览器基本支持)。

6.4 HTTP 3.0(基于 QUIC)

HTTP/2 仍然基于 TCP,而 TCP 本身有队头阻塞问题。HTTP/3 采用 QUIC(基于 UDP),解决了 TCP 的缺陷。

  • 使用 QUIC 协议(基于 UDP),减少握手延迟
  • 连接迁移能力更强(适用于移动网络)
  • 完全消除 TCP 层队头阻塞
  • 更安全(默认 TLS 1.3)

总结

版本对比总结

特性HTTP/1.0HTTP/1.1HTTP/2.0HTTP/3.0
连接复用❌ 每次请求建立新 TCP 连接✅ Keep-Alive✅ 多路复用✅ QUIC 连接复用
管道化✅ 支持✅ 完全支持
队头阻塞✅ 串行请求✅ 仍存在❌ 解决(应用层)❌(TCP 层也解决)
数据传输格式文本文本二进制二进制
Header 压缩✅ HPACK✅ QPACK
服务器推送✅ 支持
使用协议TCPTCPTCPQUIC(基于 UDP)

候选人回答:

HTTP1.0、HTTP1.1 和 HTTP2.0 主要在连接管理并发性能数据传输方式上有所不同。HTTP1.0 每次请求都要建立新的 TCP 连接,开销大性能低下。HTTP1.1 通过 Keep-Alive 复用 TCP 连接,支持管道化请求,但仍然存在队头阻塞。HTTP2.0 采用二进制帧传输,并引入多路复用机制,使得多个请求可以共享同一个 TCP 连接并行传输,从而提高了并发能力。同时,HTTP2.0 还支持头部压缩(HPACK)和服务器推送,进一步减少了数据传输的冗余和延迟。总体来说,HTTP2.0 相较于 HTTP1.1 提升了网络效率,减少了延迟。


7. 说说HTTP 常见的状态码有哪些,适用场景?

HTTP 状态码用于表示服务器对客户端请求的响应情况,常见的状态码包括以下几类:

  • 1xx(信息响应):表示请求已接收,需进一步操作。
    • 100 Continue:表示服务器已接收到请求的部分数据,客户端可继续发送剩余部分。
  • 2xx(成功响应):表示请求成功。
    • 200 OK:请求成功,服务器返回正常数据(常见于 GET 请求)。
    • 201 Created:请求成功,并且资源已被创建(常见于 POST 请求)。
    • 204 No Content:请求成功,但无返回内容(常见于 DELETE 请求)。
  • 3xx(重定向):客户端需执行额外操作才能完成请求。
    • 301 Moved Permanently:资源已永久移动,客户端应使用新的 URL 访问。
    • 302 Found(临时重定向):资源临时移动,客户端仍可使用原 URL。
    • 304 Not Modified:资源未修改,客户端可使用本地缓存版本。
  • 4xx(客户端错误):请求错误,需客户端修正。
    • 400 Bad Request:请求格式错误,服务器无法解析。
    • 401 Unauthorized:请求未认证,需提供身份凭证(如 JWT、OAuth)。
    • 403 Forbidden:服务器拒绝请求(权限不足)。
    • 404 Not Found:资源不存在(URL 错误或资源被删除)。
  • 5xx(服务器错误):服务器处理请求时发生错误。
    • 500 Internal Server Error:服务器内部错误,无法完成请求。
    • 502 Bad Gateway:服务器作为网关或代理,收到无效响应。
    • 503 Service Unavailable:服务器暂时无法处理请求(可能是过载或维护中)。

8. 说一下 GET 和 POST 的区别?

GETPOST,两者是 HTTP 协议中发送请求的方法。
GET 方法 从服务器获取指定的资源
POST 方法根据请求负荷(报文body)对指定的资源做出处理

主要区别:

1. 请求参数传递方式:

  • GET:参数通过 URL 传递,拼接在 URL 后面,参数可见,格式为 ?key=value&key2=value2
  • POST:参数放在 请求体(body) 中,数据不可见,适合传输敏感信息或大数据量。

2. 安全性:

  • GET:由于参数暴露在 URL 中,容易被篡改、缓存,不适合传输敏感数据(如密码)。
  • POST:数据放在请求体中,相对安全,但仍需要 HTTPS 加密来增强安全性。

3. 请求长度限制:

  • GET:由于 URL 长度限制(不同浏览器和服务器有所不同,一般为 2048 字符),不适合大数据提交。
  • POST:理论上无大小限制(但服务器可以自行设定最大请求体大小)。

4. 幂等性

  • GET:幂等,即多次请求相同资源不会改变服务器状态,适用于查询操作。
  • POST:非幂等,每次请求可能导致数据变化(如新增用户、提交订单)。

5. 浏览器缓存:

  • GET:浏览器可缓存 GET 请求的结果,提高性能。
  • POST:默认不会被缓存,需要手动设置。

总结来说,GET 适用于查询数据,速度快但不适合传输敏感信息或大数据,而 POST 适用于提交数据,安全性更高,适合修改服务器资源


9. 说说 HTTP 常见的请求头有哪些? 作用?

HTTP 请求头(Headers)用于在客户端和服务器之间传递额外的信息,常见的请求头包括以下几类:

1. 通用请求头(General Headers)

  • Host:指定服务器的域名和端口,如 Host: example.com:8080,用于虚拟主机识别。
  • Connection:控制连接状态,如 Connection: keep-alive(保持连接)或 Connection: close(请求完成后关闭连接)。
  • User-Agent:标识客户端信息,如浏览器或爬虫。
  • Accept:客户端可接受的数据类型,如 Accept: text/html, application/json,用于服务器返回合适的内容。
  • Accept-Encoding:指定支持的编码方式,如 gzip, deflate, br,服务器可返回压缩内容以减少流量。
  • Accept-Language:指定客户端可接受的语言,如 Accept-Language: zh-CN, en-US

2. 资源请求相关头

  • Referer:表明请求的来源页面,如 Referer: https://example.com/page1,用于防止 CSRF 攻击。
  • Origin:类似 Referer,但只包含协议和域名,如 Origin: https://example.com,用于 CORS 认证。

3. 认证与安全相关头

  • Authorization:用于身份验证,如 Authorization: Bearer <token>(OAuth 令牌认证)。
  • Cookie:用于在请求中携带会话信息,如 Cookie: sessionId=abc123,服务器可基于 Cookie 识别用户状态。

4. 内容传输相关头

  • Content-Type:声明请求体的数据格式,如:
    • Content-Type: application/json(JSON 格式)
    • Content-Type: application/x-www-form-urlencoded(表单提交)
    • Content-Type: multipart/form-data(文件上传)
  • Content-Length:表示请求体的字节大小,如 Content-Length: 348,用于服务器解析请求数据。

5. 缓存控制相关头

  • Cache-Control:控制缓存策略,如:
    • Cache-Control: no-cache(不使用缓存)
    • Cache-Control: max-age=3600(缓存 1 小时)
  • If-Modified-Since:携带资源的上次修改时间,配合 304 Not Modified,避免重复下载数据。
  • If-None-Match:携带资源的 ETag(唯一标识符),服务器可比较是否更新,减少不必要的传输。

这些请求头在 HTTP 请求中起到了控制缓存、身份验证、数据格式等关键作用。例如,Authorization 头用于携带 JWT 令牌,Accept 头用于指定响应格式,而 Content-Type 头则决定了 POST 请求传输的数据格式。


10. 说说地址栏输入 URL 敲下回车后发生了什么?

当我们在浏览器地址栏输入 URL 并按下回车后,浏览器会经历一系列步骤来加载网页,主要过程如下:

1. URL 解析
浏览器首先解析用户输入的 URL,如果省略了 http://https://,会默认添加协议(通常是 HTTPS)。

2. DNS 解析(域名解析)
浏览器需要将域名(如 example.com)解析为 IP 地址,解析过程包括:

  • 浏览器缓存(检查是否已解析过该域名)
  • 本地 DNS 缓存(操作系统维护的解析记录)
  • 本地 DNS 服务器(ISP 提供的解析服务器)
  • 递归查询根 DNS 服务器 → 顶级域名(TLD)服务器 → 权威 DNS 服务器,获取最终 IP

3. 建立 TCP 连接
浏览器使用解析出的 IP 地址,与服务器建立 TCP 三次握手 连接(如果是 HTTPS,则额外进行 TLS/SSL 握手)。

  • 第一次握手:客户端发送 SYN(请求建立连接)
  • 第二次握手:服务器返回 SYN-ACK(同意建立连接)
  • 第三次握手:客户端发送 ACK,连接建立

4. 发送 HTTP 请求
浏览器向服务器发送 HTTP 请求,常见内容包括:

  • 请求方法(如 GET /index.html HTTP/1.1
  • 请求头(如 User-AgentAcceptCookie
  • 请求体(仅 POST/PUT 等请求携带数据)

5. 服务器处理请求
服务器收到请求后,处理请求并返回 HTTP 响应,流程包括:

  • 检查路由(确定请求的资源,如静态文件或 API)
  • 查询数据库(如果请求涉及动态数据)
  • 执行业务逻辑
  • 生成 HTML、JSON 等数据

6. 服务器返回 HTTP 响应
服务器返回 HTTP 响应,包括:

  • 状态码(如 200 OK404 Not Found
  • 响应头(如 Content-Type: text/htmlSet-Cookie
  • 响应体(HTML 页面或 JSON 数据)

7. 浏览器解析与渲染页面

  • 解析 HTML,构建 DOM 树
  • 解析 CSS,构建 CSSOM 树
  • 执行 JavaScript(如动态渲染、Ajax 请求)
  • 合成渲染树并绘制页面

11. 说说TCP为什么需要三次握手和四次挥手?

三次握手(TCP 建立连接)

三次握手用于确保客户端和服务器之间的连接是可靠的,并且双方都准备好发送和接收数据。

1. 第一次握手(客户端 → 服务器)

  • 客户端向服务器发送 SYN(同步)标志位为 1 的数据包,表示请求建立连接。
  • 这个数据包中还包含客户端的初始序列号(Sequence Number),用来同步数据流的编号。

2. 第二次握手(服务器 → 客户端):

  • 服务器接收到客户端的 SYN 包后,返回一个 SYN-ACK(同步-确认)包,表示同意建立连接并同步服务器的初始序列号。
  • 该包中的确认号为客户端发送的序列号 + 1,表示已接收到客户端的请求。

3. 第三次握手(客户端 → 服务器)

  • 客户端收到服务器的 SYN-ACK 包后,发送一个 ACK(确认)包,表示连接建立完成,确认号为服务器的序列号 + 1。
  • 一旦服务器收到该确认包,连接建立完成,数据传输可以开始。

为什么需要三次握手?

  • 第一次握手:客户端发送网络包,服务端收到了 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的
  • 第二次握手:服务端发包,客户端收到了 这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常
  • 第三次握手:客户端发包,服务端收到了。 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常
  • 通过三次握手,就能确定双方的接收和发送能力是正常的

为什么不是两次握手?

  • 如果是两次握手,发送端可以确定自己发送的信息能对方能收到,也能确定对方发的包自己能收到,但接收端只能确定对方发的包自己能收到 无法确定自己发的包对方能收到
  • 并且两次握手的话, 客户端有可能因为网络阻塞等原因会发送多个请求报文,延时到达的请求又会与服务器建立连接,浪费掉许多服务器的资源

四次挥手(TCP 断开连接)

四次挥手用于可靠地断开连接,确保双方都完全关闭连接,防止数据丢失。

1. 第一次挥手(客户端 → 服务器)

  • 客户端发送 FIN(终止)包,表示客户端没有数据发送完毕,要求关闭连接。
  • 这个包的序列号是客户端的最后一个数据包的序列号,客户端告知服务器它的数据已经发送完。

2. 第二次挥手(服务器 → 客户端)

  • 服务器收到 FIN 包后,返回 ACK 包,确认客户端的连接关闭请求。
  • 服务器表示已经收到了客户端的关闭连接请求,但可能还有数据要发送,所以并不立即关闭连接。

3. 第三次挥手(服务器 → 客户端)

  • 服务器准备好关闭连接后,发送 FIN 包,表示服务器的数据也已发送完毕,要求关闭连接。

4. 第四次挥手(客户端 → 服务器)

  • 客户端收到服务器的 FIN 包后,发送 ACK 包确认,表示客户端也准备好关闭连接。
  • 至此,连接双方都已关闭连接,TCP 连接完全断开。

四次挥手的原因

  • 服务端在收到客户端断开连接 Fin 报文后,并不会立即关闭连接,而是先发送一个 ACK 包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送 FIN 报文断开连接,因此需要四次挥手。

12. 说说对WebSocket的理解?应用场景?

WebSocket 是一种用于在客户端和服务器之间建立 全双工通信 的协议。与传统的 HTTP 协议不同,WebSocket 允许客户端和服务器之间的 持续连接,可以在双方之间实时双向传输数据。

WebSocket 的特点

  • 全双工通信:WebSocket 在客户端和服务器之间建立了一个持久的连接,双方可以在同一连接上相互发送数据,而不需要每次都建立新的连接。
  • 实时性:一旦建立连接,服务器可以随时向客户端推送数据,客户端也可以随时向服务器发送数据,避免了传统 HTTP 请求-响应模式的延迟。
  • 较低的开销:由于 WebSocket 使用的是单一的连接,避免了 HTTP 每次请求都需要建立连接的高开销。协议的握手阶段仅发生一次,数据传输更高效。
  • 支持二进制数据:WebSocket 不仅支持文本数据的传输,还支持二进制数据(如图片、音频等)的传输,这使得它能够应用于更多的场景。

WebSocket 与 HTTP 的区别

  • HTTP 是无状态的,每次请求都需要建立新的连接,而 WebSocket 通过一次握手建立连接后,保持长时间连接,可以多次交换数据。
  • HTTP 是请求-响应模型,每次客户端发起请求,服务器返回响应,而 WebSocket 是双向的,客户端和服务器可以随时互相发送消息。
  • HTTP 不支持实时通信,而 WebSocket 支持实时双向通信,适合需要低延迟和实时更新的应用。

WebSocket 的应用场景:

  • 弹幕
  • 媒体聊天
  • 协同编辑
  • 基于位置的应用
  • 体育实况更新
  • 股票基金报价实时更新

相关文章:

【Java 面试 八股文】计算机网络篇

操作系统篇 1. 什么是HTTP? HTTP 和 HTTPS 的区别?2. 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的&#xff1f;3. 如何理解UDP 和 TCP? 区别? 应用场景?3.1 TCP 和 UDP 的特点3.2 适用场景 4. 如何理解TCP/IP协议?5. DNS协议 是什么&#xff1f;说说DNS 完整的查询…...

OpenHarmony5.0分布式系统源码实现分析—软总线

一、引言 OpenHarmony 作为一款面向万物互联的操作系统&#xff0c;其分布式软总线&#xff08;Distributed SoftBus&#xff09;是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络&#xff0c;使得不同设备能够无缝连接、通信和协同工作。本…...

Spring Boot/Spring Cloud 整合 ELK(Elasticsearch、Logstash、Kibana)详细避坑指南

我们在开发中经常会写日志&#xff0c;所以需要有个日志可视化界面管理&#xff0c;使用ELK可以实现高效集中化的日志管理与分析&#xff0c;提升性能稳定性&#xff0c;满足安全合规要求&#xff0c;支持开发运维工作。 下述是我在搭建ELK时遇到的许许多多的坑&#xff0c;希望…...

云原生周刊:Istio 1.25.0 正式发布

开源项目推荐 Dstack Dstack 是一个开源的 AI 计算管理平台&#xff0c;旨在简化 AI 任务的部署和管理。它支持本地和云端运行 AI 工作负载&#xff0c;并提供自动化的 GPU 资源调度&#xff0c;使开发者能够更高效地利用计算资源。Dstack 兼容 K8s&#xff0c;可以无缝集成到…...

微前端如何拯救大型项目

前言 在前端开发的世界中&#xff0c;我们经常会遇到这样的问题&#xff1a;一个大型项目往往由多个团队共同开发&#xff0c;每个团队负责一部分功能。然而&#xff0c;随着项目的不断扩大和复杂化&#xff0c;前端代码库变得越来越庞大和难以维护。这时&#xff0c;微前端&a…...

RabbitMQ 高级特性:从 TTL 到消息分发的全面解析 (下)

RabbitMQ高级特性 RabbitMQ 高级特性解析&#xff1a;RabbitMQ 消息可靠性保障 &#xff08;上&#xff09;-CSDN博客 RabbitMQ 高级特性&#xff1a;从 TTL 到消息分发的全面解析 &#xff08;下&#xff09;-CSDN博客 引言 RabbitMQ 作为一款强大的消息队列中间件&#xff…...

OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案

前言&#xff1a;最近 Manus 火得一塌糊涂啊&#xff0c;OpenManus 也一夜之间爆火&#xff0c;那么作为程序员应该来尝尝鲜 1、前期准备 FastGithub&#xff1a;如果有科学上网且能正常访问 github 则不需要下载此软件&#xff0c;此软件是提供国内直接访问 githubGit&#…...

Ubuntu22.04修改root用户并安装cuda

由于本人工作原因&#xff0c;经常会遇到需要给ubuntu打显卡驱动的问题&#xff0c;虽然说不难吧&#xff0c;但是耐不住机器多&#xff0c;重复多次也就烦了&#xff0c;于是抽出了一点时间&#xff0c;并且在deepseek的帮助之下&#xff0c;写了一个自动安装驱动的脚本&#…...

Java LeetCode 热题 100 回顾38

干货分享&#xff0c;感谢您的阅读&#xff01;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两…...

MySQL复习笔记

文章目录 1.MySQL1.1什么是数据库1.2 数据库分类1.3 MySQL简介1.4连接数据库 2. 操作数据库2.1 操作数据库2.2 数据库的列类型2.3 数据库的字段属性&#xff08;重点&#xff09;2.4 创建数据库表&#xff08;重点&#xff09;2.5 数据表的类型2.6 修改数据表 3. MySQL 数据管理…...

解释 TypeScript 中的类型系统,如何定义和使用类型?

1. 类型系统的核心作用 TypeScript类型系统本质上是JavaScript的静态类型增强方案&#xff0c;提供三个核心价值&#xff1a; 开发阶段类型检查&#xff08;类似编译时eslint&#xff09;更清晰的API文档&#xff08;类型即文档&#xff09;更好的IDE自动补全支持 代码示例&…...

安裝do時出現log file support is not available

“log file support is not available (press RETURN)” 这个提示信息表明日志文件支持不可用&#xff0c;让你按回车键继续。出现这种情况可能是因为 Odoo 的日志相关配置存在问题或者一些必要的依赖没有正确安装配置。以下是一些可以尝试的解决办法&#xff1a; 1. 检查 Odo…...

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础 水墨不写bug 文章目录 (一)概念梳理1.什么是协议?2.什么是应用层?3. 为什么要进行分层&#xff1f; &#xff08;二&#xff09;HTTP协议2.1 初识HTTP协议2.2HTTP协议的URL2.2.1域名2.2.2端口号2…...

机票改签请求

示例代码&#xff1a; tool def update_ticket_to_new_flight(ticket_no: str, new_flight_id: int) -> str:"""Update the users ticket to a new valid flight.Args:ticket_no (str): The ticket number to be updated.new_flight_id (int): The ID of th…...

linux下文件读写操作

Linux下&#xff0c;文件I/O是操作系统与文件系统之间进行数据传输的关键部分。文件I/O操作允许程序读取和写入文件&#xff0c;管理文件的打开、关闭、创建和删除等操作。 1. 文件描述符 在Linux中&#xff0c;每个打开的文件都由一个文件描述符来表示。文件描述符是一个非负…...

命名管道的创建和通信实现

目录 命名管道的创建 使用函数创建命名管道的通信 预备创建 makefile设计 server.hpp设计 clent.hpp设计 comm.hpp设计 server.cc设计 clent.cc设计 测试运行 今天我们来学习命名管道 由于匿名管道&#xff08;pipe()&#xff09;无法在两个毫不相干的进程之间进行通…...

C++和OpenGL实现3D游戏编程【连载24】——父物体和子物体之间的坐标转换

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 父子物体的坐标转换 1、本节要实现的内容 前面章节我们了解了父物体与子物体的结构,它不仅能够表示物体之间的层次关系,更重要的一个作用就是展示物…...

21.HarmonyOS Next CustomSlider组件步长控制教程(三)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 1. 步长控制概述2. 步长基本概念2.1 什么是步长&#xff1f;2.2 步长的作用 3. 设置步长3.1 基本参数3.2 代码示例 4. 步长与范围的关系4…...

小白学习:rag向量数据库

学习视频&#xff1a; https://www.bilibili.com/video/BV11zf6YyEnT/?spm_id_from333.337.search-card.all.click 例子&#xff1a; 用户提出问题 客服机器人基于rag回答用户问题 过程拆解&#xff1a; 客户问题 – 转化为向量表示 – 在向量数据库中进行相似性搜索 – 系…...

STM32 CAN模块原理与应用详解

目录 概述 一、CAN模块核心原理 1. CAN协议基础 2. STM32 CAN控制器结构 3. 波特率配置 二、CAN模块配置步骤&#xff08;基于HAL库&#xff09; 1. 初始化CAN外设 2. 配置过滤器 3. 启动CAN通信 三、数据收发实现 1. 发送数据帧 2. 接收数据帧&#xff08;中断方式…...

NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)

P5015 [NOIP 2018 普及组] 标题统计 - 洛谷 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;getline(cin, s);int sz s.size();int cnt 0;for (int i 0; i < sz; i){if (isspace(s[i]))continue…...

最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)

前期所需&#xff1a; 1.apache-tomcat-10.1.18-windows-x64&#xff08;tomcat 10.1.8版本或者差不多新的版本都可以&#xff09; 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了&#xff08;一定先配置MAVEN再搞TOMCAT会事半功倍很多&#xff09; 如果有没配置…...

MAC-禁止百度网盘自动升级更新

通过终端禁用更新服务(推荐)​ 此方法直接移除百度网盘的自动更新组件,无需修改系统文件。 ​步骤: ​1.关闭百度网盘后台进程 按下 Command + Space → 输入「活动监视器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 结束相关进程。 ​2.删除自动更新配置文件 打开终端…...

Unity DOTS从入门到精通之EntityCommandBufferSystem

文章目录 前言安装 DOTS 包ECBECB可以执行的指令示例&#xff1a; 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世界游…...

【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自编码器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介绍&#xff08;内含扩散模型介绍&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…...

【Linux】使用问题汇总

#1 ssh连接的时候报Key exchange failed 原因&#xff1a;服务端版本高&#xff0c;抛弃了一些不安全的交换密钥算法&#xff0c;且客户端版本比较旧&#xff0c;不支持安全性较高的密钥交换算法。 解决方案&#xff1a; 如果是内网应用&#xff0c;安全要求不这么高&#xf…...

nnUNet V2修改网络——全配置替换MultiResBlock模块

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 MultiRes Block 是 MultiResUNet 中核心组件之一,旨在解决传统 U-Net 在处理多尺度医学图像时的局…...

Git合并工具在开发中的使用指南

在团队协作开发中&#xff0c;Git 是最常用的版本控制工具&#xff0c;而代码合并&#xff08;Merge&#xff09;是多人协作不可避免的环节。当多个开发者同时修改同一文件的相同区域时&#xff0c;Git 无法自动完成合并&#xff0c;此时需要借助合并工具&#xff08;Merge Too…...

AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录

AutoDL平台租借GPU&#xff0c;创建transformers环境&#xff0c;使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网&#xff1a;https://www.autodl.com/home 2.选择算力市场&#xff0c;找到需要的GPU&#xff1a; 我这里选择3090显卡 3.这里我们就选择P…...

listen EACCES: permission denied 0.0.0.0:811

具体错误 npm run serve> bige-v0.0.0 serve > viteThe CJS build of Vites Node API is deprecated. See https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details. error when starting dev server: Error: listen EACCES: per…...

OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程

本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据&#xff1a;包含模型分类及描述&#xff1b;调用次数限制&#xff1b; 包含模型的类型有&#xff1a; Chat 模型&#xff08;如 GPT-4o、GPT-4.5、GPT-4&#xff09;专注于对话&#xff0c…...

六十天前端强化训练之第十五天React组件基础案例:创建函数式组件展示用户信息(第15-21天:前端框架(React))

欢迎来到编程星辰海的博客讲解 我们已经学了14天了&#xff0c;再坚持坚持&#xff0c;马上我们就可以变得更优秀了&#xff0c;加油&#xff0c;我相信大家&#xff0c;接下来的几天&#xff0c;我会给大家更新前端框架&#xff08;React&#xff09;&#xff0c;看完可以给一…...

北大一二三四版全套DeepSeek教学资料

DeepSeek学习资料合集&#xff1a;https://pan.quark.cn/s/bb6ebf0e9b4d DeepSeek实操变现指南&#xff1a;https://pan.quark.cn/s/76328991eaa2 你是否渴望深入探索人工智能的前沿领域&#xff1f;是否在寻找一份能引领你从理论到实践&#xff0c;全面掌握AI核心技术的学习…...

计算机网络:计算机网络的组成和功能

计算机网络的组成&#xff1a; 计算机网络的工作方式&#xff1a; 计算机网络的逻辑功能; 总结&#xff1a; 计算机网络的功能&#xff1a; 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点&#xff08;计算机或设备&…...

管理网络安全

防火墙在 Linux 系统安全中有哪些重要的作用&#xff1f; 防火墙作为网络安全的第一道防线&#xff0c;能够根据预设的规则&#xff0c;对进出系统的网络流量进行严格筛选。它可以阻止未经授权的外部访问&#xff0c;只允许符合规则的流量进入系统&#xff0c;从而保护系统免受…...

音频进阶学习十九——逆系统(简单进行回声消除)

文章目录 前言一、可逆系统1.定义2.解卷积3.逆系统恢复原始信号过程4.逆系统与原系统的零极点关系 二、使用逆系统去除回声获取原信号的频谱原系统和逆系统幅频响应和相频响应使用逆系统恢复原始信号整体代码如下 总结 前言 在上一篇音频进阶学习十八——幅频响应相同系统、全…...

Redis7系列:设置开机自启

前面的文章讲了Redis和Redis Stack的安装&#xff0c;随着服务器的重启&#xff0c;导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置&#xf…...

word甲烷一键下标

Sub 甲烷下标()甲烷下标 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…...

SSH 连接中主机密钥验证失败问题的解决方法

问题描述 在尝试通过 SSH 建立连接时&#xff0c;出现以下错误信息&#xff1a; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack…...

网络安全工具nc(NetCat)

NetCat是一个非常简单的Unix工具&#xff0c;可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具&#xff0c;能被其它的程序程序或脚本直接地或容易地驱动。同时&#xff0c;它又是一个功能丰富的 网络调试和开发工具&#xff0c;因为它…...

探索在生成扩散模型中基于RAG增强生成的实现与未来

概述 像 Stable Diffusion、Flux 这样的生成扩散模型&#xff0c;以及 Hunyuan 等视频模型&#xff0c;都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术&#xff08;如 低秩适…...

【Linux】37.网络版本计算器

文章目录 1. Log.hpp-日志记录器2. Daemon.hpp-守护进程工具3. Protocol.hpp-通信协议解析器4. ServerCal.hpp-计算器服务处理器5. Socket.hpp-Socket通信封装类6. TcpServer.hpp-TCP服务器框架7. ClientCal.cc-计算器客户端8. ServerCal.cc-计算器服务器9. 代码时序1. 服务器启…...

3.6c语言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…...

【 IEEE出版 | 快速稳定EI检索 | 往届已EI检索】2025年储能及能源转换国际学术会议(ESEC 2025)

重要信息 主会官网&#xff1a;www.net-lc.net 【论文【】投稿】 会议时间&#xff1a;2025年5月9-11日 会议地点&#xff1a;中国-杭州 截稿时间&#xff1a;见官网 提交检索&#xff1a;IEEE Xplore, EI Compendex, Scopus 主会NET-LC 2025已进入IEEE 会议官方列表!&am…...

JVM常用概念之本地内存跟踪

问题 Java应用启动或者运行过程中报“内存不足&#xff01;”&#xff0c;我们该怎么办? 基础知识 对于一个在本地机器运行的JVM应用而言&#xff0c;需要足够的内存来存储机器代码、堆元数据、类元数据、内存分析等数据结构&#xff0c;来保证JVM应用的成功启动以及未来平…...

JVM 的主要组成部分及其作用?

创作内容丰富的干货文章很费心力&#xff0c;感谢点过此文章的读者&#xff0c;点一个关注鼓励一下作者&#xff0c;激励他分享更多的精彩好文&#xff0c;谢谢大家&#xff01; JVM包含两个子系统和两个组件&#xff0c;两个子系统为Class loader(类装载)、Execution engine(执…...

从能耗监测到碳资产管理:智慧校园能源管理平台的迭代升级与实践启示

一、核心价值提炼 随着我国能源结构转型的持续优化和“双碳”目标的明确&#xff0c;构建现代化能源体系已成为国家发展的重要战略。在这一背景下&#xff0c;校园作为能源消耗的重要领域&#xff0c;其能源管理的智能化、绿色化转型显得尤为重要。本文将深入探讨校园智慧能源…...

数据库核心-redo、undo

一、redo日志 InnoDB操作以页为单位操作数据。并且首先操作内存中缓冲池的数据&#xff0c;然后刷新到disk中&#xff0c;但如果事务提交后宕机、未能刷新到disk中&#xff0c;就会造成不一致情况。 重做日志&#xff1a; 系统重启时按照修改步骤重新更新数据页 redo日志占用…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module

定义在 src\core\nginx.c ngx_module_t ngx_core_module {NGX_MODULE_V1,&ngx_core_module_ctx, /* module context */ngx_core_commands, /* module directives */NGX_CORE_MODULE, /* module type */NULL…...

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是&#xff0c;有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射&#xff08;ORM&#xff09;功能而闻名&#xff…...