跳到主要内容

题目 26 - 题目 30

26.TCP 和 HTTP 请求之间有什么关系?​

TCP 连接的复用:

  • HTTP/1.0:默认情况下,每个 HTTP 请求都会建立一个新的 TCP 连接,并在请求完成后立即关闭。可以通过设置 Connection: keep-alive 头部来保持连接。
  • HTTP/1.1:默认支持长连接(Connection: keep-alive),浏览器和服务器之间可以复用同一个 TCP 连接。

TCP 连接的关闭:

  • 如果在等待超时时间后,连接未被使用,它会自动断开。

HTTP 请求的并发性:

  • HTTP/1.1:虽然单个 TCP 连接在同一时刻只能处理一个请求,但浏览器可以同时与服务器建立多个 TCP 连接,从而支持并发请求。
  • HTTP/2.0:引入了多路复用(Multiplexing),允许在一个 TCP 连接中同时发送和接收多个请求和响应。

浏览器限制:

  • 浏览器对同一个域名 Host 的 TCP 连接数量有限制,例如 Chrome 浏览器最多允许建立 6 个 TCP 连接。

HTTPS 和 HTTP/2.0:

  • 如果资源都是 HTTPS 连接,并且处于同一域名下,浏览器会尝试使用 HTTP/2.0 的多路复用功能。
  • 如果无法使用 HTTP/2.0,浏览器会在同一个 host 建立多个 TCP 连接,每个连接按顺序请求资源。

27.说说 https 的握手过程​

  • CP 三次握手:建立一个 TCP 连接。
  • 客户端发送 Client Hello:客户端发送包含 TLS 版本、随机数、加密套件候选列表等信息的数据包。
  • 服务端发送 Server Hello:服务端收到客户端的 Client Hello 后,选择一个 TLS 版本和加密套件,并发送 Server Hello 响应。
  • 服务端发送证书:服务端发送自己的数字证书,证明其身份。
  • 服务端发送 Server Key Exchange:对于某些加密算法,服务端发送公钥参数。
  • 服务端发送 Server Hello Done:通知客户端 Server Hello 信息发送结束。
  • 客户端发送 Client Key Exchange、Change Cipher Spec、Encrypted Handshake Message:客户端发送公钥参数,通知使用协商的密钥和加密算法,并发送加密的握手消息以测试密钥的有效性。
  • 服务端发送 New Session Ticket:服务端发送会话票据,用于在超时时间内复用协商的密钥。
  • 服务端发送 Change Cipher Spec:服务端通知客户端后续通信将使用协商的密钥和加密算法。
  • 服务端发送 Encrypted Handshake Message:服务端发送加密的握手消息,用于验证客户端和服务端能正常加密和解密。
  • 完成密钥协商,开始发送数据:双方使用协商的密钥加密和解密数据。
  • 完成数据发送,4 次 TCP 挥手:双方发送结束握手,关闭 TCP 连接。

28.从存储位置看,浏览器缓存分为哪几种?​

  • Service Worker:独立于浏览器线程运行的程序,支持 HTTPS 协议,可自定义缓存策略,缓存持续存在。缓存流程包括注册 Service Worker、监听 install 事件进行缓存、拦截请求查询缓存,未命中则通过 fetch 获取数据。

  • Memory Cache:存储在内存中的缓存,包含页面已抓取的资源。读取速度快,但持续时间短,页面关闭后缓存释放。不依赖 HTTP 缓存头,匹配资源时考虑 URL 和 Content-Type 等因素。

  • Disk Cache:存储在硬盘上的缓存,包含大多数资源的缓存。读取速度慢,但存储容量大,持续时间长。根据 HTTP 头中的 Cache-Control 等字段判断缓存策略。

  • Push Cachee: HTTP/2 中的内容,当其他缓存未命中时使用。存在于会话中,会话结束即释放,缓存时间短。支持所有资源缓存,但仅能使用一次。可以跨域推送资源,浏览器可拒绝重复资源推送。

浏览器首先检查 Service Worker 缓存,然后是 Memory Cache,接着是 Disk Cache,最后是 Push Cache。如果所有缓存均未命中,浏览器将请求网络资源。

Cache-Control 有哪些常见配置值?​

咱们先看看 request 首部 Cache-Control 的值

  • no-cache

当客户端请求时携带这个首部字段的时候,通过中间的缓存服务器时,会不去拿缓存资源,而是让中间服务器转发给资源服务器,资源服务器看看一下这个资源过期没有,如果没有就会告知中间服务器,可以使用缓存资源。否则资源服务器就会直接返回新的资源。

  • no-store

这个字段非常有意思,就是告知服务器或者客户端以及中间服务器,我请求或者响应的内容里面有机密信息,这些响应的内容是永远不会得到响应的。

  • max-age

max-age 指令标示了客户端不愿意接收一个 age 大于设定时间的响应,这个字段表达是最大缓存时长,请求中单单添加这个字段,实现不了缓存时长,必须结合响应的 max-age。一会,会在响应中的 max-age 详细说明

  • max-stale

这个指令表达的是缓存时长过期以后,还可以有效。比如现在 max-age:60 秒,那么 max-stale:60 秒,现在的缓存时长就是 120 秒,

  • min-fresh

设定能够容忍的最小新鲜度(缓存时长)。min-fresh 标示了客户端不愿意接受新鲜度不多于当前的 age 加上 min-fresh 设定的时间之和的响应。

  • no-transfrom

使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改 变实体主体的媒体类型。

  • only-if-cache

使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下,才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本 地缓存无响应,则返回状态码 504 Gateway Timeout。

  • cache-extension

通过 cache-extension 标记(token),可以扩展 Cache-Control 首部字 段内的指令。

  • 咱们再看看 response 首部 Cache-Control 的值

    • pulic

    这个字段和 private 是相对的,Cache-Control: public 时,则表明所有的用户在通过缓存服务器的时候,都可以缓存这个资源。

    • private

    这个字段和 pulic 是相对的,Cache-Control: private 时,则表明只有某个在通过缓存服务器的时候,得到缓存资源

    • no-cache

    如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对 资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资 源有效性进行确认,且禁止其对响应资源进行缓存操作。

    • no-store

    同请求首部的 no-store 指令一样

    • no-transfrom

    同请求首部的 no-transfrom 指令一样

    • max-age

    在 Response 中设置 max-age 的时间信息,可以在客户端生成缓存文件,在缓存不过期的情况下,客户端不会直接向服务器请求数据,在缓存过期的情况下,客户端会向服务器直接请求生成新的缓存。

29.说说对 TCP/IP 协议的了解​

TCP/IP 通讯协议采用了 4 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这 4 层分别为:

  1. 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

  2. 传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP 和 UDP 给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  3. 网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

  4. 数据链路层(主机-网络层):接收 IP 数据报并进行传输,从网络上接收物理帧,抽取 IP 数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如 Ethernet、Serial Line 等)来传送数据。

30.TCP 连接的三次握手和四次握手​

为什么要三次握手呢?两次不行吗?​

  • 为了防止服务器端开启一些无用的连接增加服务器开销
  • 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

为什么要挥手四次?​

再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

为什么在 TIME-WAIT 阶段要等 2MS​

为的是确认服务器端是否收到客户端发出的 ACK 确认报文,当客户端发出最后的 ACK 确认报文时,并不能确定服务器端能够收到该段报文。

Loading Comments...