S:客户端的发送能力没问题 C:服务端的接收能力没问题 以及发送能力没问题 S:客户端接收能力没问题
客户端发送一个fin,关闭客户端到服务端的传送(一次挥手) 服务端收到fin,知道客户端想要断开连接。返回fin表明知道断开连接,(二次挥手) 服务端返回数据(三次挥手) 客服端收到fin,关闭连接(四次挥手)
HTTP 是超文本传输协议,HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
特点:无连接``无状态``灵活
无连接:请求连接结束之后会断开,(http1.1之后会保持永久连接)
无状态:每次请求都是独立的,不会记录任何信息
灵活:通过http协议中头部的Content-Type标记,可以传输任意数据类型的数据对象(文本、图片、视频等等),非常灵活
缺点 无状态、不安全、明文传输、队头阻塞
无状态:无连接信息,无法区分多个请求者身份是否为同一个客户端
不安全:明文传输可能被窃听,缺少身份认证也可能遭遇伪装,还有缺少报文完整性验证可能遭到篡改
明文传输:报文(header部分)使用的是明文,直接将信息暴露给了外界
队头阻塞:
HTTP 报文组成 http报文:由请求报文和响应报文组成
请求报文:由请求行、请求头、空行、请求体四部分组成
响应报文:由状态行、响应头、空行、响应体四部分组成
优点:
https可进行加密传输,身份验证比http安全
缺点:
证书费用及更新维护
加密解密需要耗费更多的服务器资源
握手阶段比较费时
参考文章(juejin.cn/post/716687… 全双工通信协议,即时通信,替代轮询
WebSocket 握手协议 与 Http握手 的区别
WebSocket 的握手协议相比 Http原本的握手协议 ,多了两个属性:
Upgrade:webSocketConnection:Upgrade客户端发送的握手协议,带有两个额外的属性,服务端就会返回101状态码,客户端收到101状态码后就成功。
websocket心跳
可能会有某些未知情况导致 socket 断开,而客户端和服务端却不知道,需要客户端定时发送一个心跳 ping 让服务端知道自己在线
服务端也需要回答一个 心跳 pong 告诉客户端自己可用,否则视为断开。
WebSocket 状态
短轮询:前端用定时器每隔一段时间ajax就向后端获取更新;长轮询:长轮询是短轮询的改进,请求到服务端后会被挂起,直到有新的消息才会返回响应;然后再重新发起请求;基于流:基于流的推送技术就是指 SSE;SSE是一个H5的属性,它只能由服务器向浏览器发送数据,所以协作式通过 http 发送消息,sse 接受消息;Websocket:WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通信的协议;钉钉表格就是用的原生WebSocket;Socket.io:其实 Socket.IO 只是为了解决 websocket 的兼容性的一个解决方案,因为websocket出现的较新,所以一些老的浏览器兼容性不好,而 Socket.IO就是将websocket、长轮询两种通信方式封装成了统一的通信接口进行降级兼容;单工、半双工和全双工通信
单工通信是指消息只能单方向传输的工作方式,数据信息从一端到另一端是单方向的。例:广播。半双工通信可以实现双向的通信,但是不能在两个方向同时进行,必须交替进行。这中模式下,接收端和发送端可以互相转换。例:对讲机。全双工通信是指在通信的任意时刻,都允许数据同时在两个方向上传输,在这个模式下,通信系统的每一端都设置了发送器和接收器