1.TCP(TLS)传输
TCP传输是以TCP作为底层传输协议的一种传输层实现,默认实现在liquid/host/tcp包内。底层使用golang官方net库实现。
TCP传输支持明文、TLS加密、GMTLS(国密算法支持)加密传输三种模式。
由于net库的tcp连接没有流的概念,所以TCP传输的数据流(Stream)目前是基于yamux开源组件实现,按照数据流向可分为接收流、发送流、双向流三种。
- SNI扩展
liquid支持SNI扩展。liquid在获得一个节点的网络地址的时候,会自动识别网络地址中dns关键字后面的域名,将其作为TLS握手中的servername,TLS的服务端可以根据servername执行相应的逻辑,比如将网络链接转发到某个特点的节点。
- QUIC传输
QUIC传输是以Quic作为底层传输协议的一种传输层实现,默认实现在liquid/host/quic包内。底层使用我们修改过的quic-go开源库实现。我们在quic-go的实现基础上加入了对国密算法GMTLS的支持。
QUIC传输不支持明文传输,要求使用TLS加密传输。我们修改后同时支持国密TLS。
Quic协议本身就有数据流的概念定义,所以QUIC传输的数据流直接使用quic-go的Stream封装实现。
应用协议ID即Protocol.是将Liquid节点间相同应用关联起来的重要依据,只有应用协议ID相同的Liquid应用才能够互相通讯。上层应用在发送消息时,会将该应用的协议ID封装在网络数据包中,接收方会根据接收的数据包中的协议ID来将收到的数据告知拥有相同协议ID的上层应用。
每个上层应用必须拥有全局唯一的应用协议ID,Liquid会拒绝多次的相同应用协议ID注册请求。
由于Liquid内置部分组件也是基于应用协议实现,开发者在定义上层应用协议ID时,应避免与内置组件应用协议冲突。
liquid支持链隔离功能(或者叫链级消息发布)。在不同链上的协议ID一定不同,而且数据隔离。但是同一条链上的不同协议可以共用一个数据通道。这两种方式相结合的好处是:节约网络资源的前提下保证应用层的数据隔离性。
4.内置连接管理器实现
Liquid内置了一种基于优先级的连接管理器——simple.LevelConnManager,实现代码在simple/level_connmgr.go文件中。
LevelConnManager允许针对每个节点添加一定数量的连接,若节点连接数量达到设置上限,则IsAllowed方法返回false。
LevelConnManager将节点连接分为两种优先级:高优先级、低优先级。共识节点、种子节点将被设置为高优先级,其他节点将被设置为低优先级。
优先级与节点ID绑定,高优先级节点数量与低优先级节点数量之和作为总节点连接数量。
当总节点连接数达到设置上线时,若添加新节点连接,则根据设置的淘汰规则淘汰一个节点(关闭该节点所有连接)。
我们提供了三种淘汰策略:Random、FIFO、LIFO。
1)Random策略:
如果新节点优先级为高,优先随机淘汰一个低优先级节点,若没有低优先级节点,则随机淘汰一个高优先级节点。
如果新节点优先级为低,随机淘汰一个低优先级节点,若没有低优先级节点,则淘汰该新节点。
2)FIFO 先进先出策略:
如果新节点优先级为高,优先淘汰一个最早添加的低优先级节点,若没有低优先级节点,则淘汰一个最早添加的高优先级节点。
如果新节点优先级为低,淘汰一个低优先级节点,若没有低优先级节点,则淘汰该新节点。
3) LIFO 后进先出策略:
如果新节点优先级为高,优先淘汰一个最晚添加的低优先级节点,若没有低优先级节点,则淘汰该新节点。
如果新节点优先级为低,淘汰该新节点。