跳到主要内容

谈谈网络相关

  • TLS和SSL协议: TLS是SSL的升级版本,它们都是用于保护网络通信安全的加密协议

谈谈http1、http2、http3​

HTTP1.1有哪些特点?​

  • 长连接:

    • 新增了keep-alive长连接
  • 具备兼容性:

    • HTTP/1.1是最早也是最广泛使用的HTTP协议版本,几乎所有的网络设备和服务器都支持。
  • 新增pipeline管道

  • 新增了请求方法:

    • 增加了PUT、DELETE、OPTIONS、PATCH等新的方法

HTTP1.1缺点:

  • 队头阻塞

    • 处理大量请求时, 一个请求或响应在网络传输过程中被阻塞时,后续的请求或响应也会被阻塞
  • 不安全:

    • 明文传输:HTTP 1.x使用明文传输,即数据以纯文本形式传输,不经过加密处理
  • 不支持多路复用:

    • 每个请求都需要单独建立和维护连接,无法实现多路复用。

HTTP2.0有哪些特点?​

  • 多路复用:

    • HTTP/2引入了多路复用技术,可以在单个连接上并行发送和接收多个请求和响应,提高网络传输并发性和效率。
    • 一个TCP连接就可以传输多个请求数据
    • 多路复用可以解决队头阻塞的问题
      • 通过多路复用可以同时发送多个请求和响应,可以并行的传输
    • 解决了浏览器限制同一个域名下的请求数量问题
  • 头部压缩:

    • 头部信息进行压缩,减少了数据传输的大小,提升了性能
    • 因此即使非常小的请求,其请求和响应的header都只会占用很小比例的带宽
  • 头部支持二进制协议

    • 二进制协议解析起来更高效
    • 而http1.1是报文的头信息是文本,数据体可以是文本,也可以是二进制
    • HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制
  • 服务器推送:

    • HTTP/2支持服务器推送(Server Push)功能
    • 允许服务器主动向客户推送数据

HTTP2.0缺点:

  • 连接复用问题:
    • TCP连接的复用可能存在一些问题,需要一些额外的优化和调整。

HTTP3.0有哪些特点?​

  • 传输效率:

    • HTTP/3基于QUIC协议,通过减少连接建立和恢复的时间、降低丢包率等优化,提高了传输效率。
      • QUIC是基于 UDP 协议
    • 将底层TCP协议改为UDP,彻底解决队头阻塞问题
  • 使用UDP协议

    • 不需要三次连接进行握手,而且也会缩短TLS建立连接的时间
    • UDP 是无连接的,也就是说通信不需要建立和断开连接
  • 解决了队头阻塞问题

HTTP3.0缺点:

  • 兼容问题: 由于HTTP/3相对较新,可能存在一些客户端和服务端的兼容性和适配问题。

keep-alive 长连接理解​

  • HTTP1.1默认使用了connection:keep-alive长连接,数据传输完成了保持TCP连接不断开,等待在同域名下继续用这个通道传输数据。如果需要关闭,需要客户端发送Connection:close首部字段

  • 提高性能:Keep-Alive机制减少了连接的重复建立和关闭,节约了网络资源和服务器资源

  • 连接复用: 当客户端和服务器完成数据传输后,TCP连接并不立即关闭,而是保持打开状态

缺点:

  • 资源占用: Keep-Alive连接会占用服务器和客户端的资源
  • 连接超时: 如果Keep-Alive连接设置的超时时间过长,可能会导致连接长时间保持打开,浪费资源

TCP三次握手​

TCP的三次握手是为了建立可靠的连接而设计的。在建立连接之前,双方需要经过三次握手来确认连接的可行性

三次握手的过程如下:

  • 第一次握手: 客户端向服务端发送SYN标识的数据包,表示要建立连接

  • 第二次握手: 服务端收到客户端SYN数据包之后,通过ACK确认标识来进行回复确认,发送SYN和ACK标识数据给客户端,表示服务端同意建立连接

  • 第三次握手: 客户端受到服务端的数据包之后,会发送一个ACK标识给服务器,表示已经收到服务器标识序号了,服务端收到报文后没问题之后,同意建立连接

第三次握手为什么要发送ACK标识给服务器?

  • 为了证明客户端发送数据正常
  • 表示已经收到服务器标识序号了

补充:

SYN(Synchronize)标志是用来同步序号的。它表示发送方希望建立连接,或者表示已经收到了对方的序号

