计算机网络常见面试题总结

文章目录

    • 1 计算机网络基础
      • 1.1 网络分层模型
        • 1.1.1 OSI 七层模型是什么?每一层的作用是什么?
        • 1.1.2 TCP/IP 四层模型是什么?每一层的作用是什么?
        • 1.1.3 为什么网络要分层?
      • 1.2 常见网络协议
        • 1.2.1 应用层有哪些常见的协议?
        • 1.2.2 传输层有哪些常见的协议?
        • 1.2.3 网络层有哪些常见的协议?
    • 2 HTTP
      • 2.1 从输入 URL 到页面展示到底发生了什么?🔥
      • 2.2 HTTP 状态码有哪些?
      • 2.3 HTTP Header 中常见的字段有哪些?
      • 2.4 HTTP 和 HTTPS 有什么区别?🔥
      • 2.5 HTTPS 建立连接过程
      • 2.6 HTTP/1.0 和 HTTP/1.1 有什么区别?
      • 2.7 HTTP/1.1 和 HTTP/2.0 有什么区别?🔥
      • 2.8 HTTP/2.0 和 HTTP/3.0 有什么区别?
      • 2.9 HTTP 是不保存状态的协议, 如何保存用户状态?
      • 2.10 URI 和 URL 的区别是什么?
      • 2.11 Cookie 和 Session 有什么区别?🔥
      • 2.12 GET 和 POST 的区别
    • 3 TCP 与 UDP🔥
      • 3.1 TCP 与 UDP 的区别
      • 3.2 什么时候选择 TCP,什么时候选 UDP?
      • 3.3 HTTP 基于 TCP 还是 UDP?
      • 3.4 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
      • 3.5 建立连接时 TCP 三次握手的过程
      • 3.6 什么是半连接队列和全连接队列?
      • 3.7 为什么要三次握手?
      • 3.8 不使用 「两次握手」和「四次握手」的原因
      • 3.9 第 2 次握手传回了 ACK,为什么还要传回 SYN?
      • 3.10 三次握手过程中可以携带数据吗?
      • 3.11 断开连接时 TCP 四次挥手的过程
      • 3.12 为什么要四次挥手?为什么不能把服务端发送的 ACK 和 FIN 合并起来,变成三次挥手?
      • 3.13 什么情况会出现三次挥手?
      • 3.14 如果第二次挥手时服务端的 ACK 没有送达客户端,会怎样?
      • 3.15 为什么第四次挥手客户端需要等待 2\*MSL(报文最长寿命)时间后才进入 CLOSED 状态?
      • 3.16 TCP 如何保证传输的可靠性?
      • 3.17 TCP 如何实现流量控制?
      • 3.18 为什么需要流量控制 ?
      • 3.19 TCP协议是如何处理网络拥塞
    • 4 IP
      • 4.1 IP 协议的作用是什么?
      • 4.2 什么是 IP 地址?IP 寻址如何工作?
      • 4.3 什么是 IP 地址过滤?
      • 4.4 IPv4 和 IPv6 有什么区别?
      • 4.5 如何获取客户端真实 IP?
      • 4.6 NAT 的作用是什么?
    • 5 WebSocket
      • 5.1 什么是 WebSocket?
      • 5.2 WebSocket 和 HTTP 有什么区别?
      • 5.3 WebSocket 的工作过程是什么样的?
      • 5.4 SSE 与 WebSocket 有什么区别?
    • 6 PING
      • 6.1 PING 命令的作用是什么?
      • 6.2 PING 命令的工作原理是什么?
    • 7 DNS
      • 7.1 DNS 的作用是什么?
      • 7.2 DNS 服务器有哪些?根服务器有多少个?
      • 7.3 DNS 解析的过程是什么样的?
      • 7.4 DNS 劫持了解吗?如何应对?
    • 8 ARP
      • 8.1 什么是 Mac 地址?
      • 8.2 ARP 协议解决了什么问题?
      • 8.3 ARP 协议的工作原理?

主要参考:JavaGuide,同时加上网上搜索整理和个人理解总结

1 计算机网络基础

1.1 网络分层模型

1.1.1 OSI 七层模型是什么?每一层的作用是什么?

OSI 七层模型 是国际标准化组织提出的一个网络分层模型,其大体结构以及每一层提供的功能如下图所示:

OSI 七层模型

OSI 的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用,而且有些功能在多个层中重复出现。

1.1.2 TCP/IP 四层模型是什么?每一层的作用是什么?

TCP/IP 四层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本,由以下 4 层组成:

  1. 应用层:应用层主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。
  2. 传输层:传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。
  3. 网络层:网络层负责为分组交换网上的不同主机提供通信服务。网络层的还有一个任务就是选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。
  4. 网络接口层:可以把网络接口层看作是数据链路层和物理层的合体。数据链路层的作用是将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异

需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,如下图所示:

TCP/IP 四层模型

1.1.3 为什么网络要分层?
  1. 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。这个和我们对开发时系统进行分层是一个道理。
  2. 提高了灵活性和可替换性:每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。并且,每一层都可以根据需要进行修改或替换,而不会影响到整个网络的结构。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
  3. 大问题化小:分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。 这个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。

1.2 常见网络协议

1.2.1 应用层有哪些常见的协议?

应用层常见协议

  • HTTP(Hypertext Transfer Protocol,超文本传输协议):基于 TCP 协议,是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
  • SMTP(Simple Mail Transfer Protocol,简单邮件发送协议):基于 TCP 协议,是一种用于发送电子邮件的协议。注意 ⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
  • POP3/IMAP(邮件接收协议):基于 TCP 协议,两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
  • FTP(File Transfer Protocol,文件传输协议) : 基于 TCP 协议,是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。
  • Telnet(远程登陆协议):基于 TCP 协议,用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
  • SSH(Secure Shell Protocol,安全的网络传输协议):基于 TCP 协议,通过加密和认证机制实现安全的访问和文件传输等业务
  • RTP(Real-time Transport Protocol,实时传输协议):通常基于 UDP 协议,但也支持 TCP 协议。它提供了端到端的实时传输数据的功能,但不包含资源预留存、不保证实时传输质量,这些功能由 WebRTC 实现。
  • DNS(Domain Name System,域名管理系统): 基于 UDP 协议,用于解决域名和 IP 地址的映射问题。
