• 集群节点间网络通信TIPC


    1. TIPC背景介绍##

    TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括:

    1. 协议发送的大部分message都是直接到达目的地(无路由);
    2. message的传输时间都很短;
    3. message都在集群内部节点间传递;
    4. 包丢失率很低, 重传不经常发生;
    5. 可用带宽和内存都很大;
    6. 包校验和都由硬件校验;
    7. 通信节点的数量在一定时间内是相对受限和静态的;
    8. 安全在封闭的集群环境里相对Internet来说不是关键因素。
      Q:上述假定可以得出TIPC是基于流量驱动(traffic-driven)和固定大小滑动窗口的信号链路层协议。
      A:tipc的每个link都可以设置tolerance数值和window大小,静态的。
    2. TIPC网络协要素##

    网络协议包括协议结构,逻辑节点何消息结构三个方面。

    2.1 协议结构##
    2.2 节点逻辑结构##

    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组成的地址, 一般标记为 z.c.n 其中: 1<=Z<=255, 1<=C, N<=4095.TIPC网络中的每个节点都有一个由zone ID, cluster ID和node ID组成的地址, 一般标记为 z.c.n 其中: 1<=Z<=255, 1<=C, N<=4095. 如果一个TIPC网络节点还没有被分配地址, 那么就以<0.0.0>标记它. TIPC网络一般也有自己的ID. 这样可以使多个逻辑TIPC网络共同使用相同的物理介质(如以太网LAN等)而不相互干扰。
    2.3 消息结构##

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

    1. payload message: 在应用程序和应用程序或应用程序和TIPC服务之间传送应用程序相关的内容。
    2. internal message: 在TIPC子系统之间传送TIPC相关的内容。
      每个TIPC消息都包含消息头部和数据2部分, 消息头部的格式和用户相关, 大小从6个字到11字(word)不等(TIPC支持头部将来最大扩展到60字节). 头部是以网络字节序编码的32字节整形存储的。
    3. 原理##

    使用端口名称Port Naming来指代<ZCN:REF>,首先端口名称这个概念必须基于scope的前提,在同一个scope下,端口名是不能重合的{type,instance}这里的type和instance都是32位的大小,端口名称增加了灵活度,例如多个<ZCN:REF>都提供一样的服务,那么我们可以在端口名称的情况里进行多个<ZCN:REF>绑定到一个{type,instance}的方式,反过来,一个port提供多个服务的话,那么我们也可以一个<ZCN:REF>绑定到多个{type,instance}。
    使用TIPC,我们在创建socket的时候在内核中注册自己的服务类型service type,那么在发送端,只需要指定服务类型就可以由内核路由到相应的socket。这个时候,对应用层来说,对端地址仅仅是一个服务类型service type!很显然,内核维护着这么一张TIPC的路由表,即由服务去查找socket。而每台机都有这样的路由表,他们之间信息就像能够共享一样地为整个集群的TIPC socket服务。有了TIPC,这个socket使用了哪个IP,哪个端口。

    4. 安装与配置##
    1. 源码编译安装(内核模块动态装载方式)2016-12-04 00:11:56 星期日
    • download related kernel version source: [root@192 ~]# yum install kernel-devel-uname -r``
    • 将现有的config覆盖源码的config cp /boot/config-3.10.0-229.11.1.el7.x86_64 .config
    • make menuconfig
    • make modules 此时就可以在对应的模块目录下找到自己的ko文件
    • download tipcutils-2.0.2.tar.gz
    • cd tipcutils-2.0.2; make
    [root@192 tipc]# pwd
    /lib/modules/3.10.0-327.36.3.el7.x86_64/kernel/net/tipc
    [root@192 tipc]# modprobe tipc
    [root@192 tipc]# lsmod |grep tipc
    tipc                  116876  0 
    

    例如TIPC内核模块而言,直接用root # modprobe tipc来加载,就可以将tipc模块加载到内核。
    配置网络: root# tipc-config -netid=1234 -addr=1.1.8 -be=eth:eth0/1.1.0
    远程管理: root# tipc-config -dest=1.1.9 -n
    禁用远程管理: root# tipc-config -mng=disable
    tipc-2.0标准去掉了之前标准里面对于zone的支持,目前这个版本只支持在一个cluster里面的节点情况,在linux内核里面作为一个模块来加载的是tipc.ko。该模块的管理工具包括./tipc-config ,这个工具是与版本相关的,不要拿之前的版本软件工具来用。
    在配置TIPC网络的过程中,需要理解选项中的几个概念:
    address 节点地址(例如,1.1.2)
    bear 承载名称(例如,eth:eth0)
    link 节点间链接(例如,1.1.1:eth0-1.1.2:eth0)
    media 媒体名称(例如,eth)
    link tolerance
    link window
    domain 网络区域,例如2.3.12,2.3.0,2.0.0或0.0.0
    network id
    priority

    5. 编程指南##

    编程时需要注意的几点:

    1. 程序里面一般只用端口名称来通信;
    2. 如果节点之间存在冗余link的话,是协议栈自行决定。
    5.1 Port Naming##
    • port naming 冲突机制:在一个node内部,这个是比较自由的,节点内的任何port都可以绑定到任何一个name上,也可以绑定多个name,但是不能重复绑定一个name;
    • 在节点之间有一个scope的概念,这个涉及到,比如scope有node已经publish了一个name,那么就不能有重复了,除非不在一个scope。naming在scope内有排斥作用,如果先前的服务提供了某些范围的name sequences,这时会publish给定义的scope内的所有节点,这时后续的有冲突的这个name就无法创建成功。
    • Overlapping name sequences are permitted if they are published by different nodes and are published with non-overlapping scopes. For example, it is possible to publish {100,500,1200} on node <1.1.1> and {100,1100,1500} on node <1.1.2> as long as they both are published with node scope.
    • naming 的用户可用范围是0~63,其中{0,zcn}和{1,1}是用于
    5.2 Naming Resolution##

    client应用在计划连接server时会指定lookup domain,默认查找整个tipc网络,**因为port naming的特性,一个name可能对应好多个id,这里tipc是循环使用这个有效的port id
    首先应用程序从自己的topo svr这里获取目标port id,如果找不到,这个消息会依次发送给各个节点。

    5.3 Multicast Messaging##

    这个是一个port name匹配的问题,从name的角度来看,消息的副本会发给sequence匹配上的name;从port id的角度看,不管怎样,每次只收到一个这样的消息。

    5.4 Name Subscriptions##

    TIPC提供一个topology服务,应用先connect到{1,1},这个是topo提供的服务,然后再订阅自己感兴趣的;
    首先,每个node都会发布自己的{0,zcn}用于自动建立link等;
    订阅消息包含:****
    订阅返回的事件消息包含:****

    6. 参考文档##
    1. 集群通信TIPC协议
    2. 通信协议——HTTP、TCP、UDP三者的关系
    每走一步,都是新的开始!
  • 相关阅读:
    [cf1097F]Alex and a TV Show
    [cf1097E]Egor and an RPG game
    2.2 物理层下面的传输媒体
    2.1 物理层的基本概念
    8 垃圾回收
    7 直接内存
    6 方法区
    1.5 计算机网络体系结构
    1.4 计算机网络的性能指标
    1.3 计算机网络的定义和分类
  • 原文地址:https://www.cnblogs.com/shafei/p/6129835.html
Copyright © 2020-2023  润新知