题目 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 层分别为:
-
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
-
传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP 和 UDP 给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
-
网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
-
数据链路层(主机-网络层):接收 IP 数据报并进行传输,从网络上接收物理帧,抽取 IP 数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如 Ethernet、Serial Line 等)来传送数据。
30.TCP 连接的三次握手和四次握手
为什么要三次握手呢?两次不行吗?
- 为了防止服务器端开启一些无用的连接增加服务器开销
- 防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
为什么要挥手四次?
再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
为什么在 TIME-WAIT 阶段要等 2MS
为的是确认服务器端是否收到客户端发出的 ACK 确认报文,当客户端发出最后的 ACK 确认报文时,并不能确定服务器端能够收到该段报文。