1.2.2 传输层有哪些常见的协议?
  • TCP(Transmission Control Protocol,传输控制协议 ):提供 面向连接 的,可靠 的数据传输服务。
  • UDP(User Datagram Protocol,用户数据协议):提供 无连接 的,尽最大努力 的数据传输服务(不保证数据传输的可靠性),简单高效。
1.2.3 网络层有哪些常见的协议?
  • IP(Internet Protocol,网际协议):TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
  • ARP(Address Resolution Protocol,地址解析协议):ARP 协议解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
  • ICMP(Internet Control Message Protocol,互联网控制报文协议):一种用于传输网络状态和错误消息的协议,常用于网络诊断和故障排除。例如,Ping 工具就使用了 ICMP 协议来测试网络连通性。
  • NAT(Network Address Translation,网络地址转换协议):NAT 协议的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,LAN)内,各主机使用的是同一个 LAN 下的 IP 地址,但在该 LAN 以外,在广域网(WAN)中,需要一个统一的 IP 地址来标识该 LAN 在整个 Internet 上的位置。
  • OSPF(Open Shortest Path First,开放式最短路径优先) ):一种内部网关协议(Interior Gateway Protocol,IGP),也是广泛使用的一种动态路由协议,基于链路状态算法,考虑了链路的带宽、延迟等因素来选择最佳路径。
  • RIP(Routing Information Protocol,路由信息协议):一种内部网关协议(Interior Gateway Protocol,IGP),也是一种动态路由协议,基于距离向量算法,使用固定的跳数作为度量标准,选择跳数最少的路径作为最佳路径。
  • BGP(Border Gateway Protocol,边界网关协议):一种用来在路由选择域之间交换网络层可达性信息(Network Layer Reachability Information,NLRI)的路由选择协议,具有高度的灵活性和可扩展性。

2 HTTP

2.1 从输入 URL 到页面展示到底发生了什么?🔥

类似的问题:打开一个网页,整个过程会使用哪些协议?

  1. 在浏览器中输入指定网页的 URL。
  2. 浏览器通过 DNS 协议,获取域名对应的 IP 地址。
  3. 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
  4. 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
  5. 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
  6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
  7. 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。

2.2 HTTP 状态码有哪些?

常见 HTTP 状态码

  • 1xx Informational(信息性状态码)
    • 100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。
  • 2xx Success(成功状态码)
    • 200 OK:请求被成功处理。比如我们发送一个查询用户数据的 HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
    • 201 Created:请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
    • 202 Accepted:服务端已经接收到了请求,但是还未处理。
    • 204 No Content:服务端已经成功处理了请求,但是没有返回任何内容。
  • 3xx Redirection(重定向状态码)
    • 301 Moved Permanently:资源被永久重定向了。比如你的网站的网址更换了。
    • 302 Found:资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。
  • 4xx Client Error(客户端错误状态码)
    • 400 Bad Request:发送的 HTTP 请求存在问题。比如请求参数不合法、请求方法错误。
    • 401 Unauthorized:未认证却请求需要认证之后才能访问的资源。
    • 403 Forbidden:直接拒绝 HTTP 请求,不处理。一般用来针对非法请求。
    • 404 Not Found:你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
    • 409 Conflict:表示请求的资源与服务端当前的状态存在冲突,请求无法被处理。
  • 5xx Server Error(服务端错误状态码)
    • 500 Internal Server Error:服务端出问题了(通常是服务端出 Bug 了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
    • 502 Bad Gateway:我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。

2.3 HTTP Header 中常见的字段有哪些?

  • Host 字段:客户端发送请求时,用来指定服务器的域名。
  • Content-Length 字段:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。
  • Connection 字段:Connection 字段最常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用。
    • HTTP 长连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。(HTTP 1.1默认)
  • Content-Type 字段:Content-Type 字段用于服务器回应时,告诉客户端,本次数据是什么格式。
  • Content-Encoding 字段:Content-Encoding 字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式

2.4 HTTP 和 HTTPS 有什么区别?🔥

HTTP 和 HTTPS 对比

  • 端口号:HTTP 默认是 80,HTTPS 默认是 443。
  • URL 前缀:HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://
  • 安全性和资源消耗:HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
  • SEO(搜索引擎优化):搜索引擎通常会更青睐使用 HTTPS 协议的网站,因为 HTTPS 能够提供更高的安全性和用户隐私保护。使用 HTTPS 协议的网站在搜索结果中可能会被优先显示,从而对 SEO 产生影响。

2.5 HTTPS 建立连接过程

腾讯一面

客户端向服务器发起 HTTPS 请求。

服务器返回数字证书,其中包含了服务器的公钥和证书信息。

客户端使用数字证书验证服务器的身份,并从证书中获取服务器的公钥。

客户端生成一个随机的对称密钥,并使用服务器的公钥对其进行加密,然后发送给服务器。

服务器使用自己的私钥解密客户端发送的数据,获取对称密钥。

客户端和服务器使用对称密钥加密和解密数据。对称密钥只在本次通信过程中使用,不会被传输,因此可以保证数据的安全性。

2.6 HTTP/1.0 和 HTTP/1.1 有什么区别?

HTTP/1.0 和 HTTP/1.1 对比

  • 连接方式 : HTTP/1.0 为短连接,HTTP/1.1 支持长连接。HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
  • 状态响应码 : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,100 (Continue)——在请求大资源前的预热请求,206 (Partial Content)——范围请求的标识码409 (Conflict)——请求与当前资源的规定冲突,410 (Gone)——资源已被永久转移,而且没有任何已知的转发地址。
  • 缓存机制 : 在 HTTP/1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP/1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
  • 带宽:HTTP/1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP/1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
  • Host 头(Host Header)处理 :HTTP/1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP/1.0 没有 Host 头字段,无法实现虚拟主机。

2.7 HTTP/1.1 和 HTTP/2.0 有什么区别?🔥

HTTP/1.0 和 HTTP/1.1 对比

  • 多路复用(Multiplexing):HTTP/2.0 在同一连接上可以同时传输多个请求和响应(可以看作是 HTTP/1.1 中长链接的升级版本),互不干扰。HTTP/1.1 则使用串行方式,每个请求和响应都需要独立的连接,而浏览器为了控制资源会有 6-8 个 TCP 连接的限制。这使得 HTTP/2.0 在处理多个请求时更加高效,减少了网络延迟和提高了性能。
  • 二进制帧(Binary Frames):HTTP/2.0 使用二进制帧进行数据传输,而 HTTP/1.1 则使用文本格式的报文。二进制帧更加紧凑和高效,减少了传输的数据量和带宽消耗。
  • 头部压缩(Header Compression):HTTP/1.1 支持Body压缩,Header不支持压缩。HTTP/2.0 支持对Header压缩,使用了专门为Header压缩而设计的 HPACK 算法,减少了网络开销。
  • 服务器推送(Server Push):HTTP/2.0 支持服务器推送,可以在客户端请求一个资源时,将其他相关资源一并推送给客户端,从而减少了客户端的请求次数和延迟。而 HTTP/1.1 需要客户端自己发送请求来获取相关资源。

2.8 HTTP/2.0 和 HTTP/3.0 有什么区别?

HTTP/2.0 和 HTTP/3.0 对比

  • 传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。
  • 连接建立:HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。
  • 队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其它数据流不受影响(本质上是多路复用+轮询)。
  • 错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制。
  • 安全性:HTTP/2.0 和 HTTP/3.0 在安全性上都有较高的要求,支持加密通信,但在实现上有所不同。HTTP/2.0 使用 TLS 协议进行加密,而 HTTP/3.0 基于 QUIC 协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。

HTTP/1.0、HTTP/2.0 和 HTTP/3.0 的协议栈比较:

http-3-implementation

关于 HTTP/1.0 -> HTTP/3.0 更详细的演进介绍,推荐阅读HTTP1 到 HTTP3 的工程优化。

2.9 HTTP 是不保存状态的协议, 如何保存用户状态?

HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不对请求和响应之间的通信状态进行保存。那么我们如何保存用户状态呢?

Session 机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个 Session)。

