java - 确定 TLS 数据包 Java/Android 的数据包大小

标签 java android ssl tcp

我已经阅读了 Stack 的所有内容,但我找不到一个可行的解决方案来确定数据包大小并设置字节数组以匹配该长度以一次为一条消息接收正确数量的字节。

DataInputStream in = new DataInputStream(socket.getInputStream());
while(true) {
    short myShortStreamSize = in.readShort();
    byte[] payload = new byte[myShortStreamSize];
    in.readFully(payload);
    Log.i("Foo", new String(payload));
}

That对我不起作用。

我的 TLS 服务器是用 Node.js 制作的。通常 Node.js TLS 模块处理数据包的方式是,如果我使用相同的模块连接到服务器,它足以使用 socket.write("message") 并且 Node.js 客户端理解尺寸已经有了,所以你不需要自己定义它。它将将该消息毫无问题地写入控制台。正如我提到的,我的服务器是 TLS。我不确定这些是否与我的问题有关,但让它起作用会很棒。

我的目标是一次接收一条消息,而不是将其分成几 block 。如果我发送“早上好,今天是个晴天!”我希望我的 Java/Android 客户端从头到尾读取它,而不会将其与其他数据包混淆。

最佳答案

... size of TLS packet ... determine the packet size ... receive one message at once

没有“TLS 数据包”。有一个 TLS 记录,其长度在前 2 个字节中。该 TLS 记录可能被拆分为多个 TCP fragment ,或者 TCP fragment 也可能包含多个完整、一半或其他类型的 TLS 记录。这些 TCP fragment 甚至可能被切割成多个 IP 数据包,尽管 TCP 努力避免这种情况。

并且您的纯文本“消息”本身可能最终会分布在多个 TLS 记录中,因为此类记录的大小可能小于消息。根据您的应用程序和 TLS 堆栈,它也可能与其他“消息”混合在一起。

换句话说:你想要的是不可能的。除非您在阅读消息之前以某种方式知道消息的大小,否则您不能依赖于阅读完整消息和仅阅读此消息。 TCP 和 TLS 都不会保留您在编写写入时可能想象的任何消息“边界”,但在有效负载中没有实际表示。

关于java - 确定 TLS 数据包 Java/Android 的数据包大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59189045/

相关文章:

机器人 : scaling bitmap to fit imageview

java - 如何在 Java 中创建自定义 JsonDeserializer?

java - JPA/Hibernate : How to scan particular package in Persistence. xml 代替给出单个实体名称?

java - 为什么我制作的 Basic Java Hex Editor 会卡住大约 2MB 大小或更大的文件?

android - 有没有自动化测试工具来测试android apk?

ssl - 证书生成

java - 我如何知道服务器使用 Java 提供的默认密码套件

android - 如何使用Xamarin在android上找到当前显示的 fragment

laravel - 错误 : OpenSSL SSL_read: SSL_ERROR_SYSCALL, 错误号 10054

ssl - 如何像浏览器一样使用openssl验证证书?