1、使用TCP的單播傳輸:zmq_tcp(7)
1.1 名稱
zmq_tcp - 使用TCP的ZMQ單播傳輸
1.2 概要
TCP是一種無處不在,可靠的單播傳輸。當通過具有ZMQ的網絡連接分布式應用程序時,使用TCP傳輸可能是您的首選。
1.3 解決
ZMQ端點是一個由transport://后跟一個地址組成的字符串。 transport指定要使用的基礎協議。該地址指定要連接的傳輸特定地址。
對於TCP傳輸,傳輸是tcp,地址部分的含義如下定義。
1.3.1 將本地地址分配給套接字
當使用帶有tcp傳輸的zmq_bind()將套接字本地地址分配給套接字時,端點將被解釋為一個接口,后跟一個冒號和要使用的TCP端口號。
接口可以由以下任何一種指定:
通配符*表示所有可用的接口。
分配給接口的主要IPv4或IPv6地址,以其數字表示形式。
操作系統定義的非可移植接口名稱。
TCP端口號可以通過以下方式指定:
一個數值,通常在POSIX系統上超過1024。
通配符*表示系統分配的臨時端口。
使用臨時端口時,調用者應使用ZMQ_LAST_ENDPOINT套接字選項檢索實際分配的端口。有關詳細信息,請參閱zmq_getsockopt(3)。
1.3.2 從套接字解除通配符地址
當在zmq_bind()中使用通配符*端點時,調用者應使用從ZMQ_LAST_ENDPOINT套接字選項中獲得的實際endpoind使用zmq_unbind()從套接字解除綁定此端點。
1.3.3 連接一個socket
當使用帶tcp傳輸的zmq_connect()將套接字連接到對等地址時,端點應被解釋為對等地址,后跟冒號和要使用的TCP端口號。您可以選擇指定一個source_endpoint作為連接的源地址; tcp:// source_endpoint;'endpoint',詳見上面的接口說明。
對等地址可以由以下任一項指定:
對等體的DNS名稱。
對等體的IPv4或IPv6地址,以其數字表示形式。
注意:有關TCP傳輸使用的ZeroMQ消息傳輸協議(ZMTP)的說明可以在http://rfc.zeromq.org/spec:15找到
2、使用PGM的可靠組播傳輸:zmq_pgm(7)
2.1 名稱
zmq_pgm - 使用PGM的ZMQ可靠多播傳輸
2.2 概要
PGM(Pragmatic General Multicast)是IP網絡上可靠的數據組播傳輸協議。
2.3 描述
ZMQ實現PGM的兩種變體,PGM數據報直接在RFC 3208(pgm傳輸)和“封裝PGM”或EPGM定義的IP數據報之上分層,其中PGM數據報封裝在UDP數據報內(epgm傳輸)。
pgm和epgm傳輸只能與ZMQ_PUB和ZMQ_SUB套接字類型一起使用。
此外,PGM套接字默認是速率限制的。有關詳細信息,請參閱zmq_setsockopt(3)中記錄的ZMQ_RATE和ZMQ_RECOVERY_IVL選項。
pgm傳輸實現需要訪問原始IP套接字。在此操作的某些操作系統上可能需要額外的權限。鼓勵不要求與其他PGM實現直接互操作的應用程序使用epgm傳輸,而不需要任何特殊權限。
2.4 解決
ZMQ端點是一個由transport://后跟一個地址組成的字符串。 transport指定要使用的基礎協議。 該地址指定要連接的傳輸特定地址。
對於PGM運輸,運輸是pgm,而對於EPGM協議,運輸是epgm。 地址部分的含義定義如下。
2.5 連接一個socket
當使用帶pgm或epgm傳輸的zmq_connect()將套接字連接到對等地址時,端點將被解釋為一個接口,后跟一個分號,后跟一個多播地址,后跟一個冒號和一個端口號。
接口可以由以下任何一種指定:
操作系統定義的接口名稱。
以數字表示形式分配給接口的主IPv4地址。
注:接口名稱沒有以任何方式標准化,應該被認為是任意的並且取決於平台。 在Win32平台上,不存在短接口名稱,因此只有主IPv4地址可用於指定接口。 接口部分可以省略,在這種情況下,將會選擇默認的接口部分。多播地址由其數字表示中的IPv4多播地址指定。
2.5 Wire格式
連續的PGM數據報被ZMQ解釋為單個連續的數據流,其中ZMQ消息不一定與PGM數據報邊界對齊,並且單個ZMQ消息可以跨越幾個PGM數據報。 這個數據流由zmq_tcp(7)中描述的封裝在幀中的ZMQ消息組成。
2.5.1 Pgm數據報有效載荷
以下ABNF語法表示由ZMQ使用的單個PGM數據報的有效負載:
datagram = (offset data)
offset = 2OCTET
data = *OCTET
為了延遲加入消費者能夠識別消息邊界,每個PGM數據報有效載荷以網絡字節順序中的16位無符號整數開始,指定數據報中第一個消息幀的偏移或者如果數據報包含值0xFFFF 僅包含較大消息的中間部分。
請注意,偏移指定了第一條消息的開始位置,而不是第一條消息部分。 因此,如果在數據包的開頭有尾隨消息部分,則偏移將忽略它們並指向數據包中的第一個初始消息部分。
下圖說明了單個PGM數據報有效載荷的布局:
+------------------+----------------------+
| offset (16 bits) | data |
+------------------+----------------------+
下圖進一步說明了三個示例ZMQ幀在連續的PGM數據報載荷中的布局:
第一個數據報有效載荷
+--------------+-------------+---------------------+
| Frame offset | Frame 1 | Frame 2, part 1 |
| 0x0000 | (Message 1) | (Message 2, part 1) |
+--------------+-------------+---------------------+
第二個數據報有效載荷
+--------------+---------------------+
| Frame offset | Frame 2, part 2 |
| 0xFFFF | (Message 2, part 2) |
+--------------+---------------------+
第三數據報有效載荷
+--------------+----------------------------+-------------+
| Frame offset | Frame 2, final 8 bytes | Frame 3 |
| 0x0008 | (Message 2, final 8 bytes) | (Message 3) |
+--------------+----------------------------+-------------+
3、本地進程間通信傳輸:zmq_ipc(7)
3.1 名稱
zmq_ipc - ZMQ本地進程間通信傳輸
3.2 概要
進程間傳輸使用依賴於系統的IPC機制在本地進程之間傳遞消息。
注:進程間傳輸目前僅在提供UNIX域套接字的操作系統上實現。
3.3 解決
ZMQ端點是一個由transport://后跟一個地址組成的字符串。 transport指定要使用的基礎協議。
該地址指定要連接的傳輸特定地址。對於進程間傳輸,傳輸是ipc,地址部分的含義在下面定義。
3.3.1 綁定一個套接字
使用帶有ipc傳輸的zmq_bind()將套接字綁定到本地地址時,端點應被解釋為識別要創建的路徑名的任意字符串。 路徑名在ipc實現使用的操作系統名稱空間內必須是唯一的,並且必須滿足操作系統對路徑名格式和長度的任何限制。
當地址是*時,zmq_bind()應該生成一個唯一的臨時路徑名。 調用者應該使用ZMQ_LAST_ENDPOINT套接字選項來檢索此路徑名。 有關詳細信息,請參閱zmq_getsockopt(3)。
任何現有的綁定到同一端點都應被覆蓋。 也就是說,如果第二個進程綁定到已經被進程綁定的端點,則這將成功,第一個進程將失去綁定。 在這種行為中,ipc傳輸與tcp或inproc傳輸不一致。
該進程必須能夠寫入端點路徑名。 當端點以/,例如,ipc:///路徑名開始時,這將是絕對路徑名。 如果端點指定了一個不存在的目錄,綁定將失敗。
僅在Linux上,當端點路徑名以@開頭時,應使用抽象名稱空間。 抽象名稱空間獨立於文件系統,如果一個進程試圖綁定已經被進程綁定的端點,它將會失敗。 有關詳細信息,請參閱unix(7)。
IPC路徑名的最大大小取決於操作系統。 在Linux上,最多113個字符,包括“ipc://”前綴(真實路徑名稱為107個字符)。
3.3.2 從套接字解除通配符地址
當在zmq_bind()中使用通配符*端點時,調用者應使用從ZMQ_LAST_ENDPOINT套接字選項中獲得的實際endpoind使用zmq_unbind()從套接字解除綁定此端點。
3.3.3 連接一個套接字
當使用帶有ipc傳輸的zmq_connect()將套接字連接到對等地址時,端點應被解釋為識別要連接的路徑名的任意字符串。 路徑名必須先在操作系統名稱空間內創建,方法是將其分配給帶有zmq_bind()的套接字。
4、本地進程內(線程間)通信傳輸:zmq_inproc(7)
4.1 名稱
zmq_inproc - ZMQ本地進程內(線程間)通信傳輸
4.2 概要
進程內傳輸直接在共享單個ZMQ上下文的線程之間通過內存傳遞消息。
注:使用inproc傳輸傳遞消息時不涉及I / O線程。 因此,如果您正在使用ZMQ上下文進行進程內消息傳遞,則只需使用零I / O線程即可初始化上下文。 有關詳細信息,請參閱zmq_init(3)。
4.3 解決
ZMQ端點是一個由transport://后跟一個地址組成的字符串。 transport指定要使用的基礎協議。 該地址指定要連接的傳輸特定地址。
對於進行中的運輸,運輸是不合理的,地址部分的含義在下面定義。
4.3.1 將本地地址分配給套接字
當使用帶inproc傳輸的zmq_bind()將本地地址分配給套接字時,端點應被解釋為識別要創建的名稱的任意字符串。 該名稱在與套接字關聯的ZMQ上下文中必須是唯一的,長度最多可達256個字符。 名稱的格式沒有其他限制。
4.3.2 連接一個套接字
當使用帶inproc傳輸的zmq_connect()將套接字連接到對等地址時,端點將被解釋為識別要連接的名稱的任意字符串。 該名稱必須先通過將其分配給與所連接的套接字相同的ZMQ上下文中的至少一個套接字來創建。
5、集群IPC協議:zmq_tipc
5.1 名稱
zmq_tipc - 使用TIPC的ZMQ單播傳輸
5.2 概要
TIPC是一種采用位置透明尋址方案的集群IPC協議。
5.3 解決
ZMQ端點是一個由transport://后跟一個地址組成的字符串。 transport指定要使用的基礎協議。 該地址指定要連接的傳輸特定地址。
對於TIPC運輸,運輸是tipc,地址部分的含義如下定義。
5.3.1 將端口名稱分配給套接字
使用_zmq_bind()_與'tipc'分配端口名稱給套接字時
運輸,'端點'的定義形式如下:
{type,lower,upper}
*類型是您的服務的數字(u32)ID。
* Lower和Upper為您的服務指定一個范圍。
發布具有重疊的較低/較高ID的相同服務的意願
導致連接請求以循環方式分配到這些請求上方式。
5.3.2 連接一個套接字
當使用帶tipc傳輸的zmq_connect()將套接字連接到對等地址時,端點將被解釋為服務ID,后跟逗號和實例ID。
實例ID必須位於發布的端口名稱的較低/較高范圍內,以使端點有效。