【问题标题】:How are sockets sending data through packets in erlang?套接字如何通过erlang中的数据包发送数据?
【发布时间】:2015-06-11 10:39:05
【问题描述】:

所以我正在阅读以试图找到有关套接字的更多信息,但我发现文档类型在重复,而没有进一步详细说明套接字发送数据的方式:

那么{packet, N} 在选项中指定这个时(打开套接字时)会做什么?它是在数据之前包含 N 个字节的标头还是将消息分成 N 个数据包?或者它是否在消息最终被分解的所有数据包中都包含 N 的标头?

我正在阅读 Joe Armstrong 的《并发世界的软件》,我发现了这一段:

“数据包”一词是指应用程序请求或响应消息的长度,而不是在线路上看到的物理数据包。

我无法理解这句话的含义。 packet seen on the wire 是什么意思。

我尝试查看文档,但发现很少提及该选项的作用。我发现的简短解释是它在消息前加上 N 标头,但是我还在作为示例编写的代码中找到了此注释:

           %% Usually, it's a good idea to give up in case of a 
           %% send timeout, as you never know how much actually 
           %% reached the server, maybe only a packet header?!

因此,消息被分成几部分(我猜是一个随机数?),并且每一个都带有一个 N 字节的标头。

我的问题是{header, N} 选项如何影响数据的发送方式。

【问题讨论】:

    标签: sockets erlang


    【解决方案1】:

    您引用的 Joe 书中的摘录提到了这样一个事实,即应用程序通常完全不知道网络如何安排数据进行传输。根据使用的网络类型、配置和协议,通过它发送的数据块的大小会有所不同,并且将使用不同的元数据进行框架化。应用程序通常看不到原始数据包、帧信息,或者有时原始数据包会由于导致它们被丢弃或损坏的问题而重新传输。

    您的问题提到了两个选项:{packet, N}{header, N}。它们彼此完全不同。

    • {packet, N} 选项允许 N 为 1、2 或 4。它将N 字节的标头附加到消息的前面。标头按网络顺序指定消息的长度,即消息中的字节数。

      如果你发送一个由X字节组成的消息,Erlang会在数据N字节前面加上X的网络顺序值,然后发送整个消息。假设接收器也配置了相同的{packet, N} 选项,它将读取N-byte 标头以确定预期的字节数,等待接收那么多字节,然后传递这些字节,没有长度标头, 到接收应用程序。底层网络软件和硬件如何将数据分解成块以便在网络上传输是对您的应用程序隐藏的独立问题。

    • {header, Size} 选项将消息以Size 字节列表的形式传递给接收者,然后是二进制数据的其余部分。仅当binary 选项对套接字有效时,此选项才有意义。

    【讨论】:

    • 那么,指定{packet, 4} 只是为整个 X 字节的消息(而不是消息被分解成的任意数量的小数据包)添加一个标头,指定它的大小?
    • {packet, 4} 将一个 4 字节大端(即网络顺序)整数保存值 X 到数据的前面。然后发送整个消息。 Erlang 不会向底层网络可能创建的用于传输消息的任意块添加大小标头。
    猜你喜欢
    • 2018-05-23
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2019-04-26
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多