ACK(Acknowledgment)标志是用来确认序号的。它表示已经收到了对方的序号,或者表示已经处理完了对方的数据。

TCP四次挥手​

四次挥手的过程如下:

  • 第一次挥手:客户端发送一个带有 FIN 标志的数据包给服务器,表示客户端希望断开连接。

  • 第二次挥手: 服务器收到客户端的数据包后,会发送一个带有 ACK 标志的数据包给客户端。表示服务器已经收到了客户端的请求,并且准备好断开连接。

    • 此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
  • 第三次挥手:服务器传输完数据之后,服务器发送一个带有 FIN 标志的数据包给客户端,表示服务器希望断开连接。

  • 第四次挥手: 客户端收到服务器的数据包后,会发送一个带有 ACK 标志的数据包给服务器。表示客户端已经收到了服务器的请求,并且准备好断开连接。

补充:

1、FIN(Finish)标志是用来结束连接的。它表示希望断开连接

2、四次握手就是中间多了一层:等待服务器传输数据, 传输完成之后再一次响应回复相关数据的过程

TCP和UDP的区别​

UDP:

  • 用户数据报文协议(UDP,User Datagram Protocol)
  • UDP 是⼀个面向报文(报文可以理解为⼀段段的数据)的协议。意思就是UDP 只是报⽂的搬运工,不会对报文进行任何拆分和拼接操作

TCP:

  • TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议
  • TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包

区别​

连接性:

  • UDP 是无连接的,也就是说通信不需要建立和断开连接。
    • UDP只提供端到端的数据传递,不做可靠性校验,因此不需要连接去确认
    • 因此UDP的缺点不可靠,不稳定。
  • TCP是面向连接,也就是说客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据
    • TCP协议需要保证数据传输可靠,那么我们通过连接(三次握手)这个过程确定,双方都可以收发数据。如果连接都连接不上,那么就可以确定双方的通信不可达,建立连接失败,没办法可靠的传输。

可靠性:

  • TCP是可靠,UDP不可靠

报文:

  • TCP面向字节流,UDP面向报文

效率:

  • TCP传输效率低,UDP传输效率高
  • 因为UDP支持一对一,一对多,多对一和多对多交互通信,而TCP连接只能一对一通信
  • TCP为了可靠性保证,增加了3次握手4次挥手,复杂的拥塞控制,以及流量控制,让网络传输的延迟进一步增加。
  • TCP头部的大小比UDP复杂,也会影响传输的数据量

场景​

  • UDP 应用场景:

    • 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用 UDP。
      • 语音、视频
  • TCP的应用场景:

    • 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方
      • 文件传输、浏览器的HTTP协议

跨域​

JSONP​

  • Jsonp的原理就是利用<script>标签没有跨域限制

  • CORS与JSONP的使用目的相同,但是比JSONP更强大

  • JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器

cors​

cors跨域资源共享,cors需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能

  • cors是在服务端上配置,在服务器端需要设置响应头来配置cors

  • 通过设置响应头来指定允许访问的源,以及允许的请求方法

  • 常见的响应头包括

  • Access-Control-Allow-Origin: 指定允许访问的源

  • Access-Control-Allow-Methods:指定允许的请求方法,如 GET、POST 等

  • Access-Control-Allow-Headers:指定允许的请求头字段

  • 浏览器在发生跨域请求时会检查响应头是否允许本次请求

    • 如果符合设置的规则,就会允许跨域请求继续进行,否则会拦截请求并抛出跨域错误

      • 拦截请求并抛出跨域错误时,通常的状态码是 0

cors目的​

  • 可以允许服务器指定哪些源有权限访问其资源
  • 允许浏览器向跨源服务器发起请求
  • 提供一种机制,让浏览器与服务器进行安全跨域数据传输

cors请求​

浏览器将cors请求分成两类:简单请求和复杂请求

  • 只要同时满足以下两大条件,就属于简单请求。

    (1) 请求方法是以下三种方法之一:

    • HEAD
    • GET
    • POST

    (2)HTTP的头信息不超出以下几种字段:

    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

options预检请求​

options预检请求只发生在 非简单请求(也就是复杂请求)

  • 非简单请求的cors请求,会在通信之前,增加一次HTTP查询请求,称为预检请求

  • 浏览器通过options方法发起一个预检请求,检测服务器是否允许该请求

  • 发生跨域请求的时候,浏览器发起options预检请求到服务器,询问服务器是否允许该跨域请求