- ZeroMQ 教程
- ZeroMQ - 首页
- ZeroMQ - 概述
- ZeroMQ - 安装
- ZeroMQ - 特性
- ZeroMQ 消息传递
- ZeroMQ - 套接字类型
- ZeroMQ - 通信模式
- ZeroMQ - 传输协议
- ZeroMQ - 消息帧
- 扩展性和性能
- ZeroMQ - 负载均衡
- ZeroMQ - SMP
- ZeroMQ - 多线程
- ZeroMQ - 性能注意事项
- ZeroMQ 有用资源
- ZeroMQ - 有用资源
- ZeroMQ - 讨论
ZeroMQ - 传输协议
ZeroMQ 中的传输协议称为 ZeroMQ 消息传输协议 (ZMTP)。它是一个传输层协议,用于在两个主机之间通过已连接的传输层(如传输控制协议 (TCP))交换消息。
TCP 是互联网协议套件中的主要协议,通常称为 TCP/IP。TCP 允许我们使用两个主机或设备进行连接和交换数据流。
以下是 ZMTP 的一些关键特性
- 安全性:ZMTP 支持可扩展的安全机制。对等体通过交换数据并保持或关闭连接来协商安全机制和版本。
- 向后兼容性:ZMTP 定义了向后兼容性的规则。
- 命令和消息帧:ZMTP 定义了命令和消息帧的规则。
- 连接元数据:ZMTP 定义了连接元数据的规则。
ZeroMQ 支持多种传输协议来管理端点之间的消息交换。以下是 ZeroMQ 中使用的主要传输协议
TCP(传输控制协议)
它是最可靠的面向连接的协议,可确保所有消息按正确的顺序传递,不会重复。当进程通过网络进行通信时,通常使用此协议,无论是在同一台机器上还是在不同的机器上。
绑定示例(服务器)
// Bind to all available network interfaces on port 5555
socket.bind("tcp://*:5555")
连接示例(客户端)
// Connect to a remote server on the specified IP and port
socket.connect("tcp://192.168.0.1:5555")
优势
以下是 ZeroMQ 中使用 TCP 的优势:
- 它在所有平台和设备上得到广泛支持。
- 它具有可靠的消息传递功能。
- 它确保消息按顺序接收。
劣势
以下是 ZeroMQ 中使用 TCP 的劣势:
- 与其他协议(如进程间通信 (IPC))相比,它的延迟更高。
- 它还会因错误检查、流量控制和确认数据包而产生更多开销。
IPC(进程间通信)
IPC 允许同一台机器上的不同进程之间进行通信。它优于 TCP,因为它通过在操作系统级别直接运行来避免网络堆栈开销。
绑定示例(服务器)
// Bind to a local file-based endpoint
socket.bind("ipc:///tmp/zeromq-ipc")
连接示例(客户端)
// Connect to a local endpoint on the same machine
socket.connect("ipc:///tmp/zeromq-ipc")
优势
以下是 ZeroMQ 中使用 IPC 的优势:
- 它比基于网络的协议(如 TCP)快得多。
- 由于它在同一台机器上工作,因此没有网络延迟。
- 它非常适合同一应用程序中不同进程之间的通信,或同一服务器上的微服务之间的通信。
劣势
以下是 ZeroMQ 中使用 IPC 的劣势:
- 它仅限于同一台机器上的进程之间的通信。
- 它不能用于不同机器之间的通信
Inproc(进程内)
Inproc 用于同一进程内的线程之间的通信。它是速度最快的 ZeroMQ 传输,因为它避免了进程间通信,仅依赖于同一应用程序内的内存传输。
绑定示例(线程 1)
// Bind to an in-process endpoint
socket.bind("inproc://some-endpoint")
连接示例(线程 2)
// Connect to the in-process endpoint from another thread
socket.connect("inproc://some-endpoint")
优势
以下是 ZeroMQ 中使用 Inproc 的优势:
- 它是速度最快的传输,因为它不涉及任何网络或进程限制。
- 它支持同一应用程序内线程之间的通信。
劣势
以下是 ZeroMQ 中使用 Inproc 的劣势:
- 它不适用于不同进程之间的通信或跨网络的通信。
- 它仅限于单个进程内的线程间通信。
PGM/EPGM
PGM/EPGM(实用通用多播/封装实用通用多播)用于需要可靠多播传递的应用程序,例如实时数据传递或实时流媒体。这些协议支持多播通信,其中发送方同时向多个接收方发送消息。
PGM:这是本机多播,需要网络层支持。并非所有网络基础设施都提供它。
EPGM:ZeroMQ 将 PGM 封装在 UDP 上(封装),允许多播在不直接支持 PGM 的网络上工作。
绑定示例(服务器)
// Bind to a multicast address and port
socket.bind("epgm://eth0;239.192.1.1:5555")
连接示例(客户端)
// Connect to the multi-cast group
socket.connect("epgm://239.192.1.1:5555")
优势
以下是 ZeroMQ 中使用 PGM/EPGM 的优势:
- 对于一条消息需要到达多个客户端(例如,股票行情更新、实时体育比分)的场景,它非常有效。
- 它通过向多个订阅者发送一条消息来最大限度地减少网络带宽。
劣势
以下是 ZeroMQ 中使用 PGM/EPGM 的劣势:
- 它比基于单播的协议(如 TCP)更复杂。
- PGM 的支持范围不广,可能需要特殊的网络配置。
UDP(用户数据报协议)
UDP 是一种无连接且不可靠的协议,它可能比 TCP 快,但不能保证消息传递或排序。虽然 ZeroMQ 不直接支持原始 UDP 作为传输(不像 TCP),但可以通过 PGM 或其他协议间接使用它。
TIPC(透明进程间通信)
TIPC 是一种传输协议,旨在在集群中的节点之间进行高效通信。它存在于 Linux 操作系统中,并且针对机器集群内的高速进程间通信进行了优化。
绑定示例(服务器)
// Bind to a TIPC service and instance
socket.bind("tipc://{service,instance}")
连接示例(客户端)
// Connect to a TIPC service on the cluster
socket.connect("tipc://{service,instance}")
优势
UDP 适用于集群环境中的通信和高速传输设计,尤其适用于 Linux 集群。
劣势
以下是 ZeroMQ 中使用 UDP 的劣势:
- 它仅限于支持 TIPC 的 Linux 环境。
- 它可能需要额外的网络设置才能有效使用。
总之,每种协议都有其优缺点,您的选择将取决于系统的架构、性能要求以及应用程序处理的环境。