Как протокол записи TLS повторно собирает полученные данные? - PullRequest
0 голосов
/ 23 октября 2018

Я не могу найти подробную информацию о том, как протокол записи TLS может повторно собрать полученные данные.В RFC 5246:

Полученные данные дешифруются, проверяются, распаковываются, повторно собираются , а затем доставляются клиентам более высокого уровня.

НоКАК?Вот как выглядят данные слоя записи:

struct {
    ContentType type;
    ProtocolVersion version;
    uint16 length;
    opaque fragment[TLSPlaintext.length];
} TLSPlaintext;

Поле длины - это только длина фрагмента:

Длина (в байтах) следующего TLSPlaintext.фрагмент

Я ожидаю увидеть полную длину в заголовке протокола записи.Google почти не дает результатов, что заставляет меня чувствовать, что я упускаю что-то очевидное ...

1 Ответ

0 голосов
/ 26 октября 2018

TLS выполняется для потоков, и данные в этих потоках помещаются в один или несколько фрагментов (максимум 2 ^ 14 байтов).Это называется фрагментацией.

Сама спецификация говорит следующее:

Границы клиентских сообщений не сохраняются на уровне записи (т. Е. Несколько клиентских сообщений одного и того же ContentType МОГУТ объединяться водиночная запись TLSPlaintext или отдельное сообщение МОЖЕТ быть фрагментирована по нескольким записям).

, что аналогично тому, как поместить их в поток и затем снова разбить поток на отдельные фрагменты.

Если вы получаете данные через TLS, вам придется воссоздавать этот поток из отдельных фрагментов.Таким образом, происходит «повторная сборка», представляющая собой простое объединение фрагментов в поток.

Сокет содержит поток вывода и ввода.Выходной поток должен быть фрагментирован, а входной поток должен быть повторно собран.

Ничего волшебного не происходит, поэтому, вероятно, вы не можете найти много.


Часто прикладной уровень будет, тем не менее, предоставленотносительно низкоуровневый интерфейс к уровню TLS, который позволит ему обернуть или отправить свои собственные фрагменты.Например, этот API от IBM показывает, что он позволяет пользователю упаковывать и отправлять или получать и развертывать каждое сообщение самостоятельно.В этом случае пользователь библиотеки должен позаботиться о любой фрагментации / повторной сборке сообщения.

Поскольку фактический метод фрагментации / сборки не указан TLS, его следует рассматривать как специфическую для реализации.

...