套接字如何通过erlang中的数据包发送数据?

How are sockets sending data through packets in erlang?

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

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

我在阅读 Joe Armstrong 的 Software for a concurrent world 时发现了这一段:

The word packet refers to the length of an application request or response message, not to the physical packet seen on the wire.

我不明白这是什么意思。 packet seen on the wire是什么意思。

我试图查看文档,但发现很少提及该选项的作用。我发现的简短解释是它在消息前面加上 N header 但是我还在作为示例编写的代码中找到了这条评论:

           %% 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。

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

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

您的问题提到了两个选项:{packet, N}{header, N}。这些是完全不同的。

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

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

  • {header, Size} 选项将消息作为 Size 字节列表后跟二进制数据的其余部分传递给接收方。此选项仅在 binary 选项对套接字有效时才有意义。