1. TIPC背景介紹##
TIPC主要是用於集群網絡環境之中,它這個協議有一些前提假設包括:
- 協議發送的大部分message都是直接到達目的地(無路由);
- message的傳輸時間都很短;
- message都在集群內部節點間傳遞;
- 包丟失率很低, 重傳不經常發生;
- 可用帶寬和內存都很大;
- 包校驗和都由硬件校驗;
- 通信節點的數量在一定時間內是相對受限和靜態的;
- 安全在封閉的集群環境里相對Internet來說不是關鍵因素。
Q:上述假定可以得出TIPC是基於流量驅動(traffic-driven)和固定大小滑動窗口的信號鏈路層協議。
A:tipc的每個link都可以設置tolerance數值和window大小,靜態的。
2. TIPC網絡協要素##
網絡協議包括協議結構,邏輯節點何消息結構三個方面。
2.1 協議結構##
2.2 節點邏輯結構##
TIPC網絡是由單個的處理單元或節點組成. 網絡節點是嚴格分層的, 規則如下:
- 相關節點的集合構成一個cluster: 如果cluster中的每一個節點都至少有一條直達其他每個節點的路徑(即cluster的節點是全連通的), 那么這些節點構成一個cluster, 每個cluster有1~4095個節點.
- 相關cluster的集合構成一個zone: 如果zone中的每一個cluster都至少有一條直達其他每個cluster的路徑(即zone的cluster是全連通的), 那么這些cluster構成一個zone, 每個zone有1~4095個cluster, 每個cluster的大小不必相同.
- 相關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種基本消息:
- payload message: 在應用程序和應用程序或應用程序和TIPC服務之間傳送應用程序相關的內容。
- 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. 安裝與配置##
- 源碼編譯安裝(內核模塊動態裝載方式)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. 編程指南##
編程時需要注意的幾點:
- 程序里面一般只用端口名稱來通信;
- 如果節點之間存在冗余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等;
訂閱消息包含:****
訂閱返回的事件消息包含:****