计算机网络知识点 HTTP、HTTPS、TCP和UDP、webSocket、SSE

计算机网络知识点

网络模型

  • 网络模型五层?
  • TCP协议属于哪一层?
  • 应用层和传输层都有哪些协议?DNS协议属于哪一层?IP协议属于哪一层?
  • dns只能拿到IP,是如何将IP转为mac地址?说一下ARP协议?
  • 根据IP地址获取MAC地址使用了什么协议?
协议作用属于哪一层备注
DNS域名转化为IP地址应用层运行在UDP协议
端口号: 53
HTTP网络通信HTTP3.0之前都是基于TCP协议,HTTP3.0开始基于UDP协议

在这里插入图片描述
在这里插入图片描述

从输入URL到页面渲染的过程

笔记

内容

  1. 浏览器接收到输入的URL后,先解析URL
    浏览器发送请求前,尝试缓存命中
  2. 建立URL请求
  • DNS解析出IP地址
  • 优化:DNS预解析
  • 使用IP地址建立TCP连接 三次握手
  • 为什么要三次握手?
  • 三次握手过程中可以携带数据吗? -第三次握手可以
  • syn洪泛攻击
  • HTTP请求
  • 关闭TCP连接 四次挥手
  • 为什么要等待2个报文段最大生存时间
  • 为什么连接的时候是三次握手,关闭的时候却是四次握手?
  1. 开启渲染进程

HTTP的版本迭代

HTTP1.0 2.0 3.0 版本笔记

浏览器缓存

浏览器缓存笔记

HTTP与HTTPS的区别

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请求资源,服务器将不传回资源的文本部分,只返回头部消息。
使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据),对资源的首部进行检查
在不获取资源的情况下,了解资源的一些信息,比如资源类型;
通过查看响应中的状态码,可以确定资源是否存在;
通过查看首部,测试资源是否被修改。
OPTIONSOPTIONS 方法用于获取目的资源所支持的通信选项。cors共享机制对非简单请求进行预检请求
PUTPUT 方法用于将数据发送到服务器来创建/更新资源
与POST的区别:PUT 与 POST 方法的区别在于,PUT 方法是幂等的:调用一次与连续调用多次是等价的
如果目标资源不存在,并且PUT方法成功创建了一份,那么源头服务器必须返回 201(Created) 来通知客户端资源已创建。
如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回 200 (OK) 或者 204 (No Content) 来表示请求的成功完成。
PATCH请求方法 PATCH 用于对资源进行部分修改
PATCH 方法是非幂等的
DELETEDELETE 方法就是请求服务器删除指定 URL 所对应的资源。但是,客户端无法保证删除操作一定会被执行,因为 HTTP 规范允许服务器在不通知客户端的情况下撤销请求。如果 DELETE 方法成功执行,那么可能会有以下几种状态码:
状态码 202 (Accepted) 表示请求的操作可能会成功执行,但是尚未开始执行。
状态码 204 (No Content) 表示操作已执行,但是无进一步的相关信息。
状态码 200 (OK) 表示操作已执行,并且响应中提供了相关状态的描述信息。
getpost
参数在url中,会保存在历史记录中,请求可以被缓存,对同一个 URL 的多个请求应该返回同样的结果(幂等的)参数在request body中 传递的数据量更大

HTTPS的连接过程

完整通讯的过程

  1. 客户端进行证书验证
  2. 非对称加密发送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可靠传输与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有什么好处?

  1. 在客户端和服务端上建立了一个长久的连接,全双工通信实时性更强,服务端可以主动给客户端进行推送
    之前的实现方法是轮询,每隔一段时间,就发出一个询问,了解服务器有没有新的信息。
  2. 没有同源限制,客户端可以与任意服务器通信

在这里插入图片描述

http与webSocket的区别
-httpwebSocket
标识符httpwb
通信半双工通信
同一时刻数据是单向流动的,一请求一响应,这个响应是被动的,不是主动可以发起的
全双工通信

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协议

  1. 先经历TCP三次握手
  2. 发送一个GET请求
HTTP版本:1.1
connection:Upgrade //客户端希望连接升级
Sec-WebSocket-Key:客户端的标识编码成的base64格式//用于验证协议是否为webSocket协议
Sec-WebSocket-Version:13 //标识协议使用的版本
Origin字段
Upgrade: websocke //将HTTP协议升级为webSocket协议
  1. 服务器收到请求后,返回响应码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与长轮询机制类似,区别是每个连接不只发送一个消息。。客户端发送一个请求,服务端保持这个连接直到有新消息发送回客户端,仍然保持着连接,这样连接就可以消息的再次发送,由服务器单向发送给客户端。

SSEWebSocket
单向通信,只能服务器向浏览器端发送全双工通道,可以双向通信,功能更强大
不支持跨域,服务器地址必须和当前网址是同域支持跨域
SSE则是部署在HTTP协议之上WebSocket是一个新的协议,需要服务器端支持
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值