应用层协议 - 不同大小的数据包

application layer protocol - different size of packets

假设我已经在 TCP 之上为即时消息定义了自己的应用层协议。我为消息使用了数据包结构。由于我使用对称 (AES) 和非对称 (RSA) 加密,因此我获得了不同的 不同消息类型的数据包大小。现在回答我的问题。

如何从套接字中读取我收到的是单个应用层数据包? 我应该指定什么尺寸?

提前致谢。

我有两种方法。

  1. 从 TCP 流中读取固定数量的字节,表示 实际数据包大小,最后从流中重新读取之前收集的字节大小。

  2. 从流中读取最大数据包大小。验证实际大小 获取字节并决定它是哪种消息类型。

现在,一个更笼统的问题。我应该提供数据包大小、加密方法、接收方、发送方等元数据吗?如果是,我是否也应该加密这些元数据?

请记住,使用 TCP,当从网络读取时,无法保证在那个时间点接收到的字节数。也就是说,客户端可能会在其 write() 中发送完整的数据包,但 并不意味着您的 read() 将接收相同数量的字节。因此,您的代码将始终需要从网络读取 some 字节数,然后(根据累积数据)验证您是否收到了必要的字节数,然后您可以验证来自那里的数据包(类型,内容,)。

一些应用程序使用状态机 encoders/decoders 和固定大小的缓冲区 reading/writing 它们的网络数据;其他应用程序为 "full packet" 动态分配足够大的缓冲区,然后继续从网络读取字节,直到 "full packet" 缓冲区已满。您采用哪种方法取决于您的应用程序。因此,您用于读取的大小并不像您的代码如何确保它已收到完整数据包那么重要。

至于你是否应该加密额外的元数据,这在很大程度上取决于你的威胁模型(你的协议想要防范什么威胁,你的协议需要提供什么保证到它的clients/users)。没有更多 context/details.

就没有简单的方法来回答这个问题

希望对您有所帮助!