网络协议
1. Http有哪些版本?如何查看?
http版本分布
- 0.9
- 1.0
- 1.1(最常见)
- 2.0(最常见,大厂基本都是2.0)
- 3.0
查看方式:在控制台打印
window.chrome.loadTimes()
在里面的npnNegotiatedProtocol可以看到http版本
或者
在网页的Network查看请求头,根据请求头判断
有
GET / HTTP/1.1
就是1.1版本;不同版本结构会不一样;
2. http版本的发展
HTTP 0.9
是第一个版本的HTTP协议,已过时。
- 只允许客户端发送GET请求,不支持请求头。
- 无状态(请求没了就没了)
HTTP 1.0
- 新增请求方式POST
- 新增请求头、http状态码等
- 新增Cookie(让HTTP协议有了状态,例:登录)
HTTP 1.1
- 新增keep-alive长连接
- 新增pipeline管道
- 增加了 PUT、DELETE、OPTIONS、PATCH 等新的方法
HTTP 2.0
- 头部支持二进制协议,支持头部压缩(提升性能)
- 新增多路复用 :避免了HTTP的队头阻塞问题
HTTP 3.0
革命性大改版
- 将底层TCP协议改成UDP,彻底解决TCP的队头阻塞问题
- 兼容性还不行,不能大规模使用
3. 什么是长连接?Keep-alive
tcp的每次连接建立都需要三次握手 ,如果开启长连接就可以避免这种情况。 只需一次"三次握手"就可以进行多次请求。
4. pipeline和长连接的区别?
pipeline:可以让请求并发 ,并且用的是同一条tcp连接
5. HTTP1.1有哪些特点
-
⭐HTTP1.1默认使用 Connection:keep-alive(长连接), 避免了连接建立和释放的开销。
-
⭐支持pipeline管道传输,并发请求。
-
并发连接(谷歌浏览器最多6个):对一个域名的请求允许分配多个长连接(缓解了长连接中的【HTTP的队头阻塞】问题)
-
增加了 PUT、DELETE、OPTIONS、PATCH 等新的方法
-
允许数据分块(chunked),利于传输大文件
-
请求头中引入range字段,支持断点续传
6.HTTP2.0有哪些特点
- ⭐二进制协议:http1.1版本的头部信息是文本,数据部分可以是文本或二进制;http2版本的头部和数据都是二进制,且统称为"帧"
- ⭐多路复用 :废弃了HTTP1.1的pipeline管道机制,在同一个TCP连接中,客户端和服务器可以同时 发送多个请求和响应,并且不用按照顺序来。由于服务器不用按顺序处理响应,避免了"HTTP的队头阻塞"的问题。
- 头部信息压缩:gzip压缩。
- 服务端主动推送:允许服务端主动向客户端推送数据
- 数据流:允许服务端以stream(流)的形式向客户端发送数据。(我们现在常见的deepseek 几个字几个字蹦出来,就是这样流式传输)
7.pipeline和多路复用的区别呢?
我们先对比以下几种发送和接收的形式:
- 长连接-非pipeline:发一条,收一条,没收到就不能发下一条。
- 长连接-pipeline:发1,发2,收1,收2。可以并发请求 但是,收和发的顺序必须一致,如果有一个卡住,后面全部卡住(HTTP的队头阻塞)。
- 多路复用:它是基于http的二进制"分帧"。做到让收到数据和发出请求的顺序不需要一致(解决HTTP的队头阻塞)。【人话:原本的请求得到数据需要一次性收到,现在的数据可以一点一点接收 然后组装起来,哪个接口的先收齐就先组装】
8. HTTP3.0有什么特点?
我们都知道http是基于TCP协议实现的。
TCP的主要作用是以正确的顺序将整个字节流从一个端点传输到另一个端点,但是当流中的某些数据包丢失时,TCP需要重新发送这些丢失的数据包,等到丢失的数据包到达对应端点时才能被HTTP处理,这被称为TCP的队头阻塞问题。
HTTP3.0就是主要解决这个问题的
Google做了一个基于UDP协议的QUIC协议。
QUIC的优势:
- ⭐使用了UDP协议,不需要进行三次握手,也会缩短TLS(HTTPS)建立连接的时间。
- ⭐彻底解决了TCP队头阻塞问题
- 报文头和报文体分别进行认证和加密处理,保障安全性
- 连接能够平滑迁移(设备在流量和wifi等情况间切换,不会断线重连)
9. 网络是怎么分层的
1. 物理层
作用:传输 0 1 0 1 信号。 代表设备:网线、光纤
2. 数据链路层
该层管理网络层与物理层之间的通信。 作用:将 0 1 0 1 数据封装为帧(一帧是64-1518字节)。 代表作用:Mac地址确认,Arp广播 代表设备:交换机
3. 网络层
该层决定如何将数据从发送方路由到接收方。 代表作用:分配IP地址 代表设备:家用路由器
4. 传输层
该层为两台主机上的应用程序提供端到端的通信(微信聊天)。 代表作用:连接端到端,如:TCP UDP 代表设备:操作系统内核
5. 应用层
规定应用程序的数据格式。主要协议有:HTTP、FTP、Telnet、SMTP、POP3等。
10. TCP和UDP的区别
- ⭐TCP面向连接 (如打电话要先拨号建立连接)提供可靠的服务,UDP是无连接的,即发送数据之前不需要建立连接,UDP尽最大努力交付,即不保证可靠交付(没有保障一定收到)。
- ⭐UDP 具有较好的实时性 ,工作效率比TCP高。
- TCP连接只能一对一,UDP支持一对一、一对多、多对一和多对多的交互通信。
- UDP占据更小空间。
- ⭐TCP面向字节流,UDP面向报文 。字节流可以一点一点发(流式传输),UDP一次需要交付一个完整的报文。
- UDP适合一次性传输较小数据的网络应用,如DNS、SNMP(专业的网关 服务器、路由器等)等。
应用场景:
- UDP:直播、游戏
- TCP:网页
11. TCP(建立连接)三次握手
首先我们模拟两个对象,客户端(Client)和服务器(Server)。握手的目的,是让这两位都确认能收到对方的消息。
初始状态:Server(Listen) 服务器监听中
第一次握手:
- Client发送一个syn数据包(seq=x),之后改变自己的状态为Client(SYN_SENT) 表示已发送SYN数据包。
- Server收到之后,改变自己的状态为Server(SYN_RCVD) 表示已收到SYN数据包。
第二次握手:
- Server返回ACK包+SYN(ack=x+1,seq=y),其中x+1就表示自己收到了,即C->S已经没问题。
- Client收到之后,改变自己的状态为Client(Established) 表示已确认。
第三次握手 :最后,Client再发送ACK包(ack=y+1),Server收到后,改变自己的状态为Server(Established) 表示已确认。
最终状态:Client(Established)、Server(Established)。双方都确定,那么TCP连接成功。
12. TCP(断开连接)四次挥手
- 为什么握手是三次,挥手是四次?
- 断开方为什么要等待2MSL(Maximum Segment Life)才能真正断开?
MSL :代表数据包在网络中能够存在的最长时间(常用是30s\60s\120s)。
第一次挥手:
- Client发送 FIN包(seq=x+2) ACK包(ack=y+1),改变状态为Client(FIN_WAIT_1)
- Server收到后,改变状态为Server(CLOSE_WAIT)
第二次挥手:
- Server发送 ACK包(ack=x+3)
- Client收到后,改变状态为Client(FIN_WAIT_2)
- 重点在这里 :服务器需要确认一下,有没有数据没传完。因此这里Client需要等待Server确认完后再告诉它是否断开。所以挥手会比握手多一次。
第三次挥手:
- Server发送 FIN包(seq=y+1),改变状态为LAST_ACK。
- Client收到后,改变状态为Client(TIME_WAIT)
第四次挥手:
- Client发送 ACK包(ack=y+2)
第四次握手之后,Client并不知道Server收到了没有,有两种情况:
- 如果Server没有收到ACK,会触发超时重传FIN。
- 如果Server收到了ACK,就不会再发送消息。
前面的解释中说到,MSL代表数据包存储的最长时间。当第三次挥手后,Client收到消息保存FIN的最长时间是一个MSL,如果在这段时间内Server没有重传那么代表可以了。但最保险的是,Client传过去的ACK包存活时间也过去,因此加起来就是2个MSL的时间。Client就可以放心地释放TCP占用的资源、端口号。
13. 常见的http状态码有哪些
1xx:正在处理你的请求 2xx:请求成功,经典状态码200表示成功请求和响应 3xx:302重定向 304触发协商缓存 4xx:401未登录(过期) 403已登录但这个模块你没有权限 404请求没有的资源 5xx:后端发生问题
14. TCP中的滑动窗口有什么作用
滑动窗口(Sliding window)是一种流量控制技术 。通信双方不考虑网络的拥挤情况直接发送数据,导致中间节点阻塞掉包,谁也发不了数据。
TCP中采用滑动窗口 来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区(内存占用)可以用于接收数据,发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
客户端和服务器达成一致,确定要发送多大的数据包。
TCP维持了一个滑动窗口,它解决端到端的问题,并且动态变化。
15. TCP的拥塞控制有什么作用
某段时间内,对网络中某一资源的需求过多,网络性能就会变差,这种情况叫做拥塞 。 拥塞控制 就是为了防止过多的数据注入到网络中。有一个前提,是网络其实是能够承受现有的网络负荷 ,但是想要通过流量控制,抑制发送端发送的速率,以便接收端来得及接收。
TCP发送方要维持一个拥塞窗口的状态变量,窗口大小取决于网络的拥塞成都,且动态变化。
16. 滑动窗口 和拥塞控制的区别?
滑动窗口 解决双方本身的问题。 拥塞控制解决双方之间传输的拥堵问题。
滑动窗口:
A去B家玩耍,A家人多准备了8台车。B家院子只能停4台,那么A家人 就分成2批过去,1批四台车。
拥塞窗口:
A去B家玩耍,A家人多准备了8台车。B家院子能停8台,但是今天超级堵车,车只能1台1台出发(隔5分钟出发一辆)。
发送方让自己的发送窗口 取 滑动窗口 和 拥塞窗口 中较小的一个。
17. https的加密过程
- 对称加密:一把钥匙能解密也能加密
- 非对称加密:有两把钥匙,一把只加密(公钥),一把只解密(私钥);Client拿公钥,Server拿私钥
过程:
-
Client发起一个http请求,告诉Server自己支持哪些hash算法。
-
⭐下发公钥和证书信息:Server把自己的信息以数字证书 的形式返回给Client(公钥 、网站地址、证书颁发机构、失效日期等)。用公钥来加密信息,私钥由Server持有。
-
浏览器去校验证书的合法性
-
⭐生成随机密码(RSA签名):验证通过 ,浏览器会生成一个随机的对称密钥(session key) 并用公钥加密,让Server用私钥解密拿到密码。以后双方的通信都用这个密码来做对称加密。
-
⭐Client生成对称加密算法:经过第四步验证了Server身份之后,Client生成一个对称加密算法 ,把算法和session key 一起用公钥 加密后发送给Server。Server通过私钥 解密后拿到算法和session key,就可以用算法解密了。
18. https是绝对安全的吗?
不是。有一种攻击叫做 "中间人攻击" 。
如何防范:一般只能去引导用户
- 不要轻易信任证书,不知名的小网站不要随意访问
- 浏览器给安全提示,就是有风险,谨慎
- 不要随意连接公共wifi
19. 浏览器的强缓存 和协商缓存
强缓存
强缓存是通过Expires 与Cache-Control来控制缓存在本地的有效期,在控制台network可查看。
Expires
HTTP1.0提出的一种方案。由服务端给到过期时间。
Expires:Sun, 14 Jun 2020 02:50:57 GMT
Cache-Control
出现于HTTP 1.1,优先级高于Expires。
Cache-Control: max-age=300 我的资源要在浏览器强缓存300s
协商缓存
当浏览器对某个资源的请求没有命中强缓存,就会发一个请求到服务器,验证协商缓存是否命中:
- 如果协商缓存命中 ,请求响应返回的HTTP状态为304(Not Modified) ,该请求不携带实体数据。
- 若未命中 ,则返回200并携带实体数据。
Last-Modified If-Modified-Since
是HTTP1.0引入的。表示文件的最后修改日期 ,浏览器会在请求中携带它,询问服务器在该日期之后资源是否更新,更新则发送新资源,没更新就使用缓存。
ETag If-None-Match
ETag就像一个指纹,资源变化就会导致ETag变化。
两者的区别?
Last-Modified精度只能到秒,但是性能更好 ETag更精细,但是性能不如前者,因为文件变化都要重新计算hash值
20. 什么是xss攻击?如何防范
XSS指的是跨站脚本攻击 ,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如cookie等。
如何防范?
- 前端对表单提交,敏感字符进行转义,例如:"<","/"等,破坏它的script标签或sql语句
- 但前端防范不一定是绝对安全的,因为可以抓包篡改
- 核心是后台进行处理,比如转义
21. 什么是csrf攻击?如何防范
csrf又叫跨站请求伪造,一般需要借助XSS产生的漏洞。
- 比如某网站的评论区有个同域名的链接,你不小心点到了,就把你的cookie也带了过去,然后他就可以用你的账号进行所有事情,例如转账给他。
如何防范?
- 堵住XSS漏洞
- 在http header中添加token校验(因为请求时cookie会自动携带,但token需要前端写才会带上,所以可以与后端协商带上token)
- 校验请求http reffer(可以查到,发起这个请求的网站域名是什么,如果不是我们的域名就不让他访问)
22. 什么是websocket?
是HTML5出的协议 。跟HTTP协议基本没有关系(有一丢丢交集),可以说它是HTTP协议上的一种补充。 最大的特点就是:服务器和客户端都可以主动向对方推送消息,双向平等对话 ,允许服务端和客户端进行全双工(full-duplex)的通信。
全双工通信:就像打电话,双方可以同时说话和同时听到对方说话。
其他特点:
- 建立在TCP协议上,服务端的实现比较容易
- 与HTTP协议有着良好的兼容性。默认端口也是80和443。握手阶段采用HTTP协议,因此握手时不容易屏蔽,能通过各种HTTP代理服务器。
- 数据轻量、性能开销小、通信高效
- 可发送文本、二进制数据
- ⭐没有同源限制
- ⭐协议标识符是ws (如果加密,则为wss)
23. ⭐Socket和WebSocket的关系?
它们的关系就好像Java和JavaScript一样,没有关系。
Socket是对TCP/IP协议的封装和应用:nodejs的内置模块socket,可以去操作TCP。
- ⭐socket是传输层接口,直接操作TCP/UDP协议
- ⭐websocket是应用层协议,依赖HTTP握手后升级为Websocket协议。