TIPC协议使用的套接字地址为struct sockaddr_tipc类型:
struct sockaddr_tipc {
unsigned short family;
unsigned char addrtype;
signed char scope;
union {
struct tipc_portid id;
struct tipc_name_seq nameseq;
struct {
struct tipc_name name;
__u32 domain; /* 0: own zone */
} name;
} addr;
};
和其他套接字类似,family指明了地址使用的协议簇。
addrtype指明了地址类型,addrtype取值如下:
#define TIPC_ADDR_NAMESEQ 1
#define TIPC_ADDR_MCAST 1
#define TIPC_ADDR_NAME 2
#define TIPC_ADDR_ID 3
如果说TIPC_ADDR_NAMESEQ为发送消息时寻找服务而存在,那么TIPC_ADDR_NAME就是为绑定服务而存在。struct tipc_name的结构如下:
而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的定义如下:
struct tipc_portid {
__u32 ref;
__u32 node;
};
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的取值范围如下:
在TIPC协议中,一台主机为一个节点,一个节点的地址是固定的,初次使用insmod安装tipc.ko后,可以通过tipc-config配置节点地址,但配置过后就不能再更改了,如果需要更改需要通过rmmod移除tipc.ko,然后再修改。