如果你对TIPC不了解,请参考https://www.kernel.org/doc/ols/2004/ols2004v2-pages-61-70.pdf,以及http://tipc.sourceforge.net(访问可能存在问题)。
TIPC协议使用的套接字地址为struct sockaddr_tipc类型。
在ubuntu 10.04下的/usr/include/linux/tipc.h文件中,我们可以找到struct sockaddr_tipc的定义。
182 struct sockaddr_tipc {
183 unsigned short family;
184 unsigned char addrtype;
185 signed char scope;
186 union {
187 struct tipc_portid id;
188 struct tipc_name_seq nameseq;
189 struct {
190 struct tipc_name name;
191 __u32 domain; /* 0: own zone */
192 } name;
193 } addr;
194 };
和其他套接字类似,family指明了地址使用的协议簇。
addrtype指明了地址类型,addrtype取值如下:
177 #define TIPC_ADDR_NAMESEQ 1
178 #define TIPC_ADDR_MCAST 1
179 #define TIPC_ADDR_NAME 2
180 #define TIPC_ADDR_ID 3
56 struct tipc_name_seq {
57 __u32 type;
58 __u32 lower;
59 __u32 upper;
60 };
struct tipc_name_seq的lower、upper看起来像是表示一个范围,确实如此,它们表示了一个服务所在的范围。TIPC地址以不同的服务划分,不同节点之间的服务可以相同,为了区分这些服务,服务还对应instance(下文会有说明),而struct tipc_name_seq 的lower、upper正是指明了服务的范围,所以你可以认为struct tipc_name_seqname为发消息时寻找符合要求的服务而存在。
如果说TIPC_ADDR_NAMESEQ为发送消息时寻找服务而存在,那么TIPC_ADDR_NAME就是为绑定服务而存在。struct tipc_name的结构如下:
51 struct tipc_name {
52 __u32 type;
53 __u32 instance;
54 };
和struct tipc_name_seq中的type一样,struct tipc_name中的type指明了服务类型。
而instance则是该服务区别于其他服务的标识,和上文struct tipc_name_seq的lower、upper对应。
而TIPC_ADDR_MCAST和TIPC_ADDR_ID有什么作用呢?
从字面意思上看TIPC_ADDR_MCAST表明该地址为多播地址,上文中struct tipc_name_seq的lower、upper最多只能让对应同一服务的若干个节点接收消息,而多播应该是和服务无关吧(TIPC_ADDR_MCAST没有用过,也没有了解)。
TIPC_ADDR_ID更是没有了解。
struct tipc_portid的定义如下:
46 struct tipc_portid {
47 __u32 ref;
48 __u32 node;
49 };
node指明了节点地址,但ref的含义是什么呢,它和struct tipc_name_seq以及struct tipc_name中的type有联系吗,我不知道。
通过tipc-config查看节点信息时可以看到对应于struct tipc_portid的ref,node信息。例如在没有tipc用户程序启动时,运行 tipc-config -nt可以得到如下信息:
Type Lower Upper Port Identity Publication
-------------------------------- -------------------------- ------------------
0 16781313 16781313 <1.1.1:2111340545> 2111340546 zone
1 1 1 <1.1.1:2111381507> 2111381508 node
由上可以看到,type=0的节点的地址为<1.1.1>,ref为2111340545,type=1的节点的地址为<1.1.1>,ref为2111381507。
注意:值为0-63的type为TIPC保留type,不能被用户程序使用,type=0为配置服务类型(configuration service name type),type=1为拓扑服务类型(topology service name type)。
在struct sockaddr_tipc中我们还遗漏了一个元素,即domain,与struct tipc_name name共同组成struct name的domain。domain的取值范围如下:
96 #define TIPC_ZONE_SCOPE 1
97 #define TIPC_CLUSTER_SCOPE 2
98 #define TIPC_NODE_SCOPE 3
三者的区别请参考 https://www.kernel.org/doc/ols/2004/ols2004v2-pages-61-70.pdf
在TIPC协议中,一台主机为一个节点,一个节点的地址是固定的,初次使用insmod安装tipc.ko后,可以通过tipc-config配置节点地址,但配置过后就不能再更改了,如果需要更改需要通过rmmod移除tipc.ko,然后再修改。