参考

https://www.cnblogs.com/junun/p/18543421

http无状态

无状态是指协议对于事物没有记忆功能。假如后面的处理需要前面的信息,则前面的信息必须重传,这可能导致每次连接传送数据量增大。另一方面,服务器不需要前面信息时,应答就较快。直观的说,就是每个请求都是独立的,与前面的请求和后面的请求都是没有直接联系的。

实现无状态:web=http协议+状态机制+其他机制,可以通过Cookie、Session和Application实现Web的状态连接

三次握手和四次挥手过程

三次握手的过程:

  • 客户端发送 SYN 包:客户端选择一个初始序列号 x,发送 SYN 包给服务器(SYN=1, seq=x)。
  • 服务器响应 SYN-ACK 包:服务器收到 SYN 包后,发送一个 SYN-ACK 包作为响应(SYN=1, ACK=1, seq=y, ack=x+1)。
  • 客户端发送 ACK 包:客户端收到 SYN-ACK 包后,发送 ACK 包确认连接建立(ACK=1, seq=x+1, ack=y+1)。

四次挥手过程,因为 TCP 连接是全双工的,所以每个方向的关闭都需要单独的步骤

  • 主动方发送 FIN 包:主动关闭方发送 FIN 包,请求关闭连接(FIN=1, seq=u)。
  • 被动方响应 ACK 包:被动关闭方收到 FIN 包后,发送 ACK 包作为确认(ACK=1, seq=v, ack=u+1)。
  • 被动方发送 FIN 包:被动关闭方准备关闭连接时,发送 FIN 包(FIN=1, seq=w)。
  • 主动方响应 ACK 包:主动关闭方收到 FIN 包后,发送最后的 ACK 包来关闭连接(ACK=1, seq=u+1, ack=w+1)。

HTTP 状态码有哪些?

  • 200 OK:请求成功,服务器已正常处理请求。
  • 301 Moved Permanently:永久重定向,资源的 URL 已永久更改。
  • 302 Found:临时重定向,资源的 URL 已临时更改。
  • 304 Not Modified:未修改,请求的资源未发生变化,可以使用缓存的版本。
  • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
  • 401 Unauthorized:请求需要用户的身份认证。
  • 403 Forbidden:服务器理解请求但拒绝执行,可能是权限问题。
  • 404 Not Found:服务器上未找到请求的资源。
  • 500 Internal Server Error:服务器内部错误,无法完成请求。

http常见请求头/响应头

  • 缓存控制:cache-control、expires、Last-Modify/If-Modify-Since、Etag/If-None-Match
  • 跨域控制:access-control-allow-origin、allow-methods、allow-headers
  • accept:accept-encoding、accept-language
  • content-type、content-length
  • cookie、user-agent
  • origin、refer

在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

  • 发送心跳包:定期发送小的数据包,以保持连接活跃。心跳包可以是一个空的数据包或者特定的心跳消息。
  • 使用 HTTP 持久连接(HTTP Persistent Connections):在 HTTP/1.1 中,默认开启持久连接,使用Connection: keep-alive头部。

http2.0的优势

提升性能:

  • 多路复用:可以同时处理多个请求和响应,大大减少了连接建立的次数,提高了网络传输效率。
  • 头部压缩:压缩头部信息降低数据量。
  • 服务器推送:允许服务器在客户端明确请求前,主动发送为完成客户端请求所需的资源。这意味着服务器可以在发送 HTML 页面响应时,预测客户端需要的其他资源(如CSS文件、JavaScript脚本等)并主动推送它们,消除了客户端等待这些资源的时间。

http3.0

主要改变的是采用UDP协议

HTTPS 相对于 http 的优点?

  • 加密通信,使用 ssl 证书对传输内容进行加密
  • 身份认证,服务器向客户端出示由权威机构颁发的SSL/TLS证书,客户端验证该证书的有效性和服务器的身份,确保连接到的是正确的服务提供者,而非冒充者。

