参考文献:
官方CA协议说明 https://epics.anl.gov/base/R3-16/1-docs/CAproto/index.html#_messages(本翻译的原文)
消息结构
所有通道访问消息都由头部和其后跟着的有效负载组成。
标题始终存在。命令ID和有效负载大小字段具有固定含义。其他头字段带有特定某个命令的含义。如果某个消息中未使用某个字段,则其值必须为零。
单个消息的总大小是有限的。对于4.9版本以前的CA协议,最大消息大小限制为16384(0x4000)字节。其中,头部的固定大小为16(0x10)字节,有效负载的最大大小为16368(0x3ff0)字节。
CA_V49及更高版本可以使用扩展消息形式,这允许消息具有更大的有效负载。扩展消息表单由头部字段Payload Size和Data Count分别设置为0xffff和0来指示。然后,实际有效负载大小和数据计数将作为紧随头部之后的UINT32类型值给出。最大消息大小受32位无符号整数表示限制,4294967295(0xffffffff)。最大有效负载大小限制为4294967255(0xffffffe7)。
为了兼容性,仅当有效负载大小超过4.9以前版本的CA协议限制的16368字节消息大小时,才应使用扩展消息表单。
头部Header

头部字段的名称基于它们最常见的用途。 出于消息自己特定目的,某些消息将使用图1两个表中描述以外的字段。 每个消息单独记录这些变化。 头部所有的值都是无符号整数。
通用的头部字段如下表3:

有效负载
有效负载的结构取决于消息的类型。 有效负载的大小与头部字段Payload Size的值匹配。
消息的有效负载必须填充到8字节倍数的长度。 推荐使用零填充。
消息标识符
消息中的某些字段用作标识符。 这些字段在电路(TCP连接)的上下文中用作标识令牌。 用于分配这些值的推荐方案是从0开始按顺序创建它们。所有ID都用UINT32表示。
必须处理所有标识符的溢出! 长时间运行的应用程序可能使用某种 用超过2位的UINT32数据表示的 标识符类型(通常为IOID)。【原文为A long running applications might use more than 2**32 of some identifier type type (typically IOID). 我认为此处的2**32可能是打错了,应该是2 UINT32。如果是我理解错误,欢迎指正!】
CID - Client ID
CID是一个通道的客户端标识。一个CID必须唯一对应单个电路。
客户端绝不可以发送请求给一个没有与打开的通道(active Channel)关联的CID。
服务器必须忽略任何一个不含有 未关闭电路的打开通道(active Channel)的CID 的请求。也就是说,如果某个请求的CID关联的通道不是active状态,或者这个CID关联的通道所在的电路是关闭的,那么服务器就必须忽略这个请求。
CID存在于CA_PROTO_ERROR、CA_PROTO_CREATE_CHAN、CA_PROTO_ACCESS_RIGHTS、CA_PROTO_CREATE_CH_FAIL和CA_PROTO_SERVER_DISCONN消息的参数1字段中。也存在于CA_PROTO_CLEAR_CHANNEL消息的参数2字段中。
【自己的理解:客户端发送的请求带有CID标识,这个标识是给服务器看的,这个请求是由服务器接收的。】
SID - Server ID
SID是一个通道的服务器标识。一个SID必须唯一对应单个电路。
服务器绝不可以向一个 没有与打开通道(active Channel)关联的SID 发送请求。
客户端必须忽略任何一个不含有 未关闭电路的打开通道(active Channel)的SID 的请求。也就是说,如果某个请求的SID关联的通道不是active状态,或者这个SID关联的通道所在的电路是关闭的,那么客户的就必须忽略这个请求。
SID存在于CA_PROTO_EVENT_ADD, CA_PROTO_EVENT_CANCEL, CA_PROTO_READ_NOTIFY, CA_PROTO_WRITE_NOTIFY, CA_PROTO_WRITE, CA_PROTO_CLEAR_CHANNEL和CA_PROTO_CREATE_CHAN (仅针对于回复消息)消息的参数1字段。
【自己的理解:服务器发送的请求带有SID标识,这个标识是给客户端看的,这个请求是由服务器接收的。】
订阅ID - Subscription ID
订阅ID是用于订阅的客户端标识。一个CID标识必须唯一对应单个电路。
订阅ID存在于CA_PROTO_EVENT_ADD 和 CA_PROTO_EVENT_CANCEL消息的参数2。
IOID
IOID是Get或Put操作的客户端标识符。一个IOID必须唯一对应一个电路上的一个消息类型。
虽然不推荐,但是在CA_PROTO_WRITE, CA_PROTO_READ_NOTIFY 和 CA_PROTO_WRITE_NOTIFY请求中同时使用相同的IOID是允许的。
IOID存在于CA_PROTO_READ_NOTIFY, CA_PROTO_WRITE_NOTIFY 和 CA_PROTO_WRITE消息的参数2字段中。
搜索ID
搜索ID是用于PV名称搜索的客户端标识。一个搜索ID必须唯一对应一个发送请求的客户端终端。
由UDP的特性决定,复制数据包是可能的。具有相同SearchID的多个CA_PROTO_SEARCH消息可以被认为是重复的,并且只使用了一个。