企业办公|会员服务平台
  • 协同办公
  • 集群调度
服务热线:400-650-2790
产品展示
  • 宽带无线产品
  • 军工电子产品
  • 嵌入式系统产品
  • 物联网平台产品
行业解决方案
  • 油田
  • 港口
  • 电信
  • 交通
  • 船舶
  • 机场
  • 森林防火
  • 建筑工地
  • 跨海通信
  • 平安城市
  • 智能电网
  • 其他行业
  • FMC2.0,极致体验的融合超宽带
    随着4K视频等极致体验业务快速发展,超宽带产业正迈向千兆宽带时代。
  • FMC2.0,极致体验的融合超宽带
    随着4K视频等极致体验业务快速发展,超宽带产业正迈向千兆宽带时代。
实用的通信组件介绍

一、网络通信专业名词介绍

1.1TCP/IP协议组

TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成。
TCP/IP是个协议组,可分为三个层次:网络层,传输层和应用层:
HTTP是应用层协议,其传输都是被包装成TCP协议传输。可以用Socket实现HTTPSocket是实现传输层协议的一种编程API,可以是TCP,也可以是UDP;HTTPS是加密了的HTTP协议;WebSocket(简称WS)是各浏览器支持的本地与服务器之间通信的技术框架,相对应HTTPS,WSS是加密的WebSocket通信。

1.1TCP协议

TCP,即传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求。TCP是一种面向连接的保证可靠传输的协议。通过TCP协议,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个Socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket(通常都是ServerSocket)等待建立连接时,另一个Socket可以要求进行连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送和接收操作。
  • TCP特点
TCP是面向连接的协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接协议,所以只能用于点对点的通讯。而且建立连接也需要消耗时间和开销;TCP传输数据无大小限制,进行大数据传输;TCP是一个可靠的协议,它能保证接收方能够完整正确地接收到发送方发送的全部数据。
  • TCP的三次握手
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
  • 适用情况
TCP发送的包有序号,对方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠。一般网页(http)、邮件(SMTP)、远程连接(Telnet)、文件(FTP)传送就用TCP;TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高而且会出现TCP粘包问题需要开发者自行处理。

1.3UDP协议

  • UDP,即用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户端和服务器之间建立一个连接,且没有超时重发等机制,固而传输速度很快。
  • UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网路上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间已经内容的正确性都是不能被保证的。
  • UDP特点:
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。
UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
  • 【适用情况】
UDP是面向消息的协议,通讯时不需要建立连接,数据的传输自然是不可靠的,UDP一般多用于多点通讯和实时的数据业务,比如语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RTP(实时传送协议)、RIP(路由信息协议,如报告股票市场,航空信息)、DNS(域名解释)。注重速度流畅。
UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

1.4可靠性UDP协议

UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地,也没有超时重发、先发先到等机制,故而传输速度很快。
那么如何做到像TCP传输中不乱序、不丢包而保留本身的传输速度优势呢?应用层需要模拟TCP的重传机制、窗口确认机制。

1.4.1ENET(photon的可靠udp)

大家都知道UDP这个东西太不可靠了,存在着乱序,丢包,包重复等缺点,但它的速度快,包有界等优点,但在实际编程中要自己处理乱序之类的问题会发疯。也许大家说用TCP就得了,第一点TCP的速度比较慢,第二个TCP是一个数据流一样的东西,我们要传数据的话还得处理数据的分界问题,也挺麻烦的。
针对这个问题,ENET这个库实现了一个性能介于TCP与UDP之间,完成可靠(不丢包,按序),保持数据的分界的优点。编程起来也挺方便的。

1.4.2RakNet库

RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。
RakNet有以下特点:
高性能在同一台计算机上,RakNet可以实现在两个程序之间每秒传输25,000条信息;
容易使用RakNet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;
跨平台当前RakNet支持Windows,Linux,Macs,可以建立在VisualStudio,GCC,Code,Blocks,DevCPP和其它平台上。
在线技术支持RakNet有一个活跃的论坛,邮件列表,你只要给他们发信,他们可以在几小时之内回复你。
安全的传输RakNet在你的代码中自动使用SHA1,AES128,SYN,用RSA避免传输受到攻击
音频传输用Speex编码解码,8位的音频只需要每秒500字节传输。
远程终端用RakNet,你能远程管理你的程序,包括程序的设置,密码的管理和日志的管理。
目录服务器目录服务器允许服务器列举他们自己需要的客户端,并与他们连接。
AutopatcherAutopatcher系统将限制客户端传输到服务端的文件,这样是为了避免一些不合法的用户将一些不合法的文件传输到服务端。
对象重载系统
网络数据压缩BitStream类允许压缩矢量,矩阵,四元数和在-1到1之间的实数。
远程功能调用
强健的通信层可以保障信息按照不同的信道传输
RakNet是为游戏应用而设计,对于实时性等游戏相关的网络需求有很好的支持,对于大批量数据传输却有点力所不及。RakNet的缺点是不支持组播。

