Socket的一次探索尝试

前言

因最近老师提出提出了Socket是否可以与WebSocket通讯的问题,让我去了解尝试一下,在网上搜索了一些有关于SocketWebSocket的文章之后,便写下了这篇文章。在日常开发场景中,如果不是一个非常大型的系统,需要采用一些定制化的需求,我们只用粗略的了解这些协议的信息即可,没必要去深究这些协议.在本文中我列举了WebSocketSocket以及HTTP 的简介以及他们的不同.随后我使用C#实现了简单的Socket和WebSocket的列子。

Socket

简介

SocketOSI模型中应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Socket又称套接字。

一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。

我所理解的Socket就是为了更方便使用TCP协议或者UDP协议的实现封装和应用。是抽象接口

参考文献

  1. Socket原理
  2. 百度百科:Scoket(套接字)

WebSocket

简介

WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成(又称协议升级(HTTP->Websocket)。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。目的:即时通讯,替代轮询

我所理解的WebSocket是双向通信协议,可以双向发送或接受信息。他的出现是为了替代HTTP协议长轮询的效率低下等问题进行了解决

参考文献

  1. 阮一峰:WebSocket 教程
  2. 看完让你彻底搞懂Websocket原理
  3. 万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践

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协议本身不会对发送过的请求和相应的通信状态进行持久化处理。

参考文献

  1. Http、Socket、WebSocket之间联系与区别

C#实现

C# 中提供了

  • Socket类 ,是抽象概念是接口,可以基于它实现TCP传输 或 UDP传输

  • 基于Socket类 ,使用TCP协议封装的TcpClient类和TCPListener

  • 基于Socket类 ,使用UDP协议封装的UdpClient

在使用Socket遇到了一个问题粘包

(严谨一点来说并不叫粘包,TCP协议是流式协议,所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志,需要我们人为地去给这些协议划分边界。客户端发送数据时,发送的buffer为实际发送内容的长度,当发送数据的长度小于服务端接收buffer的长度时,多个发送内容就会存放到服务端的buffer中,导致上次发送的数据和本次的发送的数据连在一起。)

解决的方法也有很多(参考文献:怎么解决TCP网络传输「粘包」问题? - 知乎 携程旅行网 资深研发工程师的回答 )

  1. 固定包长的数据包

  2. 以指定字符(串)为包的结束标志

  3. 包头 + 包体格式

这里我是推荐大家使用第二种和第三种方式,第二种方式需要使用一些特定的字符进行划分每段数据的结束标志,遇到原消息种含有结束标志的时候,就需要对这些字符做转码或者转义操作,以免被接收方错误地当成包结束标志而误解析。第三章就是需要自己定义包头 + 包体格式,在日常开发中,还是要根据自己的实际需求去选择自己所使用的方法.

源码

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的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。

参考文献

  1. 百度百科:OSI参考模型

  2. HCNA-HNTD——以太网帧结构

  3. 引用博客: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协议

2.参考博客:OSI七层协议模型、TCP/IP四层模型和五层协议体系结构之间的关系