Socket的一次探索尝试
前言
因最近老师提出提出了Socket
是否可以与WebSocket
通讯的问题,让我去了解尝试一下,在网上搜索了一些有关于Socket
和WebSocket
的文章之后,便写下了这篇文章。在日常开发场景中,如果不是一个非常大型的系统,需要采用一些定制化的需求,我们只用粗略的了解这些协议的信息即可,没必要去深究这些协议.在本文中我列举了WebSocket
和Socket
以及HTTP
的简介以及他们的不同.随后我使用C#实现了简单的Socket和WebSocket的列子。
Socket
简介
Socket
是OSI模型中应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
。在设计模式中,Socket
其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在Socket
接口后面,对用户来说,一组简单的接口就是全部,让Socket
去组织数据,以符合指定的协议。Socket
又称套接字。
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。
我所理解的Socket就是为了更方便使用TCP协议或者UDP协议的实现封装和应用。是抽象接口
参考文献
- Socket原理
- 百度百科:Scoket(套接字)
WebSocket
简介
WebSocket
是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成(又称协议升级(HTTP->Websocket)。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。目的:即时通讯,替代轮询
我所理解的WebSocket是双向通信协议,可以双向发送或接受信息。他的出现是为了替代HTTP协议长轮询的效率低下等问题进行了解决
参考文献
HTTP
简介
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。HTTP
是一种无状态 (stateless) 协议, HTTP
协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。然而,在许多应用场景中,我们需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP
是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie
。
参考文献
1.知乎:深入理解HTTP协议
三种协议的区别
1.应用层协议
- DNS
- HTTP
- FTP
- SMTP
- WebSocket
- SNMP
2.运输层协议
- TCP
- UDP
Socket
其实并不是一个协议,是一个抽象概念
,是为了方便使用TCP协议
或UDP协议
而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
WebSocket
则是一个典型的应用层协议。Socket
是传输控制层协议,WebSocket
是应用层协议。我所理解的WebSocket
就是对Socket
接口的一种实现,但是他又跟Socket
使用方面,完全两个东西.WebSocket
一开始的握手需要借助HTTP请求完成,又称协议升级
(HTTP->Websocket)
Http
是一种无状态 协议, HTTP
协议本身不会对发送过的请求和相应的通信状态进行持久化处理。
参考文献
C#实现
C#
中提供了
-
Socket
类 ,是抽象概念是接口,可以基于它实现TCP
传输 或UDP
传输 -
基于
Socket
类 ,使用TCP协议
封装的TcpClient
类和TCPListener
类 -
基于
Socket
类 ,使用UDP协议
封装的UdpClient
类
在使用Socket
遇到了一个问题粘包
(严谨一点来说并不叫粘包,TCP协议是流式协议,所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志,需要我们人为地去给这些协议划分边界。客户端发送数据时,发送的buffer为实际发送内容的长度,当发送数据的长度小于服务端接收buffer的长度时,多个发送内容就会存放到服务端的buffer中,导致上次发送的数据和本次的发送的数据连在一起。)
解决的方法也有很多(参考文献:怎么解决TCP网络传输「粘包」问题? - 知乎 携程旅行网 资深研发工程师的回答 )
-
固定包长的数据包
-
以指定字符(串)为包的结束标志
-
包头 + 包体格式
这里我是推荐大家使用第二种和第三种方式,第二种方式需要使用一些特定的字符进行划分每段数据的结束标志,遇到原消息种含有结束标志的时候,就需要对这些字符做转码或者转义操作,以免被接收方错误地当成包结束标志而误解析。第三章就是需要自己定义包头 + 包体格式,在日常开发中,还是要根据自己的实际需求去选择自己所使用的方法.
源码
https://github.com/WindFgg/.NETSocket
总结
最后总结出来C#的Socket
类可以封装为WebSocket
WebSocket
自带心跳
HTTP
WebSocket
Tcp
UDP
都可以使用C#Socket
类进行封装,C#有封装好的。
又因为他们WebSocket和Socket在使用方面,完全不是一个东西。出发层面就错了。
拓展资料
OSI模型
来源
OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。
OSI七层模型的划分
OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图。每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。
参考文献
-
百度百科:OSI参考模型
-
引用博客:OSI七层模型与TCP/IP五层模型
TCP/IP协议
简介
TCP/IP协议簇
, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,
从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议簇。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中
TCP/IP四层模型以及五层模型
简介
TCP/IP四层模型是OSI七层模型的简化版,但是大致的核心内容是很类似的。虽然OSIG更容易开发和排除故障,但是相较于简洁的TCP/IP,显得庞大而笨拙。十分有趣的是,OSI虽然是官方提出的,但是由于一些原因,在它被完善之前,由民间开发的TCP/IP早已投入实际使用了,所以它几乎是只存在与教科书中,并没有大范围地投入使用。
TCP/IP四层参考模型
TCP/IP四层参考模型从上到下可分为四层:
4、应用层(Application):为用户提供所需要的各种服务
3、传输层(Transport):为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性
2、网际层(Internet):主要解决主机到主机的通信问题
1、网络接口层(Network Access):负责监视数据在主机和网络之间的交换
五层TCP/IP协议的体系结构
五层协议只是OSI和TCP/IP的综合。是专门为介绍网络原理而设计的,与TCP/IP四层模型唯一不同的就是将网络接口层分为了数据链路层和物理层,在实际的应用中还是使用TCP/IP四层模型的。
参考文献
1.百度百科:TCP/IP协议