本 EEP 描述了 gen_tcp
使用的新的基本数据包选项,这些选项也存在于 erlang:decode_packet
中,并且相同。
当前在 erlang:decode_packet
中使用的数据包选项涵盖了一系列数据包类型。基本类型是 {packet,0}
、{packet,1}
、{packet,2}
和 {packet,4}
。从 gen_tcp
发出的出站流量中,这些选项会在数据包前面加上 N
个额外的字节,其中包含一个大端格式的整数,表示数据的大小。
当与由其他方实现的端点通信时,并不总是可以建议数据包长度以大端格式存在或为 4 个字节。如今,随着 64 位机器的出现,我们甚至可能很快会发现协议发送普通的、机器相关的 64 位字作为数据包长度描述符。
本 EEP 建议将数据包字节扩展到 0-8 的范围。请注意,内部最大数据包大小不受本 EEP 的影响,仅影响数据包大小指示符的格式。
此外,建议使用负范围来表示小端格式的大小指示符,范围为 -1 .. -8。{packet,-1}
等效于 {packet,1}
。因此,前缀的数据包字节数为 abs(PBytes)
,其中 PBytes
的范围为 -8 .. 8。
本 EEP 还建议一种固定大小的数据包模式,表示为 {packet, {size,N}}
。这种模式在数据包字节方面与 {packet,0}
非常相似,不使用任何数据包字节。区别在于,在 {active,true}
或 {active,once}
模式下,当 {packet,0}
收集任何可用数据时,{packet,{size,N}}
模式会精确收集 N
个字节,然后将其传递给“所有者”进程。建议实现的 N
的最小限制为无符号 16 位,导致最小尺寸为 1,最大尺寸为 65535。小于 1 的数据包大小应始终导致 badarg 错误。
本 EEP 建议的数据包类型为
{packet,P}
对于范围为 -8 .. 8 的整数 P
。这是对现有整数数据包类型的扩展。
{packet,{size,N}}
N
的范围为 > 0,最大 N
取决于实现,但永远不小于 65535。
本 EEP 的作者已在 Erlang/OTP 标准 git 版本中实现了此提案,并且没有发现任何向后兼容性问题。受此提案实现影响的文件是:inet_drv.c
、packet_parser.c
、packet_parser.h
和 erl_bif_port.c
。
本文档已置于公共领域。