TIPC协议的地址分析

来源:互联网 发布:淘宝快递助手怎么授权 编辑:程序博客网 时间:2024/06/06 01:06

TIPC协议使用的套接字地址为struct sockaddr_tipc类型:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. struct sockaddr_tipc {  
  2.         unsigned short family;  
  3.         unsigned char  addrtype;  
  4.         signed   char  scope;  
  5.         union {  
  6.                 struct tipc_portid id;  
  7.                 struct tipc_name_seq nameseq;  
  8.                 struct {  
  9.                         struct tipc_name name;  
  10.                         __u32 domain; /* 0: own zone */  
  11.                 } name;  
  12.         } addr;  
  13. };  
和其他套接字类似,family指明了地址使用的协议簇。

addrtype指明了地址类型,addrtype取值如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #define TIPC_ADDR_NAMESEQ       1  
  2. #define TIPC_ADDR_MCAST         1  
  3. #define TIPC_ADDR_NAME          2  
  4. #define TIPC_ADDR_ID            3  
如果取值类型为TIPC_ADDR_NAMESEQ,那么在union addr中需要对nameseq赋值。struct tipc_name_seq定义如下:
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. struct tipc_name_seq {  
  2.         __u32 type;  
  3.         __u32 lower;  
  4.         __u32 upper;  
  5. };  
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的结构如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <pre code_snippet_id="113929" snippet_file_name="blog_20131216_4_7632211" class="cpp" name="code">struct tipc_name {  
  2.         __u32 type;  
  3.         __u32 instance;  
  4. };</pre><br>  
  5. <pre></pre>  
  6. struct tipc_name_seq中的type一样,struct tipc_name中的type指明了服务类型。  
  7. <pre></pre>  

而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的定义如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. struct tipc_portid {  
  2.         __u32 ref;  
  3.         __u32 node;  
  4. };  

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的取值范围如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #define TIPC_ZONE_SCOPE         1  
  2. #define TIPC_CLUSTER_SCOPE      2  
  3. #define TIPC_NODE_SCOPE         3  

在TIPC协议中,一台主机为一个节点,一个节点的地址是固定的,初次使用insmod安装tipc.ko后,可以通过tipc-config配置节点地址,但配置过后就不能再更改了,如果需要更改需要通过rmmod移除tipc.ko,然后再修改。

 

转载自:http://blog.csdn.net/henujava/article/details/9071505

0 0
原创粉丝点击