作者
Tony Rogvall <tony(at)rogvall(dot)se>
状态
草案
类型
标准跟踪
创建
2010年8月31日
Erlang版本
OTP_R14B

EEP 34:扩展 decode_packet 的基本数据包选项 #

摘要 #

本 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.cpacket_parser.cpacket_parser.herl_bif_port.c

版权 #

本文档已置于公共领域。