0

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

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

提前致谢。

我有两种方法。

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

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

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

4

1 回答 1

0

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

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

至于你是否应该加密额外的元数据,这在很大程度上取决于你的威胁模型(你的协议想要防范什么威胁,你的协议需要向其客户/用户提供什么保证)。如果没有更多上下文/细节,就没有简单的方法来回答这个问题。

希望这可以帮助!

于 2016-05-04T15:31:21.057 回答