sockaddr_tipc分析

如果你对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

如果取值类型为TIPC_ADDR_NAMESEQ,那么在union addr中需要对nameseq赋值。struct tipc_name_seq定义如下。

 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,然后再修改。

你可能感兴趣的:(sockaddr_tipc分析)