在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库 redis 保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。

Cookie 被禁用怎么办?

最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。

2.10 URI 和 URL 的区别是什么?

  • URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
  • URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

URI 的作用像身份证号一样,URL 的作用更像家庭住址一样。URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。

2.11 Cookie 和 Session 有什么区别?🔥

  • 存储的位置不同:cookie存放在客户端,session存放在服务端。Session 存储的数据相对更安全。
  • 存储的数据类型不同:两者都是key-value的结构,但cookie 的 value只能是字符串类型,session 的value 是Object类型。
  • 存储的数据大小限制不同:cookie 存储的数据大小受浏览器的限制,很多是4K 的大小, session 存储的数据大小理论上受当前内存的限制。
  • cookie的生命周期是累计的,当浏览器关闭的时候,就消亡了。session的生命周期是间隔的,从创建时,开始计时。如在20分钟,没有访问session,那么session生命周期被销毁。

2.12 GET 和 POST 的区别

  • 语义(主要区别):GET 通常用于查询资源,而 POST 通常用于创建或修改资源。
  • 幂等:GET 请求是幂等的,即多次重复执行不会改变资源的状态,而 POST 请求是不幂等的,即每次执行可能会产生不同的结果或影响资源的状态。
  • 格式:GET 请求的参数通常放在 URL 中,形成查询字符串(querystring),而 POST 请求的参数通常放在请求体(body)中,可以有多种编码格式,如 application/x-www-form-urlencoded、multipart/form-data、application/json 等。GET 请求的 URL 长度受到浏览器和服务器的限制,而 POST 请求的 body 大小则没有明确的限制。不过,实际上 GET 请求也可以用 body 传输数据,只是并不推荐这样做,因为这样可能会导致一些兼容性或者语义上的问题。
  • 缓存:由于 GET 请求是幂等的,它可以被浏览器或其他中间节点(如代理、网关)缓存起来,以提高性能和效率。而 POST 请求则不适合被缓存,因为它可能有副作用,每次执行可能需要实时的响应。
  • 安全性:GET 请求和 POST 请求如果使用 HTTP 协议的话,那都不安全,因为 HTTP 协议本身是明文传输的,必须使用 HTTPS 协议来加密传输数据。另外,GET 请求相比 POST 请求更容易泄露敏感数据,因为 GET 请求的参数通常放在 URL 中。

实际使用过程中,也是通过语义来区分使用 GET 还是 POST。不过,也有一些项目所有的请求都用 POST,这个并不是固定的,项目组达成共识即可。

3 TCP 与 UDP🔥

3.1 TCP 与 UDP 的区别

  1. 是否面向连接:UDP 在传输数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传输数据之前必须先建立连接,数据传输结束后要释放连接。
  2. 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传输时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。
  3. 是否有状态:TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了(这很渣男!)。
  4. 传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。
  5. 传输形式:TCP 是面向字节流的,UDP 是面向报文的。
  6. 首部开销:TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。
  7. 是否提供广播或多播服务:TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;
  8. ……
