Node Socket.IO

WebSocket 是HTML5的一种新通信协议。它实现了浏览器与服务器之间的双向通讯。Socket.io 是一个完全由JavaScript实现,基于node.js ,支持WebSocket 的协议用于实时通讯,跨平台的开源框架,它包括了客户端的JavaScrip和服务器端的Node.js。Socket.io能够根据浏览器对通讯机制的支持情况自动地选择最佳的方式来实现网络的实时应用。
Socket.io 设计的目标是构建能够在不同浏览器和移动设备上良好运行的实时应用。
Socket
主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。*建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。*我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。
Socket 其实并不是一个协议。它工作在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是 TCP 或 UDP )而存在的一个抽象层。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

WebSocket 则不同,它是一个完整的 应用层协议,包含一套标准的 API 。
HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

http 和 websocket 是应用层协议,TCP/IP 是网络层和传输层的协议, socket 是对 TCP/IP 协议的抽象 API 封装层。

1.直接使用 socket API 进行连接和数据传输,传输的数据可以是任意内容,比如发送 http 协议 GET 请求时,若服务器上使用 socket API 监听,会收到一串字符串,字符串的内容就是 http 协议相关的请求串。
2.同样的, websocket 也是通过 TCP/IP 来传输数据的,不过在建立 websocket 连接的阶段有所区别。websocket 建立连接先通过 http 协议与服务器进行握手,服务器解析相应的 http 协议,确认出本次连接是 http 还是 websocket连接,如果是 websocket 连接,则双端直接进入 TCP/IP 常规的三次握手阶段,建立连接,进行双向数据通信,同 socket 通信。
3.浏览器上使用 websocket 进行长连接双向通信时,需要服务器端对 websocket 协议进行解析,建立连接。若单纯用 socket api 接收数据的话,就需要自行对 websocket 协议进行解析。

Socket是传输控制层协议,WebSocket是应用层协议。

Socket编程 TCP粘包问题
TCP是一个基于字节流的传输服务,”流”意味着TCP所传输的数据是没有边界的。这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的。TCP的发送方无法保证对等方每次接收到的是一个完整的数据包。
产生粘包问题原因有以下几个:
第一 。应用层调用write方法,将应用层的缓冲区中的数据拷贝到套接字的发送缓冲区。而发送缓冲区有一个SO_SNDBUF的限制,如果应用层的缓冲区数据大小大于套接字发送缓冲区的大小,则数据需要进行多次的发送。
第二种情况是,TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送。
第三种情况由于链路层最大发送单元MTU,在IP层会进行数据的分片。
一个完整的应用层数据被分割成多次发送,导致接收对等方不是按完整数据包的方式来接收数据。

粘包问题的最本质原因在与接收对等方无法分辨消息与消息之间的边界在哪。我们通过使用某种方案给出边界,例如:
1. 发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。
2. 包尾加上\r\n标记。FTP协议正是这么做的。但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界。
3. 包头加上包体长度。包头是定长的4个字节,说明 了包体的长度。接收对等方先接收包体长度,依据包体长度来接收包体。
4. 使用更加复杂的应用层协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值