簡體   English   中英

確定 TLS 數據包 Java/Android 的數據包大小

[英]Determine packet size of TLS packet Java/Android

我已經閱讀了堆棧的所有內容,但是我找不到確定數據包大小並設置字節數組以匹配該長度以一次接收一條消息的正確字節數的有效解決方案。

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));
}

對我不起作用。

我的 TLS 服務器是用 Node.js 制作的。 通常,Node.js TLS 模塊以這種方式處理數據包,如果我使用相同的模塊連接到服務器,則使用socket.write("message")就足夠了,並且 Node.js 客戶端已經了解大小,因此您不會需要自己定義。 它將將該消息寫入控制台而不會出現問題。 正如我提到的,我的服務器是 TLS。 我不確定這些是否與我的問題有關,但讓它發揮作用會很棒。

我的目標是一次接收一條消息而不將其分割成碎片。 如果我發送“早上好,今天是晴天!” 我希望我的 Java/Android 客戶端從頭到尾讀取它,而不會將它與其他數據包混淆。

... TLS 包的大小 ... 確定包的大小 ... 一次接收一條消息

沒有“TLS 數據包”。 有一個 TLS 記錄,其長度在前 2 個字節中。 此 TLS 記錄可能被拆分為多個 TCP 片段,或者 TCP 片段也可能包含多個完整、一半或其他形式的 TLS 記錄。 這些 TCP 片段甚至可能被切割成多個 IP 數據包,盡管 TCP 努力避免這種情況。

並且您的純文本“消息”本身最終可能會分布在多個 TLS 記錄上,因為此類記錄的大小可能小於消息。 根據您的應用程序和 TLS 堆棧,它也可能與其他“消息”混合在一起。

換句話說:你想要的是不可能的。 除非你在閱讀之前以某種方式知道你的消息的大小,否則你不能依賴閱讀完整的消息,也只能閱讀這條消息。 TCP 和 TLS 都不會保留您在編寫寫入時可能想象的但在有效負載中沒有實際表示的任何消息“邊界”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM