文章目录
计算机网络知识点
网络模型
- 网络模型五层?
- TCP协议属于哪一层?
- 应用层和传输层都有哪些协议?DNS协议属于哪一层?IP协议属于哪一层?
- dns只能拿到IP,是如何将IP转为mac地址?说一下ARP协议?
- 根据IP地址获取MAC地址使用了什么协议?
协议 | 作用 | 属于哪一层 | 备注 |
---|---|---|---|
DNS | 域名转化为IP地址 | 应用层 | 运行在UDP协议 端口号: 53 |
HTTP | 网络通信 | HTTP3.0之前都是基于TCP协议,HTTP3.0开始基于UDP协议 |
从输入URL到页面渲染的过程
内容
- 浏览器接收到输入的URL后,先解析URL
浏览器发送请求前,尝试缓存命中 - 建立URL请求
- DNS解析出IP地址
- 优化:DNS预解析
- 使用IP地址建立TCP连接 三次握手
- 为什么要三次握手?
- 三次握手过程中可以携带数据吗? -第三次握手可以
- syn洪泛攻击
- HTTP请求
- 关闭TCP连接 四次挥手
- 为什么要等待2个报文段最大生存时间
- 为什么连接的时候是三次握手,关闭的时候却是四次握手?
- 开启渲染进程
HTTP的版本迭代
浏览器缓存
HTTP与HTTPS的区别
HTTP的响应码和请求方法
面试题
- http状态码:4xx和5xx的区别
- 详细说下4xx的内容
- 500和502的区别?
- HTTP中302是啥?
- 说一下304和301的区别?
- 404 403 503?
常用状态码
状态码 | 类别 | 原因 |
---|---|---|
2XX | 成功状态码 Success | 请求正常处理完毕 |
3XX | 重定向状态码 Redirection | 表示要完成请求,需要进一步操作(比如资源的url变了需要改变请求的url) |
4XX | 客服端错误状态码 Client Error | 服务器无法处理请求 |
5XX | 服务器错误状态码 Server Error | 服务器处理请求出错 |
3XX重定向状态码
状态码 | 描述 | 理解 |
---|---|---|
301 Moved Permanently | 永久重定向 | 请求的资源已经被移动到新的URI,返回信息会包括新的URI |
302 Found | 临时移动,请求的资源被临时移动了 | 希望本次使用新的URI访问 |
304 Not Modified | 服务器端资源未修改,可直接使用客户端未过期的缓存 | ★可以结合http缓存回答 |
4xx状态码 客户端错误状态码
状态码 | 描述 | 理解 |
---|---|---|
400 Bad Request | 客户端请求的语法错误,服务器无法理解 | |
401 Unauthorized | 身份未认证 | 两种情况 1.服务端要求传递token信息,而实际发送请求时没有传递。 2.发送请求时有传递token到达服务器端,但由于时间比较久,这个token在服务器中已经过期了 |
403 Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 | |
404 Not Found | 服务器上没有请求的资源 |
5xx状态码 服务器端错误状态码
状态码 | 描述 | 理解 |
---|---|---|
500 Internal Server Error | 服务器内部错误,无法完成请求 | |
502 网关错误 | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 | |
503 Service Unavailable | 服务器暂时处于超负载或正在进行停机维护。现在无法处理请求 |
请求方法
方法名 | 描述 | 使用场景 |
---|---|---|
GET | 用于获取信息,不会修改信息,请求可以被缓存,对同一个 URL 的多个请求应该返回同样的结果(幂等的) | |
POST | 用于向指定资源提交数据 | application/x-www-form-urlencoded 用来传输简单的数据,如 “key1=value1&key2=value2” 这样的格式。multipart/form-data 主要用来传输文件内容。 application/json 告诉服务端消息主体是序列化后的 JSON 字符串。 text/plain 纯文本格式 |
HEAD | 请求资源,服务器将不传回资源的文本部分,只返回头部消息。 使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据),对资源的首部进行检查 | 在不获取资源的情况下,了解资源的一些信息,比如资源类型; 通过查看响应中的状态码,可以确定资源是否存在; 通过查看首部,测试资源是否被修改。 |
OPTIONS | OPTIONS 方法用于获取目的资源所支持的通信选项。 | cors共享机制对非简单请求进行预检请求 |
PUT | PUT 方法用于将数据发送到服务器来创建/更新资源 与POST的区别:PUT 与 POST 方法的区别在于,PUT 方法是幂等的:调用一次与连续调用多次是等价的 | 如果目标资源不存在,并且PUT方法成功创建了一份,那么源头服务器必须返回 201(Created) 来通知客户端资源已创建。 如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回 200 (OK) 或者 204 (No Content) 来表示请求的成功完成。 |
PATCH | 请求方法 PATCH 用于对资源进行部分修改 PATCH 方法是非幂等的 | |
DELETE | DELETE 方法就是请求服务器删除指定 URL 所对应的资源。但是,客户端无法保证删除操作一定会被执行,因为 HTTP 规范允许服务器在不通知客户端的情况下撤销请求。 | 如果 DELETE 方法成功执行,那么可能会有以下几种状态码: 状态码 202 (Accepted) 表示请求的操作可能会成功执行,但是尚未开始执行。 状态码 204 (No Content) 表示操作已执行,但是无进一步的相关信息。 状态码 200 (OK) 表示操作已执行,并且响应中提供了相关状态的描述信息。 |
get | post |
---|---|
参数在url中,会保存在历史记录中,请求可以被缓存,对同一个 URL 的多个请求应该返回同样的结果(幂等的) | 参数在request body中 传递的数据量更大 |
HTTPS的连接过程
完整通讯的过程
- 客户端进行证书验证
- 非对称加密发送key的过程
SSL/TLS握手的过程
TLS 握手是启动 HTTPS 通信的过程,类似于 TCP 建立连接时的三次握手,目的是建立安全连接
1."client hello"消息:客户端通过发送"client hello"消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个"client random"随机字符串
2.“server hello"消息:服务器发送"server hello"消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和"server random"随机字符串
3.验证:客户端对服务器发来的证书进行验证,确保对方的合法身份
4.“premaster secret"字符串:客户端向服务器发送经过服务器密钥加密过的随机字符串"premaster secret (预主密钥)”
5、使用私钥:服务器使用私钥解密"premaster secret”
6、生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY
7、客户端就绪:客户端发送经过共享密钥 KEY加密过的"finished"信号。
8、服务器就绪:服务器发送经过共享密钥 KEY加密过的"finished"信号。
9、达成安全通信:握手完成,双方使用对称加密进行安全通信。
TCP与UDP
TCP的可靠传输与UDP的区别
TCP的三次握手和四次挥手
三次握手
第一次握手: 客户端随机初始化序列号X,设置SYN同步标志位为1,用来建立连接,然后发送SYN报文给服务端,客户端进入SYN_SEND等待服务端确认的状态。
第二次握手: 服务器端收到客户端发来的SYN报文后。服务器自己也生成初始序列号y,SYN同步标志位和ACK确认标志位置1,ack确认号=x+1的SYN报文作为客户端建立连接请求的应答。服务器处于SYN_RECEIVED状态。
第三次握手:客户端收到服务端的确认应答后,检查ack确认号是否x+1,ACK确认标志位是否=1。若正确就返回ack确认号为y+1,序列号为x+1,及ACK=1的数据包发送给服务器,确认服务器的应答。
服务器端收到应答包,检查ack确认号是否=y+1来确认是否建立连接成功。
为什么要三次握手?
目的是确保数据到达目的–> 客户端和服务端的接收和发送能力没有问题
第二次握手 服务器端同时返回SYN建立连接+ACK确认,说明客户端发送的建立连接请求服务器端可以接收到,说明客户端发送能力ok。
第三次握手 客户端向服务器发送ACK确认标志=1,表示对服务器端的应答,说明服务器发送能力ok,服务端的接收能力ok。
服务器端收到应答包,检查成功,说明客户端的接收能力ok,建立连接。
也可以从为什么不是两次握手的角度回答
为何不能是两次握手?
可能连接请求因网络滞留了一段时间,以至于到达服务端已经失效了,但是服务端会误认为是个新的连接请求,于是向客户端发出确认报文,同意建立连接。假设采用两次握手,那么服务端发出确认报文,表示连接已建立,但客户端并没有发出确认建立的连接,也不会向服务端发送任何数据,服务端因连接占用导致资源浪费。
四次挥手
TCP连接是全双工的,因此,每个方向都必须要单独进行关闭
第一次挥手:客户端发送一个 FIN 报文,假设此时的seq=u。表示客户端没有发送给服务端的数据了,要关闭连接了。此时客户端处于FIN_WAIT1状态。
第二次握手:服务端收到 FIN 报文之后,发送ACK确认标志位=1,ack确认号为u+1的响应报文,表明已经收到客户端的报文了,但是可能服务器还有数据传输,所以服务端处于 CLOSE_WAIT状态。
第三次挥手:当服务器确认没有数据发送之后,发送FIN为1、ack=u+1、seq=w的FIN报文,准备关闭连接。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到FIN报文后,向服务器进行应答。此时客户端处于 TIME_WAIT
状态。
服务器会等待客户端的应答后才会真正断开连接,如果服务器没有收到应答报文则会重传。
客户端等待2*报文段最大生存时间 后依然没有收到回复,说明服务器端已正常关闭,客户端也可以关闭连接了。
为什么要等待2个报文段最大生存时间
1.假设第四次挥手的ACK应答包丢失,服务器没有收到应答报文则会重传FIN报文,在2个报文段最大生存时间之内 如果客户端再次收到FIN报文 重发ACK应答报文。保证双方都可以正常进入关闭状态
2.确保在创建新连接时,先前网络中残余的数据都丢失了
为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当Server端收到FIN报文时,可能服务器还有数据需要发送,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
webSocket
面试题
- 讲一下websocket和http的区别
- 轮询,websocket
- websocket连接时发生了什么
- HTTP2的服务端推送消息和Websocket的服务端推送有什么区别?
- websocket 兼容处理/降级方案?SSE(Server-Sent Events)
- websocket优化
webSocket概述
什么是webSocket?
webSocket是H5提供的一种浏览器与服务器进行全双工通讯的网络技术,服务器可以主动给客户端进行推送。
WebSocket本质上一种计算机网络应用层
的协议,基于TCP,并复用HTTP的握手通道
webSocket有什么好处?
- 在客户端和服务端上建立了一个长久的连接,全双工通信实时性更强,服务端可以主动给客户端进行推送
之前的实现方法是轮询
,每隔一段时间,就发出一个询问,了解服务器有没有新的信息。 - 没有同源限制,客户端可以与任意服务器通信
http与webSocket的区别
- | http | webSocket |
---|---|---|
标识符 | http | wb |
通信 | 半双工通信 同一时刻数据是单向流动的,一请求一响应,这个响应是被动的,不是主动可以发起的 | 全双工通信 |
WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息。
HTTP2和webSocket的区别
HTTP2服务器推送
1.浏览器发送一个请求,服务器主动向浏览器推送与这个请求相关的资源,也就是服务器提前将资源推送到浏览器,不允许将数据推送到客户端应用程序本身。
2.只能推送静态资源,无法推送指定的信息
webSocket基于HTTP1.1 ,不通过中间人来转发并且通讯双方可以同时发送数据,
轮询
- | 短轮询 | 长轮询 |
---|---|---|
描述 | 浏览器端每隔几秒钟向服务器发送HTTP请求,服务端在收到请求后,无论有没有更新,都直接响应。在服务端响应完成,就会关闭这个TCP连接 | 客户端发送请求后服务器端不会立即返回数据,服务器端会阻塞请求连接不会立即断开,直到服务器端有数据更新或者是连接超时才返回。客户端才再次发出请求新建连接 |
优点 | 实现简单 | 较好的实时性 |
缺点 | 会造成数据在一小段时间内不同步和大量无效请求 | 保持连接挂起会消耗资源 |
//短轮询
setInterval(function() {
fetch(url).then((res) => {
// success code
})
}, 3000);
//长轮询
function async() {
fetch(url).then((res) => {
async();
// success code
}).catch(() => {
// 超时
async();
})
}
当客户端要和服务端建立 WebSocket 连接时,在客户端和服务器的握手过程中,客户端首先会向服务端发送一个 HTTP 请求,包含一个 Upgrade 请求头来告知服务端客户端想要建立一个 WebSocket 连接。
webSocket的连接过程
在建立握手时,数据是通过HTTP传输的。
连接建立后,通过webSocket协议进行数据传输。
websocket 是长连接,会话一直保持
从http连接升级到webSocket协议
- 先经历TCP三次握手
- 发送一个GET请求
HTTP版本:1.1
connection:Upgrade //客户端希望连接升级
Sec-WebSocket-Key:客户端的标识编码成的base64格式//用于验证协议是否为webSocket协议
Sec-WebSocket-Version:13 //标识协议使用的版本
Origin字段
Upgrade: websocke //将HTTP协议升级为webSocket协议
- 服务器收到请求后,返回响应码
101 切换请求
webSocket心跳检测+断线重连
心跳就是客户端定时的给服务端发送消息,证明客户端是在线的, 如果超过一定的时间没有发送(服务器设置了超时断线)则就是离线了。
心跳检测的目的
1.证明客户端在线,保持连接状态
2.证明服务器正常,发送一个心跳检测给后端后,后端会按照约定发一个心跳消息给前端。
保证连接状态,连接断开时进而重连。
断线重连
当发现断线了之后,可以设置一个锁和最大的重连次数,避免出现无限重连的情况。
reconnect(){
if (this.lockReconnect) return;
this.lockReconnect = true;//开始连接加锁
clearTimeout(this.timer) //清除之前的定时器连接
if (this.data.limit<12){ //判断是否到达最大重连次数
this.timer = setTimeout(() => { //5s重试一次重新连接
this.linkSocket();
this.lockReconnect = false;
}, 5000);
this.setData({
limit: this.data.limit+1
})
}
}
SSE(Server-Sent Events) 服务器单向推送
SSE与长轮询机制类似,区别是每个连接不只发送一个消息。。客户端发送一个请求,服务端保持这个连接直到有新消息发送回客户端,仍然保持着连接,这样连接就可以消息的再次发送,由服务器单向发送给客户端。
SSE | WebSocket |
---|---|
单向通信,只能服务器向浏览器端发送 | 全双工通道,可以双向通信,功能更强大 |
不支持跨域,服务器地址必须和当前网址是同域 | 支持跨域 |
SSE则是部署在HTTP协议之上 | WebSocket是一个新的协议,需要服务器端支持 |