一、网络的三类端口
区块链网络由多个互相连接的节点构成,每个节点又与客户端、浏览器和监控工具等相连接。区块链网络包括P2P端口、RPC端口和Channel端口。
RPC(即Remote Procedure Call,远程过程调用);
HTTP(HyperText Transfer Protocol,超文本传输协议) 。
OSI网络七层模型
在说RPC和HTTP的区别之前,我觉得有必要了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层: (从上到下)第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
第四层:传输层。管理着网络中的端到端的数据传输;
第五层:网络层。定义网络设备间如何传输数据;
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
第七层:物理层。这一层主要就是传输这些二进制数据。
实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面。因为HTTP是应用层协议,而TCP是传输层协议。他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹。
RPC主要是用在大型企业里面,因为大型企业里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候RPC的优势就比较明显了。
1.P2P端口
P2P端口,用于区块链节点之间的互联,包括机构内的多个节点以及多机构间节点和节点的互联。如果其他节点在机构外,那么这个连接要监听公网地址或者监听内网,且由连接公网的网关(如nginx)转发网络连接。节点之间的连接会由联盟链的准入机制控制,节点之间连接依靠节点证书验证以排除未经许可的危险连接。这个链路上的数据通过SSL方式加密,采用高强度密钥可以有效的保护通信安全。
2.RPC端口
![](/qrcode.jpg)
RPC是客户端与区块链系统交互的一套协议和接口,用户通过RPC接口可以查区块链相关信息(如块高、区块、节点连接等)和发送交易。
RPC端口接受JSON-RPC格式的请求发送到节点来处理。当发送交易时,客户端需实现交易签名。要注意的是,RPC连接没有做证书验证,且网络传输默认是明文的,安全性相对不高,建议只监听内网端口,用于监控、运营管理、状态查询等内部的工作流程上。
3.Channel端口
Channel端口,控制台和客户端SDK连接Channel端口,互相之间要通过证书验证,只有经过认证的客户端才能向节点发起请求,通信数据也是采用SSL方式(一种运行在传输层和应用层之间的加密方式)加密。Channel端口使用了TCP的长连接,用心跳包检测和保持存活,通信效率较高高。Channel端口应只监听内网IP地址,供机构内其他的应用服务器通过SDK连接,不应监听外网地址或接受公网的连接,以免发生不必要的安全问题。也不要只监听本地地址(127.0.0.1或localhost),否则其他应用服务器将无法连接到节点上。
TCP长连接和短连接
TCP在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,
连接的建立通过三次握手,释放则需要四次握手,
所以说每个连接的建立都是需要资源消耗和时间消耗的。
1. TCP短连接
模拟一种TCP短连接的情况:
- client 向 server 发起连接请求
- server 接到请求,双方建立连接
- client 向 server 发送消息
- server 回应 client
- 一次读写完成,此时双方任何一个都可以发起 close 操作
在步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。
从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!
2. TCP长连接
再模拟一种长连接的情况:
- client 向 server 发起连接
- server 接到请求,双方建立连接
- client 向 server 发送消息
- server 回应 client
- 一次读写完成,连接不关闭
- 后续读写操作...
- 长时间操作之后client发起关闭请求
3. TCP长/短连接操作过程
3.1 短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接3.2 长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接4. TCP长/短连接的优点和缺点
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。
client与server之间的连接如果一直不关闭的话,会存在一个问题,
随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,
如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;
如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,
这样可以完全避免某个蛋疼的客户端连累后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
5. TCP长/短连接的应用场景
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,
再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,
再次处理时直接发送数据包就OK了,不用建立TCP连接。
例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,
而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,
而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,
如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,
那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
4.端口间网络策略
节点间P2P端口需开通白名单,要求四个节点的P2P端口实现全互联;节点的Channel端口需开通白名单,要求只允许本机构内特定IP的应用(如控制台、SDK)可连接;节点的RPC端口不能对外开放,只允许同机的监控脚本及区块链浏览器访问。
三、联盟链的证书结构
三级证书结构自上而下分别为链证书、机构证书和节点证书。证书内容包括链证书版本号、序列号、证书的签名算法、消息摘要算法等生成信息;同时包括了证书的颁发者、有效期、使用者、公钥信息、SSL通信需要用到的密码套件等信息。
节点通过加载证书,在接受数据包时,根据证书规定的密码套件和其消息字段,对数据包中携带的证书进行验证。
联盟链的证书结构中有4种角色,分别是联盟链委员会、联盟链成员机构、联盟链参与方(节点和SDK)。证书生成流程如下:
1.联盟链委员会初始化根证书ca.crt
- 本地生成私钥ca.key;
- 自签生成根证书ca.crt。
2.联盟链成员机构获取机构证书agency.crt
- 本地生成私钥agency.key;
- 由本地私钥生成证书请求文件agency.csr;
- 将证书请求文件agency.csr发送至联盟链委员会;
- 联盟链委员会使用ca.key对证书请求文件agency.csr进行签发,得到联盟链成员机构证书agency.crt;
- 联盟链委员会将联盟链成员机构证书agency.crt发送至对应成员。
3.节点/SDK获取证书node.crt
- 本地生成私钥node.key;
- 由本地私钥生成证书请求文件node.csr;
- 将证书请求文件node.csr发送至联盟链成员机构;
- 联盟链成员机构使用agency.key对请求文件node.csr进行签发,得到节点/SDK证书node.crt;
- 联盟链成员机构将节点证书node.crt发送至相应节点。