谈谈网络相关
- 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,彻底解决队头阻塞问题
- HTTP/3基于QUIC协议,通过减少连接建立和恢复的时间、降低丢包率等优化,提高了传输效率。
-
使用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。
- 语音、视频
- 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用 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预检请求到服务器,询问服务器是否允许该跨域请求