TIPC协议及示例

一、概述

透明进程间通信(Transparent Inter-process Communication, TIPC) 是一种用于进程间通信的网络通信协议,原本是为集群间通信特别设计的。它允许设计人员能够创建可以和其它应用快速可靠地通信应用,无须考虑在其它需要通信的应用在集群环境中的位置。

特点:网路中服务位置透明,自动发现机制,可靠性,标准套接字接口的支持,无连接,有链接,多播。

在linux vxworks 可用这个协议,用C或者C++的运用中能创建AF-TIPC的SOCKET套接字来使用TIPC协议

二.TIPC模块的编译

1. TIPC 的网路功能是采用模块的形式在内核实现的,模块为tipc.ko

                Linux

                  | ---include

                  |     | -----linux |----tipc.h

                  |     |       |----tipc_config.h

                  |     |  

                  |     | -----net -----tipc|----tipc.h

                  |                  |---tipc_plugin_if.h

                  |                  | ---tipc_plugin_msg.h

                  |                  | ---tipc_plugin_pert.h

                  |

                  |            |-----konfig makefile

                  | ----net-----tipc |-----tipc_acldr.c

                               | -----tipc_user_reg.c

                               | -----tipc_user_reg.h

 

2.下载源文件,并将之替换掉当前内核中的对应位置的TIPC源文件

3.在linux源目录运行 make menuconfig 配置TIPC的参数

4.使用make modules  M=net/tipc 编译tipc模块,若编译正确将在/usr/src/linux/net/tipc目录中生成tipc-*.ko 内核模块文件

5.安装   有以下命令:

      1. lsmod |grep tipc

      2.modinfo tipc.ko   (查看新tipc文件内核版本)

      3.rmmod tipc-*   (删除系统中的版本)

      4.insmod tipc.ko    (插入新的TIPC版本)

三.接收发送

    1.发送端实例

