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

时间:2016-05-04 14:37:19

标签: sockets tcp metadata messageformat application-layer

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

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

提前致谢。

我有两种方法。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

至于您是否应加密其他元数据,这在很大程度上取决于您的威胁模型(您的协议需要防范的威胁,保证您的协议需要为其客户/用户提供什么)。没有更多的背景/细节,没有简单的方法来回答这个问题。

希望这有帮助!