1.4.3KCP-AFastandReliableARQProtocol

第二章高性能网络通信框架就是使用KCP进行可靠性UDP封装。
KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以callback的方式提供给KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。
整个协议只有ikcp.h,ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于UDP的协议,而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

1.4.4UDT

基于UDP的数据传输协议(UDP-BasedDataTransferProtocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
UDT基于一种基于带宽速率控制的拥塞控制算法进行设计,主要用在小数量的bulk源共享富裕带宽的情况下,最典型的例子就是建立在光纤广域网上的网格计算,而在ISP提供带宽有限的情况下运行却显得消耗资源并性能不足。甚至可能被防火墙,或ISP服务商判断为恶意带宽使用攻击。

1.5HTTP(HTTPs)&WebSocket(WSs)协议

HTTPs指HTTPSSL,WSs指WebSocketSSL。

1.5.1HTTP(HTTPs)

HTTP协议是建立在TCP协议之上的一种应用,HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立TCP连接,而且需要客户端向服务器发出请求后,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息,服务器端才能回复数据,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。
HTTP是应用层协议,其传输都是被包装成TCP协议传输,可以用SOCKET实现HTTP。SOCKET是实现传输层协议的一种编程API,可以是TCP,也可以是UDP。
【适用情况】
若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

1.5.2WebSocket(WSs)

WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在WebSocketAPI中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是Ajax轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5定义的WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

1.6FTP协议

文件传输协议(FileTransferProtocol,FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。

1.7MQTT协议

MQTT(消息队列遥测传输)是ISO标准(ISO/IECPRF20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

1.8SNMP协议

SNMP是专门设计用于在IP网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。SNMP使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过SNMP接收随机消息(及事件报告)网络管理系统获知网络出现问题。
SNMP的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对SGMP进行了很大的修改,特别是加入了符合Internet定义的SMI和MIB,改进后的协议就是著名的SNMP。基于TCP/IP的SNMP网络管理框架是工业上的现行标准,由3个主要部分组成,分别是管理信息结构SMI(StructureofManagementInformation)、管理信息库MIB和管理协议SNMP。
  • SMI定义了SNMP框架所用信息的组织和标识,为MIB定义管理对象及使用管理对象提供模板。
  • MIB定义了可以通过SNMP进行访问的管理对象的集合。
  • SNMP协议是应用层协议,定义了网络管理者如何对代理进程的MIB对象进行读写操作。
SNMP中的MIB是一种树状数据库,MIB管理的对象,就是树的端节点,每个节点都有唯一位置和唯一名字.IETF规定管理信息库对象识别符(OID,ObjectIdentifier)唯一指定,其命名规则就是父节点的名字作为子节点名字的前缀。

1.9ICMP协议

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。
ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议及IGMP协议共同构成TCP/IP模型中的网络层。ping和tracert是两个常用网络管理命令,ping用来测试网络可达性,tracert用来显示到达目的主机的路径。ping和tracert都利用ICMP协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code)让机器来识别不同的连线状况。ICMP是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。

1.10SSL协议

SSL(SecureSocketLayer安全套接层)是基于HTTP下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(TheInternetEngineeringTaskForce-互联网工程任务组)标准化后写入(RFCRequestForComments请求注释),RFC里包含了很多互联网技术的规范!
起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HPPTS是HTTP+SSL/TCP的简称。
由于HTTPS的推出受到了很多人的欢迎,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(TransportLayerSecurity安全传输层协议),可以说TLS就是SSL的新版本3.1,并同时发布“RFC2246-TLS加密协议详解”,如果想更深层次的了解TLS的工作原理可以去RFC的官方网站:www.rfc-editor.org,搜索RFC2246即可找到RFC文档!——以上就是历史背景
SSL是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料。两个系统可能是指服务器和客户端(例如,浏览器和购物网站),或两个服务器之间(例如,含个人身份信息或工资单信息的应用程序)。

一、高性能网络通信框架HP-Socket

HP-Socket是一套国产通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言接口。HP-Socket对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket提供基于事件通知模型的API接口,能非常简单高效地整合到新旧应用程序中,其中UDPARQSERVER和UDPARQClient模型实现了可靠性UDP传输,在技术开发中有时需要解决TCP粘包问题,这套通信组件的TCPPackageServer和TCPPackageClient模型帮助我们实现;在Linux和Windows下实现了很多实用的辅助类,例如资源锁、线程池、环形队列、字符串转换等。
为了让使用者能方便快速地学习和使用HP-Socket,迅速掌握框架的设计思想和使用方法,特此精心制作了大量Demo示例(如:PUSH模型示例、PULL模型示例、PACK模型示例、性能测试示例以及其它编程语言示例)。HP-Socket目前支持Windows和Linux(含X86平台和ARM平台,因此对于android移动端也可以使用)平台。HP-Socket的设计充分注重功能、通用型、易用性与伸缩性。
通用性
  • HP-Socket的唯一职责就是接收和发送字节流,不参与应用程序的协议解析等工作。
  • HP-Socket与应用程序通过接口进行交互,并完全解耦。任何应用只要实现了HP-Socket的接口规范都可以无缝整合HP-Socket。
易用性
  • 易用性对所有通用框架都是至关重要的,如果太难用还不如自己重头写一个来得方便。因此,HP-Socket的接口设计得非常简单和统一。
  • HP-Socket完全封装了所有底层通信细节,应用程序不必也不能干预底层通信操作。通信连接被抽象为ConnectionID,ConnectionID作为连接的唯一标识提供给应用程序来处理不同的连接。
  • HP-Socket提供PUSH/PULL/PACK等接收模型,应用程序可以灵活选择以手工方式、半自动方式或全自动方式处理封解包,PULL/PACK接收模型在降低封解包处理复杂度的同时能大大减少出错几率。
高性能
  • Server组件:基于IOCP/EPOLL通信模型,并结合缓存池、私有堆等技术实现高效内存管理,支持超大规模、高并发通信场景。
  • Agent组件:Agent组件实质上是Multi-Client组件,与Server组件采用相同的技术架构。一个Agent组件对象可同时建立和高效处理大规模Socket连接。
  • Client组件:基于EventSelect/POLL通信模型,每个组件对象创建一个通信线程并管理一个Socket连接,适用于小规模客户端场景。
伸缩性
应用程序能够根据不同的容量要求、通信规模和资源状况等现实场景调整HP-Socket的各项性能参数(如:工作线程的数量、缓存池的大小、发送模式和接收模式等),优化资源配置,在满足应用需求的同时不必过度浪费资源。
TCP|UDP基础组件:
SSL组件(HTTPS协议)
HTTP组件

一、应用实践与发展

3.1GiMAC2.0

GiMAC2.0是永利电子游戏网站西安研发中心的研发一套Web开发平台,基于GiMACV1.0版本上进行完善优化、增补而进行的一次重大升级,主要表现为工程上SpringBoot化、WEB端框架优化为VUE/iView并进行组件化封装,大幅度提升了组件的复用率、降低代码量;部署上引入虚拟化技术和Docker技术实现了系统一键化安装,有力提高了系统的滑度,降低了对实施人员的技术能力要求而能够独自快速部署;核心功能上增加了安防视频、数据同步模块的集成,并对原有的集群对讲、音视频通信模块、即时消息、数据网关功能模块进行了优化升级以及替换了原有的、昂贵的GIS平台改为开源产品。从而,为公司内部、合作伙伴提供了一套标准化的技术开发平台,对项目业务功能模块的高效开发、部署实施提供了充分地技术保障。使用的技术协议有物联网以及定位传感器信号接入使用MQTT协议,即时消息传输使用了WebSocket、HTTP、UDP协议。
GiNMS综合网络设备管理系统一系列产品基于GiMAC1.0进行开发,涉及的协议层次ARP、ICMP、SNMP、HTTP、HTTPS、TELNET、SMTP、DNS、SNMP、SSH、WebSocket、MQTT,GiNMS4.8港口版完成了ICMP的V6版本支持(是我们产品的一个核心技术,与市面通用产品基于系统提供的ping命令相比,支持大批量并发扫描全网设备,快速发现能力提高近百倍)。

3.2GiMAC4.0扩展

西安研发中心在未来GiMAC4.0中会将HTTP、Websocket协议分别转换成HTTPS、WSS协议,增加系统访问安全。GStone模块在PC端、服务端、Android端基于HP-Socket的可靠性UDP技术、TCP粘包处理技术进行C++化(现为纯C)重构,降低维护、提高代码的复用度和可读性。

二、引用参考

4.1ENET库(photon的可靠udp)

https://github.com/lsalzman/enet
c#包装1:https://github.com/RainsSoft/enetcs
c#包装2:https://github.com/RainsSoft/ENetSharp

4.2RakNet库

https://github.com/OculusVR/RakNet

4.3KCP源码

源码:https://github.com/skywind3000/kcp
c#包装:https://github.com/RainsSoft/kcp-csharp
KCP同UDT/ENET的性能比较
http://blog.csdn.net/kxg99/article/details/50696336

4.4UDT库

https://sourceforge.net/projects/udt/source=directory
C#包装:https://github.com/dump247/udt

4.5推荐文章

1)HP-Socket永利电子游戏网站、文档和下载-高性能网络通信框架-OS...-开源中国https://www.oschina.net/p/hp-socket
2)网络协议族精讲--良心总结https://blog.csdn.net/zhwadezh/article/details/79110838
3)简书-MQTT协议基本介绍
https://www.jianshu.com/p/ecde412d2eeb

北京永利电子游戏网站科技股份有限公司 版权所有|
地址:北京市海淀区上地信息路1号国际创业园A栋4层 |
版权所有:北京永利电子游戏网站科技股份有限公司
XML 地图 | Sitemap 地图