集群节点间网络通信TIPC
1. TIPC背景介绍##
TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括:
- 协议发送的大部分message都是直接到达目的地(无路由);
- message的传输时间都很短;
- message都在集群内部节点间传递;
- 包丢失率很低, 重传不经常发生;
- 可用带宽和内存都很大;
- 包校验和都由硬件校验;
- 通信节点的数量在一定时间内是相对受限和静态的;
- 安全在封闭的集群环境里相对Internet来说不是关键因素。
Q:上述假定可以得出TIPC是基于流量驱动(traffic-driven)和固定大小滑动窗口的信号链路层协议。
A:tipc的每个link都可以设置tolerance数值和window大小,静态的。
2. TIPC网络协要素##
网络协议包括协议结构,逻辑节点何消息结构三个方面。
2.1 协议结构##
2.2 节点逻辑结构##
TIPC网络是由单个的处理单元或节点组成. 网络节点是严格分层的, 规则如下:
- 相关节点的集合构成一个cluster: 如果cluster中的每一个节点都至少有一条直达其他每个节点的路径(即cluster的节点是全连通的), 那么这些节点构成一个cluster, 每个cluster有1~4095个节点.
- 相关cluster的集合构成一个zone: 如果zone中的每一个cluster都至少有一条直达其他每个cluster的路径(即zone的cluster是全连通的), 那么这些cluster构成一个zone, 每个zone有1~4095个cluster, 每个cluster的大小不必相同.
- 相关zone的集合构成一个TIPC网络: 如果网络中的每一个zone都至少有一条直达其他每个zone的路径(即网络的zone是全连通的), 那么这些zone构成一个TIPC网络, 每个TIPC网络有1~255个zone, 每个zone的大小不必相同.
节点一般是按照邻近关系分组, TIPC的通信质量随着节点距离增加而下降, 在一个典型的TIPC网络中, 同一cluster中的节点间通信最频繁, 其次是同一zone而不同cluster的节点, 而不同zone中的节点基本没有通信.
TIPC网络中的每个节点都有一个由zone ID, cluster ID和node ID组成的地址, 一般标记为 z.c.n 其中: 1<=Z<=255, 1<=C, N<=4095.TIPC网络中的每个节点都有一个由zone ID, cluster ID和node ID组成的地址, 一般标记为 z.c.n 其中: 1<=Z<=255, 1<=C, N<=4095. 如果一个TIPC网络节点还没有被分配地址, 那么就以<0.0.0>标记它. TIPC网络一般也有自己的ID. 这样可以使多个逻辑TIPC网络共同使用相同的物理介质(如以太网LAN等)而不相互干扰。
2.3 消息结构##
message是TIPC节点端口间信息交换的基本单元. TIPC中有2种基本消息:
- payload message: 在应用程序和应用程序或应用程序和TIPC服务之间传送应用程序相关的内容。
- internal message: 在TIPC子系统之间传送TIPC相关的内容。
每个TIPC消息都包含消息头部和数据2部分, 消息头部的格式和用户相关, 大小从6个字到11字(word)不等(TIPC支持头部将来最大扩展到60字节). 头部是以网络字节序编码的32字节整形存储的。
3. 原理##
使用端口名称Port Naming来指代<ZCN:REF>,首先端口名称这个概念必须基于scope的前提,在同一个scope下,端口名是不能重合的{type,instance}这里的type和instance都是32位的大小,端口名称增加了灵活度,例如多个<ZCN:REF>都提供一样的服务,那么我们可以在端口名称的情况里进行多个<ZCN:REF>绑定到一个{type,instance}的方式,反过来,一个port提供多个服务的话,那么我们也可以一个<ZCN:REF>绑定到多个{type,instance}。
使用TIPC,我们在创建socket的时候在内核中注册自己的服务类型service type,那么在发送端,只需要指定服务类型就可以由内核路由到相应的socket。这个时候,对应用层来说,对端地址仅仅是一个服务类型service type!很显然,内核维护着这么一张TIPC的路由表,即由服务去查找socket。而每台机都有这样的路由表,他们之间信息就像能够共享一样地为整个集群的TIPC socket服务。有了TIPC,这个socket使用了哪个IP,哪个端口。
4. 安装与配置##
- 源码编译安装(内核模块动态装载方式)2016-12-04 00:11:56 星期日
- download related kernel version source:
[root@192 ~]# yum install kernel-devel-
uname -r`` - 将现有的config覆盖源码的config
cp /boot/config-3.10.0-229.11.1.el7.x86_64 .config
- make menuconfig
- make modules 此时就可以在对应的模块目录下找到自己的ko文件
- download tipcutils-2.0.2.tar.gz
- cd tipcutils-2.0.2; make
[root@192 tipc]# pwd
/lib/modules/3.10.0-327.36.3.el7.x86_64/kernel/net/tipc
[root@192 tipc]# modprobe tipc
[root@192 tipc]# lsmod |grep tipc
tipc 116876 0
例如TIPC内核模块而言,直接用root # modprobe tipc
来加载,就可以将tipc模块加载到内核。
配置网络: root# tipc-config -netid=1234 -addr=1.1.8 -be=eth:eth0/1.1.0
远程管理: root# tipc-config -dest=1.1.9 -n
禁用远程管理: root# tipc-config -mng=disable
tipc-2.0标准去掉了之前标准里面对于zone的支持,目前这个版本只支持在一个cluster里面的节点情况,在linux内核里面作为一个模块来加载的是tipc.ko。该模块的管理工具包括./tipc-config
在配置TIPC网络的过程中,需要理解选项中的几个概念:
address 节点地址(例如,1.1.2)
bear 承载名称(例如,eth:eth0)
link 节点间链接(例如,1.1.1:eth0-1.1.2:eth0)
media 媒体名称(例如,eth)
link tolerance
link window
domain 网络区域,例如2.3.12,2.3.0,2.0.0或0.0.0
network id
priority
5. 编程指南##
编程时需要注意的几点:
- 程序里面一般只用端口名称来通信;
- 如果节点之间存在冗余link的话,是协议栈自行决定。
5.1 Port Naming##
- port naming 冲突机制:在一个node内部,这个是比较自由的,节点内的任何port都可以绑定到任何一个name上,也可以绑定多个name,但是不能重复绑定一个name;
- 在节点之间有一个scope的概念,这个涉及到,比如scope有node已经publish了一个name,那么就不能有重复了,除非不在一个scope。naming在scope内有排斥作用,如果先前的服务提供了某些范围的name sequences,这时会publish给定义的scope内的所有节点,这时后续的有冲突的这个name就无法创建成功。
- Overlapping name sequences are permitted if they are published by different nodes and are published with non-overlapping scopes. For example, it is possible to publish {100,500,1200} on node <1.1.1> and {100,1100,1500} on node <1.1.2> as long as they both are published with node scope.
- naming 的用户可用范围是0~63,其中{0,zcn}和{1,1}是用于
5.2 Naming Resolution##
client应用在计划连接server时会指定lookup domain,默认查找整个tipc网络,**因为port naming的特性,一个name可能对应好多个id,这里tipc是循环使用这个有效的port id
首先应用程序从自己的topo svr这里获取目标port id,如果找不到,这个消息会依次发送给各个节点。
5.3 Multicast Messaging##
这个是一个port name匹配的问题,从name的角度来看,消息的副本会发给sequence匹配上的name;从port id的角度看,不管怎样,每次只收到一个这样的消息。
5.4 Name Subscriptions##
TIPC提供一个topology服务,应用先connect到{1,1},这个是topo提供的服务,然后再订阅自己感兴趣的;
首先,每个node都会发布自己的{0,zcn}用于自动建立link等;
订阅消息包含:****
订阅返回的事件消息包含:****