缺点:

HTTPS显著提高了网络通信的安全性,但也带来了一定的成本和性能影响。一方面,申请和维护SSL/TLS证书会产生一定的费用,尤其是选择付费商业证书时;另一方面,由于加密和解密过程涉及计算资源消耗,HTTPS相对于HTTP来说可能会略微增加延迟并减少缓存效率,但这可以通过优化技术手段得到改善。

强缓存和协商缓存

强缓存

强缓存也就是本地缓存。

浏览器首次请求资源后,需要再次请求时,浏览器会首先获取该资源缓存的header信息,然后根据Cache-Control和expires来判断该资源在本地缓存否过期。若没过期则直接从本地缓存中获取资源信息,浏览器就不再向服务器重新请求资源,如过期则需重新发送请求,重新缓存资源,更新缓存时间。

  • Expires,绝对时间,http1.0的规范
  • Cache-Control,相对时间,http1.1的规范
  • 可以同时存在,Cache-Control的优先级更高

协商缓存

协商缓存是询问服务器资源是否过期。

因为浏览器需要向服务器确认缓存资源是否可用,二者要进行通信,而通信的过程就是发送请求,所以在header中就需要有专门的标识来让服务器确认请求资源是否可以缓存访问。

  • Last-Modify/If-Modify-Since: - 当浏览器第一次向服务器请求资源时,服务器会在该资源的请求头中加上Last-Modify,就是该资源在服务器的最新修改时间。 - 然后当浏览器再次请求这个资源时,会在请求报文中带上If-Modify-Since,值是浏览器上一次请求该资源时返回的Last-Modify时间。 - 当服务器收到If-Modify-Since时间后,会判断这个资源的当前最新修改时间和If-Modify-Since时间是否相等,相等则说明浏览器缓存的资源已经是最新的了,服务器返回304状态码告诉浏览器资源已是最新不用更新。不相等则说明在浏览器没有请求的这段时间,这个资源已经进行了修改、更新,浏览器本地缓存的这个资源已经不是最新的了,这时候服务器重新返回该资源的最新版以及最新的Last-Modify时间。
  • Etag/If-None-Match:和上面的逻辑处理一致,但是Last-Modified标注只能精确到秒级,如果某些资源在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间。Etag是服务器自动生成或者由开发者生成的资源在服务器的唯一标识符,能够更加准确的控制缓存。优先级更高。

跨域

同源策略:协议、端口号、域名不一致

浏览器阻止跨域的主要原因是出于安全考虑,具体来说是为了防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等安全问题‌。同源策略是浏览器的一种安全机制,它限制了跨域请求的访问权限,防止恶意网站获取用户的敏感信息或进行恶意操作‌。

如果没有同源策略,恶意网站可以通过脚本窃取用户的敏感数据,如Cookies、用户输入的密码、银行账号等,从而进行非法操作。此外,跨域请求还可能导致CSRF攻击和隐私泄露等问题‌

跨域解决方法:

  • CORS跨域资源共享:需要在服务器实现CORS,设置跨域的请求头:Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers这些
  • 服务端代理
  • Jsonp:利用<script>标签可以跨域加载资源的特性,通过添加一个查询参数并处理回调函数来实现跨域数据传输。

DNS预解析

DNS 预解析(也称为 DNS 预取或 DNS 预加载)是一种技术,它允许浏览器在实际需要之前就开始解析域名。这通常用于提高 Web 页面的加载时间,通过减少页面加载过程中的 DNS 查询延迟。

  • 工作原理:浏览器在解析 HTML 文档时遇到带有<link rel="prefetch"><link rel="dns-prefetch">的标签时,会触发 DNS 预解析。当实际请求资源时,DNS 查询已经完成。
  • 减少延迟:通过提前进行 DNS 查询,可以减少页面加载过程中的延迟,因为当实际请求资源时,DNS 查询已经完成。