前言
^^^^^^本文仅供学习参考^^^^^^
—-先说下七层模型:
七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。

它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
定义
OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
起源
OSI的大部分设计工作实际上只是Honeywell Information System公司的一个小组完成的,小组的技术负责人是Charlie Bachman。在70年代中期,这个小组主要是为了开发一些原型系统而成立的,主要关注数据库系统的设计。70年代中,为了支持数据库系统的访问,需要一个结构化的分布式通信系统体系结构。
于是这个小组研究了现有的一些解决方案,其中包括IBM公司的SNA(System Network Architecture)、ARPANET(Internet的前身)的协议、以及为标准化的数据库正在研究中的一些表示服务(presentation services)的相关概念,在1977年提出了一个七层的体系结构模型,他们内部称之为分布式系统体系结构(DSA)。
与此同时,1977年英国标准化协会向国际标准化组织(ISO)提议,为了定义分布处理之间的通信基础设施,需要一个标准的体系结构。结果,ISO就开放系统互联(OSI)问题成立了一个专委会(TC 97, Subcomittee 16),指定由美国国家标准协会(ANSI)开发一个标准草案,在专委会第一次正式会议之前提交。
Bachman [1] 参加了ANSI早期的会议,并提交了他的七层模型,这个模型就成了提交ISO专委会的唯一的一份草案。
1978年3月,在ISO的OSI专委会在华盛顿召开的会议上,与会专家很快达成了共识,认为这个分层的体系结构能够满足开放式系统的大多数需求,而且具有可扩展的能力,能够满足新的需求。
于是,1978年发布了这个临时版本,1979年稍作细化之后,成了最终的版本。所以,OSI模型和1977年DSA模型基本相同。
分层
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [2] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。
应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节。在 Internet 整个发展过程中的所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式存在。针对每一种特定的 TCP/IP 应用,有相应的 RFC [3] 文档。
一些典型的 TCP/IP 应用有 FTP、Telnet、SMTP、SNTP、REXEC、TFTP、LPD、SNMP、NFS、INETD 等。RFC 使一些基本相同的 TCP/IP 应用程序实现了标准化,从而使得不同厂家开发的应用程序可以互相通信
OSI参考链接: [链接:https://baike.baidu.com/item/% ... addin]
七层模型:
- 1、应用层 协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
- 2、表示层 数据的表示、安全、压缩,格式有:JPEG、ASCll、DECOIC、加密格式等(数据格式化,代码转换,数据加密),没有协议
- 3、会话层 建立、管理、终止会话,没有协议
- 4、传输层 定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
- 5、网络层 进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
- 6、数据链路层 建立逻辑连接、进行硬件地址寻址、差错校验 等功能。(由底层网络定义协议)将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。协议有:SLIP CSLIP PPP MTU ARP[链接:https://baike.baidu.com/item/A ... addin]RARP
- 7、物理层 建立、维护、断开物理连接。以二进制数据形式在物理媒体上传输数据(由底层网络定义协议)协议有:ISO2110 IEEE802 IEEE802.2
封装
所谓封装是指在发送方发生的自上而下的过程 —— 在每一层为应用数据添加上特定的头部 / 尾部信息(PDU,Protocol Data Unit,协议数据单元)

上图每层包结构[链接:https://jingyan.baidu.com/arti ... .html]
消息数据(通信数据) Application(应用程序) →segment(数据段) →packet(数据包) →frame(数据帧) →bit(比特,二进制位)(→电流电压/→wifi电磁波 原理)
解封
所谓解封装是指在接收方发生的自下而上的过程 —— 逐层的去掉头部以及尾部信息
举个栗子: A 要向 B 发送数据,那么 A 首先要对发送的数据进行封装,在每一层会加上相应的数据头,传输层主要是加上源和目标端口号,网络层则加源和目标 IP 地址,数据链路层则加上源和目标 MAC 地址
什么是Socket?
Socket其实并不是一个协议 而是一个通信模型。它是为了方便大家直接使用更底层协议(TCP | UDP)而存在的抽象层。Socket是对 TCP/IP协议的封装,Socket本身并不是协议,而是一个调用的接口(API),主要用来一台电脑的两个进程通信,然后把它用到了两台电脑的进程通信,简单理解为进程通信,其实就是 I/O操作。
Socket在网络通信中,它涵盖了网络层、传输层、会话层、表示层、应用层,因为其信时候用到了IP和端口,仅这两个就表明了它用到了网络层和传输层,而且它无视多台电脑通信的系统差别,所以它涉及了表示层,一般Socket都是基于一个应用程序的,所以会涉及到会话层和应用层。
Socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号唯一确定。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
Socket在通讯过程中,服务端监听某个端口是否有连接请求,客户端向服务端发送连接请求,服务端收到连接请求向客户端发出接收消息,这样一个连接就建立起来了。客户端和服务端也都可以相互发送消息与对方进行通讯,直到双方连接断开。
什么是WebSocket,解决了什么问题?
WebSocket是HTML5出协议,跟HTTP协议没有关系(也不能说完全没有关系),由于 HTTP 是不支持持久链接的(长链接和循环链接不算)
HTTP的生命周期通过Request来界定,也就是一个 Request 一个 Response 在 HTTP1.0中 HTTP请求就结束了
在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。
但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。服务器不能主动向客户端推送消息,为了在浏览器中能实现长链接,从而推出了WebSocket协议,而 HTTP 是一个无状态协议。Websocket协议是服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端。
WebSocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。
Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:
- 1 大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。
- 2 和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。
总之:WebSocket 的实现分为握手,数据发送/读取,关闭连接。
问题:websocket之前浏览器如何“实时通讯” ajax轮询、long poll




客户端发起握手请求报文
<pre style="box-sizing: border-box; overflow: hidden; font-family: monospace; font-size: 14.000000953674316px; display: block; padding: 16px; margin: 0px 0px 10px; line-height: 20px; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(247, 247, 247); border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;">GET /chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13</pre>
Upgrade:websocket参数值表明这是WebSocket类型请求
Sec-WebSocket-Key:WebSocket客户端发送的一个 base64编码的密文要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答,否则客户端会抛出Error during WebSocket handshake错误,并关闭连接。
用户可以查阅WebSocket协议栈[链接:https://jingyan.baidu.com/arti ... .html]
了解WebSocket客户端和服务端更详细的交互数据格式。
http协议栈[链接:https://tools.ietf.org/html/rfc2616]
dns协议栈[链接:https://tools.ietf.org/html/rfc1035]
POP3[链接:https://tools.ietf.org/html/rfc1081]
服务端收到报文返回的数据格式
<pre style="box-sizing: border-box; overflow: hidden; font-family: monospace; font-size: 14.000000953674316px; display: block; padding: 16px; margin: 0px 0px 10px; line-height: 20px; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; background-color: rgb(247, 247, 247); border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;">HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=</pre>
Sec-WebSocket-Accept:服务端采用与客户端一致的密钥计算出来后返回客户端的
HTTP/1.1 101 Switching Protocols:表示服务端接受WebSocket协议的客户端连接,经过这样的请求-响应处理后,两端的WebSocket连接握手成功, 后续就可以进行TCP通讯了。
数据帧格式 rfc6455-5.2[链接:https://tools.ietf.org/html/rfc6455#section-5.2]


解读 SocketRocket 框架
查看MOBFWebSocket项目内部代码做了注释 和 SocketRocket架构分析 ppt。参看末尾附件。
什么是心跳?
简单的来说,心跳就是用来检测TCP连接的双方是否可用。那又会有人要问了,TCP不是本身就自带一个KeepAlive机制吗?
这里我们需要说明的是TCP的KeepAlive机制只能保证连接的存在,但是并不能保证客户端以及服务端的可用性.
我们客户端发起心跳Ping(一般都是客户端),假如设置在10秒后如果没有收到回调,那么说明服务器或者客户端某一方出现问题,这时候我们需要主动断开连接。
国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断。而国内的运营商一般NAT超时的时间为5分钟,所以通常我们心跳设置的时间间隔为3-5分钟。
什么是重连机制?
理论上,我们自己主动去断开的Scoket连接(例如退出账号,APP退出到后台等等),不需要重连。其他的连接断开,我们都需要进行断线重连。
一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。
网友评论