LOADING

http与https

2022/1/23

http 请求报错

一种情况是返回 200,但参数里附带着 code=0 或者 code=500 来表示请求有没有通过(成功访问或者没有成功访问),无论哪种都是这次 http 请求返回的状态码是 200,只是内容不同而已

还有一种是 catch 或者服务器的代码错误,或者直接 throw error 这时候如果不统一处理的话,会显示这次请求是错误的,状态码是 500 等信息
image.png
当然 nest 也给予了统一处理 catch 错误,这时候你可以修改错误代码,信息等内容
image.png

http 状态码和含义

  • 100-199 用于指定客户端应相应的某些动作。
  • 200-299 用于表示请求成功。
  • 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
  • 400-499 用于指出客户端的错误。
  • 400 语义有误,当前请求无法被服务器理解。
  • 401 当前请求需要用户验证
  • 403 服务器已经理解请求,但是拒绝执行它。
  • 500-599 用于支持服务器错误。
  • 503 – 服务不可用

POST 和 GET 的区别

  • GET 在浏览器回退时是无害的,而 POST 会再次提交请求 *
  • GET 请求会被浏览器主动缓存,而 POST 不会,除非手动设置 *
  • GET 请求参数会被完整保留在浏览器的历史记录里,而 POST 中的参数不会被保留 *
  • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有限制 *
  • GET 参数通过 URL 传递,POST 放在 Request body 中 *
  • GET 请求只能进行 url 编码,而 POST 支持多种编码方式
  • GET 产生的 URL 地址可以被收藏,而 POST 不可以
  • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制
  • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息

TCP 的三次握手和四次挥手

三次握手

第一次握手:客户端发送一个 SYN 码给服务器,要求建立数据连接;
第二次握手: 服务器 SYN 和自己处理一个 SYN(标志);叫 SYN+ACK(确认包);发送给客户端,可以建立连接
第三次握手: 客户端再次发送 ACK 向服务器,服务器验证 ACK 没有问题,则建立起连接;

SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。

四次挥手

第一次挥手: 客户端发送 FIN(结束)报文,通知服务器数据已经传输完毕;
第二次挥手: 服务器接收到之后,通知客户端我收到了 SYN,发送 ACK(确认)给客户端,数据还没有传输完成
第三次挥手: 服务器已经传输完毕,再次发送 FIN 通知客户端,数据已经传输完毕
第四次挥手: 客户端再次发送 ACK,进入 TIME_WAIT 状态;服务器和客户端关闭连接;

建立连接的时候, 服务器在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。

而关闭连接时,服务器收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送 FIN 报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送,从而导致多了一次。

为什么不是两次握手

两次握手就建立连接,假如主机 A 发送的 SYN 因网络问题迟迟没有到达主机 B,这时候会重发另一个 SYN 包给 B,当 A 接受到 B 的 ACK 包时建立连接。这时如果第一个 SYN 到达 B 时,主机 B 会认为主机 A 希望再次建立连接,会返回一个 ACK 包给 A。当 A 收到 ACK 时会抛弃掉这个包,因为 A 并不想建立连接,这时主机 B 认为连接已经建立,会一直等待主机 A 发送数据,这样会导致主机 B 的性能损耗。

用户输入 url 到页面呈现的过程

  • 用户输入 url
  • 浏览器查找域名的 IP 地址 域名解析(DNS 解析)
  • 找到 IP 地址后,建立 TCP 三次握手 ,与目标服务器建立连接
  • 握手成功后,通过规定的协议(http),浏览器向目标主机发送 http 请求,请求数据包
  • 服务器处理收到的请求,将数据返回至浏览器
  • 浏览器收到 HTTP 响应报文
  • 关闭连接 浏览器解析文档
  • 读取页面内容,浏览器渲染,解析 html 源码
  • 生成 Dom 树、解析 css 样式、js 交互
  • 在生成 Render 树的过程中,浏览器就开始调用 GPU 绘制,合成图层,将内容显示在屏幕上了

优化渲染过程

减少重绘和回流
懒执行 —— 将某些逻辑放到使用时再进行,可以通过定时器或事件进行唤醒
懒加载 —— 将不关键的资源延后加载,如图片、视频资源等。
图片优化:
可以用 css 模拟代替的尽量不要用图片
小图片用 base64 格式
雪碧图
小图使用 PNG ,图标类可以使用 SVG 代替
照片使用 JPEG

http 缓存控制

  1. http 缓存能够帮助服务器提高并发性能,很多资源不需要重复请求直接从浏览器中拿缓存
  2. http 缓存分类 :强缓存 协商缓存
  3. 强缓存通过  expires 和 cache-control 控制   协商缓存   通过  last-Modify   和 E-tag 控制

补充:

  1. 为什么有 expires 有需要 cache-control
    因为 expires 有个服务器和浏览器时间不同步的问题
    expires 是绝对事件   cache-control 是相对时间
2. last-modify和Etag
   last-modify 它是有个精度问题  到秒
   e-tag 没有精度问题  只要文件改变  e-tag值就改变

http 请求的推演过程

  1. url(www.baidu.com)  =>  ip  (192.168.1.2)
  2. 拿到 ip 去跟服务器建立 tcp 连接
  3. 建立 tcp 连接之后发起 http 请求  ( tcp 是比 http 更底层一个连接协议)(ip 是 tcp 下面一层)
  4. http 连接建立之后 服务器把 html 发送给浏览器
  5. 浏览器解析 html(js 文件,css 文件,图片 下载 运行)
  6. 浏览器渲染 html
  7. 服务器关闭连接  tcp  http