Struct sockaddr_tipc  server_addr;
    Int sd = socket (AF_TIPC, SOCK_RDM, 0);
    Server.addr.family = AF_TIPC;
    Server.addr.assrtype = TIPC_ADDR_NAME;
    Server.addr.addr.name.type = type;     //TIPC
    Server.addr.addr.name.name.instance = port;
    Server.addr.addr.name.domain = 0;
    Char buf[40] = {“hello world”};
    If (0>sendto (sd buf,strlen(buf)+1,0, (struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        Perror(“client:failed send”);
        Exit(1);
}

接受端实例:

Struct sockaddr_tipc  server_addr;
    Int sd = socket (AF_TIPC, SOCK_RDM, 0);
    Server.addr.family = AF_TIPC;
    Server.addr.assrtype = TIPC_ADDR_NAME;
    Server.addr.addr.name.type = type;     //TIPC
    Server.addr.addr.name.name.instance = port;
    Server.addr.addr.name.domain = 0;
    If (0 != bind(sd,(struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        Printf (“failed to bind ”);
        Eixt(1);
}

If(0>=recvfrom(sd, Inbuf, sizeof(inbuf), 0, (strruct sockaddr*)&client_addr, &alen))
{
    Peeror(“unexepected message”;
}
    Printf(“sever:message receiived”, inbuf);

四.网络拓扑

TIPC网络地址是和整个物理结点相关联的,地址模式映射到逻辑网络拓扑。方式。 Z(zone 8位),C(cluster, 12位), N(node, 12位), 共32位。 一个网络可包括255个域(zone),

一个域包括4096个集群(cluster),一个集群包括4096个结点(node).

TIPC采用5级分层网络: netnode, zone , cluster,node,slave node 0 zone内部每个node 可以互相通信。Networks则逻辑隔离

TIPC运用程序可以发送长1—66000字节长的消息,它的协议栈负责报文的分片和重组
 

TIPC体系结构视图


      

     Node A                                             Node B
  -------------                                      -------------
 |    TIPC     |                                    |    TIPC     |
 | Application |                                    | Application |
 |-------------|                                    |-------------|
 |             |                                    |             |
 |    TIPC     |TIPC address            TIPC address|    TIPC     |
 |             |                                    |             |
 |-------------|                                    |-------------|
 |   L2 Bearer |Bearer address   \/   Bearer address|   L2 Bearer |
 |   Service   |                 /\                 |   Service   |
  -------------                                      -------------
        |                                                  |
        |---------------- Bearer Transport ----------------|

TIPC网络结构

TIPC网络是由单个的处理单元或节点组成. 网络节点是严格分层的, 规则如下:

  1. 相关节点的集合构成一个cluster: 如果cluster中的每一个节点都至少有一条直达其他每个节点的路径(即cluster的节点是全连通的), 那么这些节点构成一个cluster, 每个cluster有1~4095个节点.
  2. 相关cluster的集合构成一个zone: 如果zone中的每一个cluster都至少有一条直达其他每个cluster的路径(即zone的cluster是全连通的), 那么这些cluster构成一个zone, 每个zone有1~4095个cluster, 每个cluster的大小不必相同.
  3. 相关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组成的地址, 一般标记为. 其中: 1<=Z<=255, 1<=C, N<=4095. 如果一个TIPC网络节点还没有被分配地址, 那么就以<0.0.0>标记它. TIPC网络一般也有自己的ID. 这样可以使多个逻辑TIPC网络共同使用相同的物理介质(如以太网LAN等)而不相互干扰.
 

 ------------------------------------------------------  ----------
| Zone <1>                                            | | Zone <2> |
|  -----------------------    ----------------------  | |          |
| | Cluster <1.1>         |  | Cluster <1.2>        | | |          |
| |                       |  |                      | | |          |
| |  -------              |  |  -------    -------  | | |          |
| | |       |             |  | |       |  |       | | | |          |
| | | Node  |             |  | | Node  +--+ Node  | | | |          |
| | |<1.1.1>|    -------  |  | |<1.2.1>|  |<1.2.2>| | | |          |
| | |       +---+       | |  | |       |  |       | | | |          |
| |  ---+---    | Node  | |--|  --+----    -------  | | |          |
| |     |       |<1.1.3>| |  |    |                 | | |          |
| |  ---+---    |       | |  |  --+--               | | |          |
| | |       +---+       | |  | |Seco.|              | | |          |
| | | Node  |    -------  |  | |<1.2.|              | | |          |
| | |<1.1.2>|             |  | |3333>|              | | |          |
| | |       |             |  |  -----               | | |          |
| |  -------              |  |                      | | |          |
|  -----------------------    ----------------------  | |          |
|                                                     | |          |
 -----------------------------------------------------   ----------

                                              典型的TIPC网络拓扑图

注意: 

  1. TIPC2.0只支持单cluster的网络.
  2. TIPC网络节点的地址和IP有很大区别, 每个TIPC节点最多只有一个地址, 没有网络接口(interface)的概念.
  3. 每个节点的地址以及TIPC网络的ID都由网络管理员负责分配, 程序员不用关心这些.

五.Port标识

Port 是TIPC网络协议的通信标识,具有网络唯一性,由运用程序创建port时由TIPC自动生成。

Port ID 典型标识是, ref 是32位参考值,在node结点上是唯一的

Port ID属于TIPC网络通信的物理地址标识, 用于TIPC协议消息通信的内部路由。

 

六.Port name  (功能地址)

    Port name 形式  a{type, instance}  #名字

               B{type, lower, bound}   #名字序列

Port name 和port ID 的映射是由TIPC的port 发布关联的,当应用bind指定的port name 时,TIPC自动生成关联port ID ,并在指定的网络区域发布。

 

七.消息发送

若node结点在本地,则直接挂消息到目的port队列,若非本地结点,则由可用的链路发到目的结点。

TIPC消息格式


message是TIPC节点端口间信息交换的基本单元. TIPC中有2种基本消息:

  1. payload message: 在应用程序和应用程序或应用程序和TIPC服务之间传送应用程序相关的内容.
  2. internal message: 在TIPC子系统之间传送TIPC相关的内容.

每个TIPC消息都包含消息头部和数据2部分, 消息头部的格式和用户相关, 大小从6个字到11字(word)不等(TIPC支持头部将来最大扩展到60字节). 头部是以网络字节序编码的32字节整形存储的.

 

八.常创建发消息失败的原因

a.长度大于66000字节,返回EINVAL;

b.TIPC用的内存不是使用的低端的内存,返回ENOMEM;

C.目的port链路阻塞,且发送端不期望阻塞,返回ELINKCONG;

d.基于有链接的链路对应的目的的port阻塞,且发送端不期望阻塞;

你可能感兴趣的:(TIPC协议及示例)