TCPUDP
是否面向连接
是否可靠
是否有状态
传输效率较慢较快
传输形式字节流数据报文段
首部开销20 ~ 60 bytes8 bytes
是否提供广播或多播服务

3.2 什么时候选择 TCP,什么时候选 UDP?

  • UDP 一般用于即时通信,比如:语音、视频、直播等等。这些场景对传输数据的准确性要求不是特别高,比如看视频即使少个一两帧,实际给人的感觉区别也不大。
  • TCP 用于对传输准确性要求特别高的场景,比如文件传输、发送和接收邮件、远程登录等等。

3.3 HTTP 基于 TCP 还是 UDP?

HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 改用 基于 UDP 的 QUIC 协议

此变化解决了 HTTP/2 中存在的队头阻塞问题。这是由于 HTTP/2.0 在单个 TCP 连接上使用了多路复用,受到 TCP 拥塞控制的影响,少量的丢包就可能导致整个 TCP 连接上的所有流被阻塞。HTTP/3.0 在一定程度上解决了队头阻塞问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。

3.4 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?

运行于 TCP 协议之上的协议

  1. HTTP 协议(HTTP/3.0 之前):超文本传输协议(HTTP,HyperText Transfer Protocol)是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
  2. HTTPS 协议:更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议
  3. FTP 协议:文件传输协议 FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。
  4. SMTP 协议:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,是一种用于发送电子邮件的协议。注意 ⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
  5. POP3/IMAP 协议:两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
  6. Telnet 协议:用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据(包括用户名和密码)均以明文形式发送,这有潜在的安全风险。这就是为什么如今很少使用 Telnet,而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。
  7. SSH 协议 : SSH( Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
  8. ……

运行于 UDP 协议之上的协议

  1. HTTP 协议(HTTP/3.0 ): HTTP/3.0 弃用 TCP,改用基于 UDP 的 QUIC 协议。
  2. DHCP 协议:动态主机配置协议,动态配置 IP 地址
  3. DNS:域名系统(DNS,Domain Name System)将人类可读的域名 (例如, www.baidu.com ) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。我们可以将其理解为专为互联网设计的电话薄。实际上,DNS 同时支持 UDP 和 TCP 协议。
  4. ……

3.5 建立连接时 TCP 三次握手的过程

TCP 三次握手图解

  • 第一次握手:客户端向服务端发送 SYN 报文,表示客户端请求建立连接,然后客户端进入 SYN_SEND 状态;
  • 第二次握手:服务端接收到 SYN 报文后,向客户端发送 SYN+ACK 报文,表示服务端已经收到请求,并同意建立连接,然后服务端进入 SYN_RCVD 状态;
  • 第三次握手:客户端接收到服务端的 SYN+ACK 报文后,向服务端发送 ACK 报文,表示客户端已经收到服务端的确认,然后客户端和服务端都进入ESTABLISHED 状态,连接建立完成。

3.6 什么是半连接队列和全连接队列?

在 TCP 三次握手过程中,Linux 内核会维护两个队列来管理连接请求:

  1. 半连接队列(也称 SYN Queue):当服务端收到客户端的 SYN 请求时,此时双方还没有完全建立连接,它会把半连接状态的连接放在半连接队列。
  2. 全连接队列(也称 Accept Queue):当服务端收到客户端的 ACK 响应时,意味着三次握手成功完成,服务端会将该连接从半连接队列移动到全连接队列。如果未收到客户端的 ACK 响应,会进行重传,重传的等待时间通常是指数增长的。如果重传次数超过系统规定的最大重传次数,系统将从半连接队列中删除该连接信息。

这两个队列的存在是为了处理并发连接请求,确保服务端能够有效地管理新的连接请求。另外,新的连接请求被拒绝或忽略除了和每个队列的大小限制有关系之外,还和很多其他因素有关系。

3.7 为什么要三次握手?

因为三次握手才能保证双方具有接收和发送的能力。

  • 三次握手才可以阻止重复历史连接的建立(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免双方的资源浪费

3.8 不使用 「两次握手」和「四次握手」的原因

  • 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
  • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

3.9 第 2 次握手传回了 ACK,为什么还要传回 SYN?

服务端发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。发送 SYN 则是为了建立并确认从服务端到客户端的通信。

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务端之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务端使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务端之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务端之间传递。

3.10 三次握手过程中可以携带数据吗?

在 TCP 三次握手过程中,第三次握手是可以携带数据的,这一点在 RFC 793 文档中有提到。也就是说,一旦完成了前两次握手,TCP 协议允许数据在第三次握手时开始传输。

如果第三次握手的 ACK 确认包丢失,但是客户端已经开始发送携带数据的包,那么服务端在收到这个携带数据的包时,如果该包中包含了 ACK 标记,服务端会将其视为有效的第三次握手确认。这样,连接就被认为是建立的,服务端会处理该数据包,并继续正常的数据传输流程。

3.11 断开连接时 TCP 四次挥手的过程

TCP 四次挥手图解

断开一个 TCP 连接则需要“四次挥手”,缺一不可:

  1. 第一次挥手:客户端向服务端发送 FIN 报文,表示客户端不再发送数据,请求断开连接,然后客户端进入 FIN-WAIT-1 状态。
  2. 第二次挥手:服务端收到 FIN 报文后,向客户端发送 ACK 报文,表示服务端已经接收到客户端的请求,并准备好断开连接,然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  3. 第三次挥手:服务端向客户端发送 FIN 报文,表示服务端不再发送数据,请求断开连接,然后服务端进入 LAST-ACK 状态。
  4. 第四次挥手:客户端接收到服务端的 FIN 报文后,向服务端发送 ACK 报文,表示客户端已经接收到服务端的请求,然后客户端进入TIME-WAIT状态。服务端收到 ACK 报文后进入 CLOSED 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

3.12 为什么要四次挥手?为什么不能把服务端发送的 ACK 和 FIN 合并起来,变成三次挥手?

服务端收到客户端的 FIN 报文时,内核会马上回一个 ACK报文,但是服务端应用程序可能还有数据要发送,所以并不能马上发送 FIN 报文,而是将发送 FIN 报文的控制权交给服务端应用程序,如果服务端应用程序有数据要发送的话,就发完数据后,才调用关闭连接的函数,之后才会发送 FIN 报文给客户端来表示同意现在关闭连接。不过在特定情况下,四次挥手是可以变成三次挥手的。

3.13 什么情况会出现三次挥手?

在 TCP 挥手过程中,服务端「没有数据要发送」并且「开启了 TCP 延迟确认机制」,那么第二次挥手和第三次挥手就会合并传输,这样就出现了三次挥手。

3.14 如果第二次挥手时服务端的 ACK 没有送达客户端,会怎样?

客户端没有收到 ACK 确认,会重新发送 FIN 请求。

3.15 为什么第四次挥手客户端需要等待 2*MSL(报文最长寿命)时间后才进入 CLOSED 状态?

防止历史连接中的数据,被后面相同四元组的连接 错误的接收

第四次挥手时,客户端发送给服务端的 ACK 报文有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN 报文,如果客户端在 2*MSL 的时间内收到了 FIN 报文,就会重新发送 ACK 报文并再次等待 2MSL,防止服务端始终收不到 ACK 报文而不断重发 FIN 报文。

MSL(Maximum Segment Lifetime) : 报文在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

3.16 TCP 如何保证传输的可靠性?

  1. 确认机制:发送方将每个数据报文都标记一个唯一的序号,接收方收到数据后需要回复一个确认号,表示已经成功接收到了这个数据。
  2. 数据校验:TCP 报文头有校验和,用于校验报文是否损坏。
  3. 超时重传:发送方在发送数据后会设置一个计时器,如果在规定的时间内没有收到确认,则会重新发送数据。这可以保证即使某个数据包在传输过程中丢失,也能够被及时地重传。
  4. 流量控制:TCP 通过滑动窗口机制来控制发送方和接收方的数据发送和接收速率。发送方通过滑动窗口机制来控制发送数据的数量和速度,接收方则通过滑动窗口机制来控制接收数据的数量和速度。
  5. 拥塞控制:TCP 通过拥塞控制机制来避免网络拥塞。发送方会根据网络状况和接收方的反馈来调整数据发送的速率,以避免网络拥塞。

3.17 TCP 如何实现流量控制?

TCP 利用滑动窗口实现流量控制。 TCP 是全双工协议,双方可以同时通信,所以发送方和接收方各自维护一个发送窗口和接收窗口。

  • 发送窗口:用来限制发送方可以发送的数据大小,发送窗口的大小由接收端返回的 TCP 报文段中窗口字段来控制。
  • 接收窗口:用来标记可以接收的数据大小。当窗口大小为 0 时,发送方一般不能再发送数据。

滑动窗口的大小是可以动态调整的,它可以根据网络状况和双方的能力来自适应地调整,从而实现流量控制的功能。如果接收方的接收窗口变小,发送方会相应地减小自己的发送窗口,以避免过多的数据堆积在网络中导致拥塞。如果接收方的接收窗口变大,发送方会相应地增加自己的发送窗口,以提高数据传输速率。

3.18 为什么需要流量控制 ?

这是因为双方在通信的时候,发送方的速率与接收方的速率不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来。如果接收方处理不过来的话,就只能把处理不过来的数据存在 接收缓冲区(Receiving Buffers) 里。如果缓存区满了发送方还在狂发数据的话,接收方只能把收到的数据包丢掉。出现丢包问题的同时又疯狂浪费着珍贵的网络资源。因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡。

3.19 TCP协议是如何处理网络拥塞

拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。

为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

TCP 的拥塞控制采用了四种算法,即 慢开始拥塞避免快重传快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。

  • 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
  • 拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1.
  • 快重传:收到3个重复确认就重传
  • 快恢复:快重传后不是像慢开始那样把拥塞窗口cwnd设为一个较小值,而是设置为当前拥塞窗口cwnd的一半,然后开始拥塞避免算法

4 IP

4.1 IP 协议的作用是什么?

IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。

4.2 什么是 IP 地址?IP 寻址如何工作?

每个连入互联网的设备都被分配一个 IP 地址(Internet Protocol address),作为唯一标识符。当网络设备发送 IP 数据包时,数据包中包含了 源 IP 地址目的 IP 地址 。源 IP 地址用于标识数据包的发送方设备或域,而目的 IP 地址则用于标识数据包的接收方设备或域。

网络设备根据目的 IP 地址来判断数据包的目的地,并将数据包转发到正确的目的地网络或子网络,从而实现了设备间的通信。这种基于 IP 地址的寻址方式是互联网通信的基础,它允许数据包在不同的网络之间传递,从而实现了全球范围内的网络互联互通。IP 地址的唯一性和全局性保证了网络中的每个设备都可以通过其独特的 IP 地址进行标识和寻址。

4.3 什么是 IP 地址过滤?

IP 地址过滤(IP Address Filtering) 简单来说就是限制或阻止特定 IP 地址或 IP 地址范围的访问。例如,你有一个图片服务突然被某一个 IP 地址攻击,那我们就可以禁止这个 IP 地址访问图片服务。IP 地址过滤是一种简单的网络安全措施,实际应用中一般会结合其他网络安全措施,如认证、授权、加密等一起使用。单独使用 IP 地址过滤并不能完全保证网络的安全。

4.4 IPv4 和 IPv6 有什么区别?

IPv4(Internet Protocol version 4) 是目前广泛使用的 IP 地址版本,其格式是四组由点分隔的数字,例如:123.89.46.72。IPv4 使用 32 位地址作为其 Internet 地址,这意味着共有约 42 亿( 2^32)个可用 IP 地址。

IPv4

为了解决 IP 地址耗尽的问题,最根本的办法是采用具有更大地址空间的新版本 IP 协议 - IPv6(Internet Protocol version 6)。IPv6 地址使用更复杂的格式,该格式使用由单或双冒号分隔的一组数字和字母,例如:20 01:0db 8:85a 3:0000:0000:8a2e:03 70:7334 。IPv6 使用 128 位互联网地址,这意味着越有 2^128(3 开头的 39 位数字,恐怖如斯) 个可用 IP 地址。

IPv6

除了更大的地址空间之外,IPv6 的优势还包括:

  • 无状态地址自动配置(Stateless Address Autoconfiguration,简称 SLAAC):主机可以直接通过根据接口标识和网络前缀生成全局唯一的 IPv6 地址,而无需依赖 DHCP 服务器,简化了网络配置和管理。
  • NAT(Network Address Translation,网络地址转换) 成为可选项:IPv6 地址资源充足,可以给全球每个设备一个独立的地址。
  • 对标头结构进行了改进:IPv6 标头结构相较于 IPv4 更加简化和高效,减少了处理开销,提高了网络性能。
  • 可选的扩展头:允许在 IPv6 标头中添加不同的扩展头(Extension Headers),用于实现不同类型的功能和选项。
  • ICMPv6(Internet Control Message Protocol for IPv6):IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。
  • ……

4.5 如何获取客户端真实 IP?

获取客户端真实 IP 的方法有多种,主要分为应用层方法、传输层方法和网络层方法。

应用层方法 :通过 X-Forwarded-For 请求头获取,简单方便。不过,这种方法无法保证获取到的是真实 IP,这是因为 X-Forwarded-For 字段可能会被伪造。如果经过多个代理服务器,X-Forwarded-For 字段可能会有多个值。

传输层方法

  • 利用 TCP Options 字段承载真实源 IP 信息。不过,TCP 标准并不支持,所以需要通信双方都进行改造。
  • 通过 Proxy Protocol 协议来传递客户端 IP 和 Port 信息。这种方法可以利用 Nginx 或者其他支持该协议的反向代理服务器来获取真实 IP 或者在业务服务器解析真实 IP。

网络层方法:隧道 +DSR 模式。这种方法可以适用于任何协议,就是实施起来会比较麻烦,也存在一定限制,实际应用中一般不会使用这种方法。

4.6 NAT 的作用是什么?

NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址映射为公有 IP 地址或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。

NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。

5 WebSocket

5.1 什么是 WebSocket?

WebSocket 是一种基于 TCP 连接的全双工通信协议,即客户端和服务器可以同时发送和接收数据。

WebSocket 协议本质上是应用层的协议,用于弥补 HTTP 协议在持久通信能力上的不足。客户端和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

Websocket 示意图

WebSocket 的常见应用场景:视频弹幕、实时消息推送(详见 Web 实时消息推送详解)、实时游戏对战、多用户协同编辑、社交聊天、……

5.2 WebSocket 和 HTTP 有什么区别?

WebSocket 和 HTTP 两者都是基于 TCP 的应用层协议,都可以在网络中传输数据。

下面是二者的主要区别:

  • WebSocket 是一种双向实时通信协议,而 HTTP 是一种单向通信协议。并且,HTTP 协议下的通信只能由客户端发起,服务器无法主动通知客户端。
  • WebSocket 使用 ws:// 或 wss://(使用 SSL/TLS 加密后的协议,类似于 HTTP 和 HTTPS 的关系) 作为协议前缀,HTTP 使用 http:// 或 https:// 作为协议前缀。
  • WebSocket 可以支持扩展,用户可以扩展协议,实现部分自定义的子协议,如支持压缩、加密等。
  • WebSocket 通信数据格式比较轻量,用于协议控制的数据包头部相对较小,网络开销小,而 HTTP 通信每次都要携带完整的头部,网络开销较大(HTTP/2.0 使用二进制帧进行数据传输,还支持头部压缩,减少了网络开销)。

5.3 WebSocket 的工作过程是什么样的?

  1. 客户端向服务器发送一个 HTTP 请求,请求头中包含 Upgrade: websocketSec-WebSocket-Key 等字段,表示要求升级协议为 WebSocket;
  2. 服务器收到这个请求后,会进行升级协议的操作,如果支持 WebSocket,它将回复一个 HTTP 101 状态码,响应头中包含 ,Connection: UpgradeSec-WebSocket-Accept: xxx 等字段、表示成功升级到 WebSocket 协议。
  3. 客户端和服务器之间建立了一个 WebSocket 连接,可以进行双向的数据传输。数据以帧(frames)的形式进行传送,WebSocket 的每条消息可能会被切分成多个数据帧(最小单位)。发送端会将消息切割成多个帧发送给接收端,接收端接收消息帧,并将关联的帧重新组装成完整的消息。
  4. 客户端或服务器可以主动发送一个关闭帧,表示要断开连接。另一方收到后,也会回复一个关闭帧,然后双方关闭 TCP 连接。

另外,建立 WebSocket 连接之后,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性。

5.4 SSE 与 WebSocket 有什么区别?

SSE 与 WebSocket 作用相似,都可以建立服务端与浏览器之间的通信,实现服务端向客户端推送消息,但还是有些许不同:

  • SSE 是基于 HTTP 协议的,它们不需要特殊的协议或服务器实现即可工作;WebSocket 需单独服务器来处理协议。
  • SSE 单向通信,只能由服务端向客户端单向通信;WebSocket 全双工通信,即通信的双方可以同时发送和接受信息。
  • SSE 实现简单开发成本低,无需引入其他组件;WebSocket 传输数据需做二次解析,开发门槛高一些。
  • SSE 默认支持断线重连;WebSocket 则需要自己实现。
  • SSE 只能传送文本消息,二进制数据需要经过编码后传送;WebSocket 默认支持传送二进制数据。

SSE 与 WebSocket 该如何选择?

对于游戏、即时通信以及需要双向近乎实时更新的场景,拥有双向通道更具吸引力。但是,在某些情况下,不需要从客户端发送数据。而你只需要一些服务器操作的更新。比如:站内信、未读消息数、状态更新、股票行情、监控数量等场景,SEE 不管是从实现的难易和成本上都更加有优势。此外,SSE 具有 WebSocket 在设计上缺乏的多种功能,例如:自动重新连接、事件 ID 和发送任意事件的能力。

6 PING

6.1 PING 命令的作用是什么?

PING 命令是一种常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。

如果 PING 对应的目标主机无法得到正确的响应,则表明这两个主机之间的连通性存在问题(有些主机或网络管理员可能禁用了对 ICMP 请求的回复,这样也会导致无法得到正确的响应)。如果往返时间(RTT)过高,则表明网络延迟过高。

6.2 PING 命令的工作原理是什么?

PING 基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议),其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。

ICMP 报文中包含了类型字段,用于标识 ICMP 报文类型。ICMP 报文的类型有很多种,但大致可以分为两类:

  • 查询报文类型:向目标主机发送请求并期望得到响应。
  • 差错报文类型:向源主机发送错误信息,用于报告网络中的错误情况。

PING 用到的 ICMP Echo Request(类型为 8 ) 和 ICMP Echo Reply(类型为 0) 属于查询报文类型 。

  • PING 命令会向目标主机发送 ICMP Echo Request。
  • 如果两个主机的连通性正常,目标主机会返回一个对应的 ICMP Echo Reply。

7 DNS

7.1 DNS 的作用是什么?

DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题

在一台电脑上,可能存在浏览器 DNS 缓存,操作系统 DNS 缓存,路由器 DNS 缓存。如果以上缓存都查询不到,那么 DNS 就闪亮登场了。

目前 DNS 的设计采用的是分布式、层次数据库结构,DNS 是应用层协议,它可以在 UDP 或 TCP 协议之上运行,端口为 53

7.2 DNS 服务器有哪些?根服务器有多少个?

  • 根域名服务器:最高层次的域名服务器,用来管辖顶级域名。
  • 顶级域名服务器:顶级域名是指域名的后缀,如 comnet。顶级域名服务器提供了权限域名服务器的 IP 地址。
  • 权限域名服务器:负责一个区的域名服务。
  • 本地域名服务器:当主机发出 DNS 请求时,该请求被发往本地域名服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。

世界上并不是只有 13 台根服务器,而是 13 组,目前 600 多台。

7.3 DNS 解析的过程是什么样的?

助记:递归转个圈,迭代发三叉

7.4 DNS 劫持了解吗?如何应对?

DNS 劫持是一种网络攻击,它通过修改 DNS 服务器的解析结果,使用户访问的域名指向错误的 IP 地址,从而导致用户无法访问正常的网站,或者被引导到恶意的网站。DNS 劫持有时也被称为 DNS 重定向、DNS 欺骗或 DNS 污染。

  • 使用 DNS over HTTPS (DoH) 或 DNS over TLS (DoT): DoH和DoT 通过将DNS查询数据加密,可以保护用户的隐私并防止DNS劫持。
  • 使用可信赖的 DNS 服务器:使用由可信赖的组织提供的 DNS 服务器,例如 ISP 提供的 DNS 服务器或公共 DNS 服务器。
  • 定期检查网络设置:确保 DNS 服务器设置正确,防止 DNS 被非法篡改

8 ARP

8.1 什么是 Mac 地址?

MAC 地址的全称是 媒体访问控制地址(Media Access Control Address)。如果说,互联网中每一个资源都由 IP 地址唯一标识(IP 协议内容),那么一切网络设备都由 MAC 地址唯一标识。

MAC 地址的长度为 6 字节(48 比特),地址空间大小有 280 万亿之多( 2 48 2^{48} 248),MAC 地址由 IEEE 统一管理与分配,理论上,一个网络设备中的网卡上的 MAC 地址是永久的。不同的网卡生产商从 IEEE 那里购买自己的 MAC 地址空间(MAC 的前 24 比特),也就是前 24 比特由 IEEE 统一管理,保证不会重复。而后 24 比特,由各家生产商自己管理,同样保证生产的两块网卡的 MAC 地址不会重复。

MAC 地址具有可携带性、永久性,身份证号永久地标识一个人的身份,不论他到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。

最后,记住,MAC 地址有一个特殊地址:FF-FF-FF-FF-FF-FF(全 1 地址),该地址表示广播地址。

8.2 ARP 协议解决了什么问题?

ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。

8.3 ARP 协议的工作原理?

检查 ARP 高速缓存,有对应项则写入 MAC 帧,没有则用目的 MAC 地址为 FF-FF-FF-FF-FF-FF 的帧封装并广播 ARP 请求分组,同一局域网中所有主机都能收到该请求。目的主机收到请求后就会向源主机单播一个 ARP 响应分组,源主机收到后将此映射写入 ARP 缓存。

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

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

相关文章

MySQL主从复制之GTID模式

目录 1 MySQL 主从复制 GTID 模式介绍 2 传统复制模式与GTID复制模式的区别 3 GTID模式核心参数 4 GTID 实现自动复制原理 4.1 GTID基本概念 4.2 GTID复制流程 5 GTID 实现自动定位 5.1 配置 my.cnf 5.2 配置 SLAVE 实现自动定位 5.3 测试 6 GTID 模式 故障转移的方法流程 6.1…

记一次NULL与空字符串导致的分组后产生重复数据

目录 一,场景说明二,实现功能三,修改原实现方法四,说明 一,场景说明 想实现这样一个功能,统计人员信息中不同性别的人的总工资。 实现方式:将数据group by 分组后累加。 二,实现功…

SpringMVC核心机制环境搭建

文章目录 1.SpringMVC执行流程1.基础流程图2.详细流程图 2.安装Tomcat1.下载2.解压到任意目录即可3.IDEA配置Tomcat1.配置Deloyment2.配置Server 3.创建maven项目1.创建sun-springmvc模块(webapp)2.查看是否被父模块管理3.pom.xml引入依赖4.目录5.SunDis…

npm阿里云制品仓库

配置 配置仓库地址,可以再在仓库指南看到 npm config set registryxxxxx#登录,帐户密码可以在仓库指南看到 npm login注意:npm>9的版本npm login目前有问题 verbose web login not supported, trying couch,暂时没试验到解决…

C语言函数递归

前言与概述 本文章将通过多个代码并赋予图示,详细讲解C语言函数递归的定义和函数递归的运算过程。 函数递归定义 程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。它…

LLM agentic模式之规划能力(planning)

文章目录 任务分解分解优先方法交替分解方法 多计划选择外部规划器辅助规划反思和改进记忆增强规划评估 2024年2月的综述《 Understanding the planning of LLM agents: A survey》提供了基于LLM的的agent的规划(planning)能力的系统视角,总结了近年来提高规划能力…

EmguCV学习笔记 VB.Net 6.4 霍夫变换

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

基于x86 平台opencv的图像采集和seetaface6的人脸朝向姿态估计功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸朝向姿态估计功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸朝向姿态…

Telnet不止于端口测试:探索经典工具的多样化应用

文章目录 Telnet详解与实用指南1. 引言2. Telnet 的安装和启动2.1 在 Windows 上安装 Telnet2.2 在 Linux 上安装 Telnet2.3 在 macOS 上使用 Telnet 3. Telnet 的基本命令与操作3.1 远程登录3.2 测试端口连通性3.3 调试网络服务3.4 网络协议调试3.5 简单的文件传输 4. Telnet …

sklearn中的线性回归

多元线性回归 指的 是一个样本 有多个特征的 线性回归问题。 w 被统称为 模型的 参数,其中 w0 被称为截距(intercept),w1~wn 被称为 回归系数(regression coefficient)。这个表达式和 yazb 是同样的…

Web前端性能优化合集

简介 自互联网兴起以来,从最初的静态网页到如今的动态交互、单页应用(SPA)、PWA(Progressive Web Apps)等,互联网技术正在飞速发展,随着用户体验成为核心竞争力之一,前端性能直接影…

【Midjourney】Midjourney全面开放网站版,所有用户每天可免费生成25次

Midjourney一直作为AI文生图领域的龙头老大,最近对面对市场上日益增长的竞争压力,尤其是来自 Flux 的挑战,终于向所有用户开放官方网站。尽管还处于早期阶段,但为了吸引更多用户体验,它暂时是完全免费的。 下面是Midj…

什么是d3dx9_42.dll?如何将丢失的d3dx9_42.dll进行修复呢?

d3dx9_42.dll文件丢失什么情况?如何将丢失的d3dx9_42.dll进行修复呢?d3dx9_42.dll又是什么文件?d3dx9_42.dll 文件是一个由 Microsoft Corporation 开发的部分,属于 Microsoft DirectX for Windows 的一组庞大库集合中的一个。Dir…

Android系统架构

文章目录 Android系统架构Android四层架构01.Linux内核层02.系统运行库层03.应用框架层04.应用层 Android应用开发特色01.四大组件02.丰富的系统控件03. SQLite数据库04.强大的多媒体05.地理位置定位 Android系统架构 为了让你能够更好地理解Android系统是怎么工作的&#xff…

HashMap 的实现原理

说一下 HashMap 的实现原理? JDK1.7 HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。(其实所谓Map其实就是保存了两个对象之间的映射关系的一种集合),其中Key 和…

PDPS软件 那智机器人 (丰田版)离线程序导出处理

在PDPS仿真软件中导出的那智机器人离线程序,一般是无法直接给TFD控制装置-那智机器人(丰田式样版)导入及识别使用。因此要对导出的程序进行转换编译处理,才能给TFD那智机器人(丰田式样版)导入离线程序。以下…

Java共享内容通信 VS Golang通信共享内存

接触的编程语言从C到Java再到现在Go,每个语言都有其独有特性,也具备共通之处。 最近在学习并发编程的时候,发现一个很有意思的点:Java基于共享共享内存通信,而Golang则是通过通信共享内存。为什么?下面我们…

自定义@ResponseBody以及SpringMVC总结

文章目录 1.需求分析2.目录3.自定义ResponseBody注解4.MonsterController.java5.Monster.java 实现序列化接口6.引入jackson7.Adapter.java 如果有ResponseBody注解就返回json8.测试9.SpringMVC执行流程 1.需求分析 2.目录 3.自定义ResponseBody注解 package com.sunxiansheng…

简单实现进度条效果(vue2)

如果用echarts或者其他图表来写个进度条有点大材小用&#xff0c;所以直接简单html、js写一下就可以&#xff1b; 以下代码基于vue2&#xff0c; 部分代码来自国内直连GPT/Claude镜像站 <template><div class"progress-container"><div class"p…

springboot框架中filter过滤器的urlPatterns的匹配源码

如下图所示&#xff0c;我使用WebFilter注解的方式定义了一个过滤器&#xff0c;同时定义了过滤器的过滤条件 urlPatterns为/*,可能很多人都知道filter的/*代表所有URL都匹配&#xff0c;但是源码在哪里呢 先打断点看一下调用链 然后跟着调用链慢慢点&#xff0c;看看哪里开始…