文章目录
- 基础
-
- 体系结构(分层模型)
-
- 为什么要分层?OSI 七层模型?每一层的作用?
- TCP/IP 四层模型是什么?每一层的作用是什么?
- 五层体系结构以及对应的协议
- 每一层常见协议有哪些?
- 从输入 URL 到页面展示到底发生了什么?
- URI和URL的区别;forward和redirect的区别
- DNS
-
- 作用是什么?DNS 服务器有哪些?
- DNS 解析的过程是什么样的?
- DNS 劫持了解吗?
- HTTP
-
- HTTP基础
-
- HTTP常用的状态码及其含义?
- HTTP Header 中常见的字段?
- HTTP 常用请求方式 (POST和GET),区别和用途?
- 除了HTTP的80,常见端口及对应的服务?
- 有了HTTP为什么还有RPC、WebSocket?
- HTTP 长连接Keep-Alive、TCP 保活机制Keepalive
- HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP3.0的区别
-
- 1.1 相对于1.0、优缺点
- 2.0 相对于1.1、优缺点
- 3.0 相对于2.0、优缺点、1.0~3.0协议栈比较
- HTTPS
-
- HTTPS的流程?与HTTP的区别?
- 什么是数字签名、数字证书?(非)对称加密区别
- 密钥交换算法RSA、ECDHE
- HTTP 无状态协议(cookie、session、token)
-
- HTTP 是无状态的协议、如何保存用户状态、cookie、session、token
- Cookie 和 Session 有什么区别, Cookie 和 Session 是如何配合的呢?
- token和Session的区别
- JWT?
- JWT和Session区别?
- 已签发的JWT如何废弃?JWT如何续签?
- TCP
-
- TCP报文首部有哪些字段,其作用又分别是什么?
- TCP与UDP;TCP缺陷与QUIC
-
- TCP 与 UDP 区别;如何选择
- HTTP 基于 TCP 还是 UDP?
- 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
- TCP 协议的缺陷(引申UDP实现可靠传输)
- 如何基于 UDP 协议实现可靠传输
- TCP和UDP可用同一个端口?其他**端口**相关问题
- HTTP 长连接Keep-Alive、TCP 保活机制Keepalive
- 谈谈TCP字节流的粘包和拆包?
- 0、TCP怎么保证可靠传输的;一定可靠吗?
- 1、TCP 三次握手与四次挥手
-
- 三次握手过程;为什么不能是两次四次?
- 三次分别丢失了会发生什么?
- 四次挥手过程;为什么需要四次?
- 四次分别丢失了会发生什么?
- 为什么不能把服务端发送的 ACK 和 FIN 合并起来,变成三次挥手?
- 什么时候挥手可以变成三次?
- 为什么需要TIME_WAIT;为什么要等2MSL才进入CLOSED状态?
- TIME_WAIT过多的危害;如何优化TIME_WAIT
- 服务器出现大量 TIME_WAIT或CLOSE_WAIT的原因
- 2、TCP的重传机制
- 3、TCP的流量控制和滑动窗口?
- 4、TCP 的拥塞控制是怎么实现的?
- IP
-
- IPv4 和 IPv6 有什么区别?
- IP地址有哪些分类?
- ARP协议工作过程?
- PING的作用、原理、流程
- WebSocket、与HTTP区别、工作过程
- 网络攻击相关
-
- 什么是CSRF 攻击,如何解决?
- 什么是XSS攻击,如何避免?
- 聊聊SQL注入?
- 什么是DoS、DDoS、DRDoS攻击?
- 说说SYN Flood攻击(半连接、全连接队列)?
- DNS 劫持了解吗?
- 什么是CDN?CDN的工作原理是怎样的?
- 如何实现跨域?
基础
体系结构(分层模型)
为什么要分层?OSI 七层模型?每一层的作用?
为什么网络要分层?
我觉得主要有 3 方面的原因:
- 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。
- 提高了灵活性和可替换性:每一层都可以使用最适合的技术来实现,并且,每一层都可以根据需要进行修改或替换,而不会影响到整个网络的结构。(高内聚、低耦合的原则)
- 大问题化小:分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。
OSI 七层模型 是国际标准化组织提出的一个网络分层模型。每层的作用如下:
- 应用层 常见协议:HTTP/HTTPS、FTP、SMTP、DNS
负责给应用程序提供统一的接口,为计算机用户提供服务 - 表示层 常见协议:SSL/TLS
负责把数据转换成兼容另一个系统能识别的格式,数据处理(编解码、加密解密、压缩解压缩) - 会话层
管理(建立、维护、重连)应用程序之间的会话 - 传输层 常见协议:TCP、UDP
负责端到端的数据传输,提供可靠的数据传输服务。可实现数据的分段与重组,提供流量控制、错误检测和纠正功能。确保数据在两端之间传输的完整性和可靠性。 - 网络层 常见协议:IP、ICMP
路由和寻址(负责数据的路由、转发、分片) - 数据链路层 常见协议:ARP
负责将比特流组织成数据帧,并在相邻节点之间传输。它还负责纠错、流量控制以及处理物理地址(MAC地址)。此外,它还确保帧的无误传输。 - 物理层
负责在物理网络中传输数据帧,透明地传送比特流。主要涉及如何在不同的传输介质(如铜线、光纤、无线电波)上传输数据。
TCP/IP 四层模型是什么?每一层的作用是什么?
TCP/IP 四层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本,由以下 4 层组成:
- 应用层
对应于OSI参考模型的(应用层、表示层、会话层)。1.应用层负责给应用程序提供统一的接口,为计算机用户提供服务;2.表示层负责把数据转换成兼容另一个系统能识别的格式,数据处理(编解码、加密解密、压缩解压缩);3.会话层管理(建立、维护、重连)应用程序之间的会话 - 传输层
对应OSI的传输层,负责端到端的数据传输,提供可靠的数据传输服务。可实现数据的分段与重组,提供流量控制、错误检测和纠正功能。确保数据在两端之间传输的完整性和可靠性。 - 网络层
对应于OSI参考模型的网络层,主要解决主机到主机的通信问题,路由和寻址(负责数据的路由、转发、分片) - 网络接口层
与OSI参考模型的数据链路层、物理层对应。1.数据链路层负责负责将比特流组织成数据帧,并在相邻节点之间传输。它还负责纠错、流量控制以及处理物理地址(MAC地址)。此外,它还确保帧的无误传输;2.负责在物理网络中传输数据帧,透明地传送比特流。主要涉及如何在不同的传输介质(如铜线、光纤、无线电波)上传输数据
五层体系结构以及对应的协议
- 应用层:对应于OSI参考模型的(应用层、表示层、会话层)。1.应用层负责给应用程序提供统一的接口,为计算机用户提供服务;2.表示层负责把数据转换成兼容另一个系统能识别的格式,数据处理(编解码、加密解密、压缩解压缩);3.会话层管理(建立、维护、重连)应用程序之间的会话
- 传输层:对应OSI参考模型的的传输层。负责端到端的数据传输,提供可靠的数据传输服务。可实现数据的分段与重组,提供流量控制、错误检测和纠正功能。确保数据在两端之间传输的完整性和可靠性。
- 网络层:对应OSI参考模型的的网络层。主要解决主机到主机的通信问题,路由和寻址(负责数据的路由、转发、分片)
- 数据链路层:对应OSI参考模型的的数据链路层。负责负责将比特流组织成数据帧,并在相邻节点之间传输。它还负责纠错、流量控制以及处理物理地址(MAC地址)。此外,它还确保帧的无误传输
- 物理层:对应OSI参考模型的的物理层。负责在物理网络中传输数据帧,透明地传送比特流。主要涉及如何在不同的传输介质(如铜线、光纤、无线电波)上传输数据
每一层常见协议有哪些?
应用层常见的协议
-
HTTP(Hypertext Transfer Protocol,超文本传输协议):基于 TCP 协议,用于传输超文本和多媒体内容,是 Web 浏览器与 Web 服务器之间通信的主要协议。用户在浏览网页时,浏览器通过 HTTP 向服务器请求资源,服务器响应后,网页内容便加载到浏览器中。
-
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议):基于 TCP 协议,主要用于电子邮件的发送。注意⚠️:SMTP 仅负责邮件从发送方到邮件服务器或从一个邮件服务器到另一个邮件服务器的传输,而不负责接收邮件。接收邮件时,需要使用 POP3 或 IMAP 协议。
-
POP3/IMAP(邮件接收协议):
-
- POP3(Post Office Protocol 3,邮局协议 3):基于 TCP 协议,用于从邮件服务器接收邮件。POP3 协议将邮件下载到本地后,默认情况下会从服务器上删除邮件,适合不需要在多个设备上同步邮件的场景。
-
- IMAP(Internet Message Access Protocol,互联网消息访问协议):也是基于 TCP 协议的邮件接收协议,相较于 POP3,IMAP 功能更强大,支持在服务器上管理邮件,并在多个设备之间同步邮件状态(如已读、未读、分类等),因此更适合现代邮件客户端的使用。
-
FTP(File Transfer Protocol,文件传输协议):基于 TCP 协议,用于在计算机之间传输文件。FTP 能够屏蔽不同操作系统和文件存储方式的差异,注意⚠️:由于传输过程中的数据不加密,安全性较低。因此,传输敏感数据时建议使用更安全的协议,如 SFTP(基于 SSH 的安全文件传输协议)。
-
SSH(Secure Shell Protocol,安全外壳协议):基于 TCP 协议,通过加密和认证机制提供安全的远程登录、命令执行和文件传输服务。SSH 是远程管理服务器和网络设备的常用工具,默认使用端口 22。
-
DNS(Domain Name System,域名系统):基于 UDP 协议,DNS 将人类可读的域名(如 www.example.com)转换为机器可读的 IP 地址(如 192.168.1.1),是互联网的核心服务之一。虽然 DNS 主要使用 UDP 进行查询,但在需要保障可靠性或处理较大数据时,也会使用 TCP。
传输层常见的协议
-
TCP(Transmission Control Protocol,传输控制协议):提供可靠的、面向连接的传输服务,确保数据包按照正确的顺序到达接收方,且无丢失、重复或损坏。TCP 常用于需要高可靠性的数据传输场景,如文件传输、电子邮件、网页浏览等。
-
UDP(User Datagram Protocol,用户数据报协议):提供无连接的、尽最大努力的传输服务,不保证数据传输的可靠性或顺序性。UDP 适用于需要快速传输且容忍一定程度数据丢失的场景,如视频流、在线游戏、DNS 查询等。
网络层常见的协议
-
IP(Internet Protocol,网际协议):是网络层的核心协议,负责将数据包从源地址传输到目的地址。IP 协议定义了数据包的格式、路由选择、以及数据包在网络中如何传输。IPv4 和 IPv6 是两种常见的 IP 协议版本。
-
ARP(Address Resolution Protocol,地址解析协议):用于在本地网络中将 IP 地址解析为物理地址(MAC 地址)。当设备需要与同一局域网内的另一设备通信时,它会通过 ARP 获取目标设备的 MAC 地址。
-
ICMP(Internet Control Message Protocol,互联网控制报文协议):用于在网络设备之间传递控制信息和错误消息。ICMP 常用于网络诊断工具,如 Ping,用于检测网络连通性和判断网络路径上的问题。
-
OSPF(Open Shortest Path First,开放最短路径优先):一种内部网关协议(IGP),用于在同一自治系统内的路由器之间交换路由信息。OSPF 采用链路状态算法,能够动态调整路由,选择带宽、延迟等指标最佳的路径进行数据传输。
-
RIP(Routing Information Protocol,路由信息协议):也是一种内部网关协议(IGP),使用距离向量算法来选择路由路径。RIP 的度量标准是跳数,选择跳数最少的路径作为最佳路径,但其适用范围有限,通常用于较小规模的网络。
-
BGP(Border Gateway Protocol,边界网关协议):用于在不同自治系统(AS)之间交换路由信息,是互联网的核心路由协议之一。BGP 具有很高的灵活性和可扩展性,适用于管理复杂的、全球范围的路由选择。
从输入 URL 到页面展示到底发生了什么?
总体来说分为以下几个步骤:
- URL解析:在浏览器中输入指定网页的 URL。确定协议(如HTTP/HTTPS)、域名以及路径。如果路径省略,默认会请求根目录下的默认文件(如index.html)。
- DNS解析:浏览器通过 DNS 协议,将域名转换为目标服务器的IP地址。这一过程可能会涉及多级DNS服务器的查询,最终获取到服务器的IP地址。
- 建立TCP连接:获取到IP地址后,浏览器通过TCP协议与服务器建立连接,这通常涉及三次握手。此过程确保双方能够发送和接收数据。
- 发送HTTP请求:TCP连接建立后,浏览器会构建并发送HTTP请求报文,其中包含了请求的具体资源(如网页)的信息。
- 服务器处理请求:服务器收到请求后,会处理请求并生成响应报文,通常包含HTML文档、CSS样式、JavaScript文件等资源。
- 返回HTTP响应:服务器将响应报文通过TCP连接返回给客户端,这一报文包含请求的资源内容。
- 渲染页面:浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
- 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求,会通过四次挥手断开TCP连接,释放资源。
URI和URL的区别;forward和redirect的区别
URI和URL的区别
URI (Uniform Resource Identifier,统一资源标志符):URI 的主要作用是唯一标识一个资源。它可以是一个 URL,也可以是其他形式的标识符。换句话说,所有的 URL 都是 URI,但并非所有的 URI 都是 URL。
- 示例:mailto:example@example.com 是一个 URI,用于标识电子邮件地址。
urn:isbn:0451450523 是一个 URI,用于标识一本书的 ISBN 号。
URL (Uniform Resource Locator,统一资源定位符):URL 是 URI 的一个子集,其主要作用是提供资源的访问路径。URL 不仅标识了资源,还提供了如何找到该资源的路径或地址。
- 示例:https://www.example.com/index.html 是一个 URL,它不仅标识了资源,还提供了通过 HTTP 协议访问这个资源的具体路径。
ftp://ftp.example.com/resource.txt 是另一个 URL,使用 FTP 协议来定位并访问一个资源。
打个经典比喻吧,URI像是身份证,可以唯一标识一个人,而URL更像一个住址,可以通过URL找到这个人。
forward和redirect的区别?
forward是转发,redirect是重定向。
Forward (转发):
- 浏览器 URL 地址不变:Forward 是服务器内部的操作。服务器收到请求后,内部调用另一个 Servlet 或 JSP 来处理请求,并将结果返回给客户端。这整个过程中,浏览器的 URL 地址不会发生变化。
- 数据共享:由于 Forward 是在服务器内部完成的,原始的 request 对象会被传递给下一个处理的组件。因此,request 中的数据在整个转发过程中是共享的,可以被下一个组件直接使用。
- 请求次数:Forward 只涉及一次 HTTP 请求,由服务器内部处理,不需要客户端的二次请求。
Redirect (重定向):
- 浏览器 URL 地址会改变:Redirect 是客户端行为。当服务器接收到请求后,返回一个 302 状态码和新的 Location 地址,指示浏览器重新请求这个新的地址。于是,浏览器会根据这个新的地址发起第二次 HTTP 请求,导致浏览器的 URL 地址发生变化。
- 数据不共享:由于 Redirect 涉及两次独立的 HTTP 请求,第一次请求中的 request 对象在重定向后不再存在,因此两次请求之间的数据不能直接共享。
- 请求次数:Redirect 过程涉及两次 HTTP 请求:第一次请求获取重定向指令,第二次请求实际访问新的 URL 地址。
DNS
作用是什么?DNS 服务器有哪些?
DNS作用是什么?
DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。
DNS 是应用层协议,它可以在 UDP 或 TCP 协议之上运行,端口为 53 。
DNS 服务器有哪些?
www.server.com越到后面层级越高,后面还隐藏了个.
表示根域名
DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):
- 根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
- 顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如com、org、net和edu等。国家也有自己的顶级域,如uk、fr和ca。TLD 服务器提供了权威 DNS 服务器的 IP 地址。
- 权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
- 本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构
DNS 解析的过程是什么样的?
假设你要查询www.baidu.com的IP地址:
- 首先会查找浏览器的缓存,看看是否能找到www.baidu.com对应的IP地址,找到就直接返回;否则进行下一步。
- 将请求发往给本地DNS服务器,如果查找到也直接返回,否则继续进行下一步;
- 本地DNS服务器向根域名服务器发送请求,根域名服务器返回负责.com的顶级域名服务器的IP地址的列表。
- 本地DNS服务器再向其中一个负责.com的顶级域名服务器发送一个请求,返回负责.baidu的权威域名服务器的IP地址列表。
- 本地DNS服务器再向其中一个权威域名服务器发送一个请求,返回www.baidu.com所对应的IP地址。
DNS 劫持了解吗?
DNS 劫持是一种网络攻击,它通过修改 DNS 服务器的解析结果,使用户访问的域名指向错误的 IP 地址,从而导致用户无法访问正常的网站,或者被引导到恶意的网站。DNS 劫持有时也被称为 DNS 重定向、DNS 欺骗或 DNS 污染。
通常,DNS劫持发生在以下几个层面:
1.本地劫持:攻击者在用户的设备上安装恶意软件或病毒,这些恶意程序修改本地的DNS设置或hosts文件,从而将域名解析重定向到攻击者控制的IP地址。
2.路由器劫持:攻击者入侵用户的路由器,修改路由器的DNS设置。这样一来,所有连接到该路由器的设备都会被重定向到错误的DNS服务器,导致域名解析被劫持。
3.中间人攻击:攻击者在DNS查询和响应过程中拦截并篡改数据包,返回伪造的DNS响应。
4.ISP劫持:某些互联网服务提供商(ISP)或其DNS服务器被攻击者入侵,从而篡改了DNS解析的结果。这种形式的劫持会影响ISP的所有用户,用户可能会被重定向到广告页面、钓鱼网站,或者遭遇更严重的隐私泄露。
5.DNS服务器劫持:攻击者直接入侵DNS服务器,篡改其解析结果。通过这种方式,攻击者能够将特定域名的访问请求重定向到恶意IP地址,导致大量用户同时受到影响。
应对措施:
- 使用加密的DNS(如DNS over HTTPS或DNS over TLS),保护DNS查询的隐私和完整性,防止劫持。
- 配置设备和路由器时,使用可信任的DNS服务器(如Google DNS、Cloudflare DNS)。
- 定期更新路由器和设备的固件,防止路由器被恶意攻击。
- 在企业环境中,实施DNS安全防护措施,如DNSSEC(DNS Security Extensions),通过数字签名验证DNS数据的真实性和完整性。
HTTP
HTTP基础
HTTP常用的状态码及其含义?
不管是不是面试需要,我们都要知道,日常开发中的这几个状态码的含义哈:
说说HTTP状态码301和302的区别?
302和301都有重定向的含义,但是它们也是有区别的。
- 301:(永久性转移)表示请求的资源已经被永久地移动到新的 URL,任何未来的请求应该使用这个新的 URL。浏览器会自动将请求重定向到新的 URL,并在缓存中记住这个重定向,以后访问旧的 URL 时会自动请求新的 URL。
- 302:(暂时性转移)表示请求的资源临时被移动到另一个 URL,客户端应继续使用原始的 URL 进行后续请求。浏览器会临时重定向请求到新的 URL,但不会记住这个重定向,新请求时还是会使用原始 URL。
HTTP Header 中常见的字段?
这里列举几个常见的:
- Accept 能够接受的回应内容类型(Content-Types)
- Accept-Charset 能够接受的字符集
- Connection 该浏览器想要优先使用的连接类型
- Content-Type 请求体的多媒体类型(用于 POST 和 PUT 请求中)
- Cookie 之前由服务器通过 Set-Cookie发送的一个超文本传输协议 Cookie
- Host Host 服务器的域名(用于虚拟主机),以及服务器所监听的传输控制协议端口号
HTTP 常用请求方式 (POST和GET),区别和用途?
POST和GET有哪些区别?
- 语义(主要区别):GET 通常用于获取或查询资源,而 POST 通常用于创建或修改资源。
- 幂等:GET 请求是幂等的,即多次重复执行不会改变资源的状态,而 POST 请求是不幂等的,即每次执行可能会产生不同的结果或影响资源的状态。
- 格式:GET 请求的参数通常放在 URL 中,形成查询字符串,而 POST 请求的参数通常放在请求体中,可以有多种编码格式。GET 请求的 URL 长度受到浏览器和服务器的限制,而 POST 请求的 body 大小则没有明确的限制。
- 缓存:由于 GET 请求是幂等的,它可以被浏览器或其他中间节点(如代理、网关)缓存起来,以提高性能和效率。而 POST 请求则不适合被缓存,因为它可能有副作用,每次执行可能需要实时的响应。
- 安全性:GET 请求和 POST 请求如果使用 HTTP 协议的话,那都不安全,因为 HTTP 协议本身是明文传输的,必须使用 HTTPS 协议来加密传输数据。另外,GET 请求相比 POST 请求更容易泄露敏感数据,因为 GET 请求的参数通常放在 URL 中。
除了HTTP的80,常见端口及对应的服务?
有了HTTP为什么还有RPC、WebSocket?
有了 HTTP,为什么还要有 RPC?
- 调用方式的不同:HTTP 是一种超文本传输协议,主要用于浏览器和服务器之间的通信,尤其是网页请求和响应。RPC(Remote Procedure Call)是一种方法调用方式,它让程序员能够像调用本地函数一样调用远程服务器上的方法。RPC 封装了网络通信的细节,使得远程方法调用的体验更接近本地调用。
- 性能和效率:RPC 的设计通常更加高效,尤其是在传输结构化数据时,它能够使用像 Protobuf 这样的高效序列化协议,而 HTTP 通常使用的 JSON 格式则更加冗长。此外,RPC 常常会使用连接池技术来优化性能,减少连接建立和断开的开销。虽然HTTP/2.0 在 HTTP/1.1 的基础上做了优化,性能可能比很多 RPC 协议都要好,但由于是这几年才出来的,所以也不太可能取代掉 RPC。
- 适用场景的不同:HTTP 最初主要用于 B/S 架构(浏览器/服务器),适用于网页浏览和跨平台应用,而 RPC 更适合于 C/S 架构(客户端/服务器),通常用于内部服务之间的通信,尤其是微服务架构中。
- 协议的定制化:RPC 协议往往是定制化的,更加适应特定的业务需求。它可以根据具体的应用场景设计优化的通信方式,而 HTTP 则是一个通用协议,主要关注的是兼容性和广泛适用性。
有了 HTTP,为什么还要有 WebSocket?
-
通信模式的不同:HTTP 是一种半双工通信协议,通常是客户端发起请求,服务器响应,这种模式不适合需要实时、双向通信的场景。而 WebSocket 是一种全双工协议,一旦连接建立,服务器和客户端都可以随时主动发送消息,实现实时通信。
-
实时性的需求:在一些应用场景中,如在线游戏、实时聊天、股票交易等,服务器需要主动向客户端推送消息,这种需求在 HTTP 下很难实现,而 WebSocket 则为这种场景提供了完美的解决方案。
-
资源的节省:在需要频繁通信的应用中,虽然http支持长连接,但需要(客户端)使用 HTTP 的轮询或长轮询(查询服务器是否有新的数据)会消耗大量的网络带宽和服务器资源。WebSocket 通过维持一个持久连接,避免了重复的连接建立和拆除,大大减少了资源消耗。
-
数据格式的优化:WebSocket 数据帧的设计更为紧凑,握手完成后,数据传输格式简洁,头部信息相对精简,减少了消息传输中的开销,适合需要高效、快速传输的场景。而 HTTP 的头部信息相对较多,尤其是在轮询的场景中,头部信息的开销非常大。
HTTP 长连接Keep-Alive、TCP 保活机制Keepalive
HTTP 长连接和 TCP 保活机制虽然名字相似,但它们是两个完全不同的概念,分别在不同的层次上实现,服务于不同的目的。
HTTP 长连接 (HTTP Keep-Alive)
- 定义:HTTP 长连接(也称为 HTTP Keep-Alive)是指在一次 TCP 连接上可以进行多个 HTTP 请求和响应,而不是每次请求都重新建立一个新的 TCP 连接。
- 工作原理:
-
- 在 HTTP 通信中,客户端和服务器通过 TCP 连接进行数据传输。传统的 HTTP/1.0 每次请求都会建立和关闭一个新的 TCP 连接,这种方式称为“短连接”。HTTP/1.1 引入了长连接(默认开启),通过在请求头中添加 Connection: Keep-Alive,可以保持 TCP 连接在多个请求之间持续有效。
-
- 当 HTTP 长连接启用后,只要客户端或服务器没有明确关闭连接,这个 TCP 连接就会保持活跃状态,从而允许在该连接上进行多次 HTTP 请求和响应。这减少了多次建立和关闭 TCP 连接的开销,提高了网络传输效率。
- 超时机制:为了防止长时间未使用的连接浪费资源,服务器通常会设置一个超时时间 (keepalive_timeout),一般在 60 秒到几分钟之间,常见的默认值大约为 60 秒。也可以在HTTP的header里面设置超时时间。如果在设定的超时时间内没有新的请求,服务器会主动关闭连接。
- 优势:1.减少了 TCP 连接的建立和释放的开销,提升了网络性能,尤其是在需要频繁请求资源的应用场景中。2.为 HTTP 的流水线机制提供了基础,允许客户端在同一个连接上并行发送多个请求,减少了总响应时间。
TCP 保活机制 (TCP Keepalive)
- 定义:TCP 保活机制(TCP Keepalive)是 TCP 协议中的一个选项,用于检测长时间没有活动的 TCP 连接是否仍然有效。
- 工作原理:TCP 保活机制由操作系统内核实现。它的作用是当一个 TCP 连接长时间没有数据传输时,内核会周期性地发送探测报文(Keepalive 探测包)给对端。如果对端正常工作,会返回一个确认报文,从而使连接保持活跃。如果对端不可达(例如,主机宕机),内核在多次探测未收到响应后,会认定连接已经失效并关闭连接。
- 相关参数:1.tcp_keepalive_time:在连接空闲多长时间后开始发送 Keepalive 探测包,通常默认值是 7200 秒(2 小时)。2.tcp_keepalive_intvl:探测包之间的时间间隔,常见默认值是 75 秒。3.tcp_keepalive_probes:在关闭连接前最多发送的探测包次数,常见默认值是 9 次。
- 优势:1.保活机制能及时发现失效的连接,避免无效连接长时间占用系统资源。2.有助于提高网络应用的稳定性,确保客户端和服务器之间的连接有效性。
HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP3.0的区别
1.1 相对于1.0、优缺点
HTTP/1.1 (相对于HTTP/1.0)
1、连接方式 HTTP 1.0默认使用短连接,即每个请求/响应后都会关闭连接,而HTTP 1.1默认使用长连接,在同一个连接上可以发送多个请求和响应。
2、状态响应码 HTTP/1.1 中新加入了大量的状态码
3、管道机制 HTTP 1.1支持请求管道化,即在一个持久连接上可以同时发送多个请求,而HTTP 1.0不支持请求管道化。
问题:采用管道机制虽然可以发送多个请求,但是服务器必须按照接收请求的顺序依次发送对这些管道化请求的响应,以保证客户端能够区分出每次请求的响应内容。这就导致了假如服务端在处理一个请求时耗时比较长,那么后续请求的处理都会被阻塞住,会导致客户端迟迟收不到数据,这称为「队头堵塞」–在HTTP2中解决。
4、缓存控制 HTTP/1.1 在 HTTP/1.0 基础之上,增加了一些请求响应头,以更好的实现对缓存的控制。1.新增 Cache-Control 代替原先的 Expires;2.新增 If-None-Match 和 Etag 代替原先的 If-Modified-Since和 Last-Modified 。
1.Expires (HTTP/1.0):指定资源的过期时间点。相比 Expires,Cache-Control 更加灵活且精确,因为它不依赖于绝对时间,而是使用相对时间(如 max-age),并且提供了更多的指令来控制缓存行为。
2.Last-Modified 和 If-Modified-Since (HTTP/1.0):Last-Modified: 服务器响应时告知资源的最后修改时间。If-Modified-Since: 客户端在请求资源时,可以带上这个头字段,表示“如果自从这个时间点资源没有改变,则返回 304 Not Modified,而不返回资源内容”。改进:精确性:ETag 基于资源内容而生成,可以精确检测资源是否发生变化,不受时间戳的限制。更好的控制:ETag 可以应用于任何资源类型,不仅限于有明确修改时间的资源,且不受系统时钟的影响,更可靠地