Предположим, что я определил свой собственный протокол уровня приложений поверх TCP для мгновенных сообщений. Я использовал структуру пакетов для сообщений. Поскольку я использую симметричное (AES) и асимметричное (RSA) шифрование, я получаю другой размер пакета для разных типов сообщений. Теперь на мои вопросы.протокол прикладного уровня - разный размер пакетов
Как читать из сокета, что я получаю один пакет прикладного уровня? Какой размер следует указывать?
Заранее спасибо.
У меня есть два подхода в виду.
чтение из TCP поток фиксированного количества байт, который представляет фактический размер пакета , и, наконец, перечитать из потока прежней собранной размер байт.
Прочитайте максимальный размер пакета из потока. Проверьте фактический размер полученных байтов и определите, какой тип сообщения он был.
Теперь более общий вопрос. Должен ли я предоставлять метаданные, такие как размер пакета, метод шифрования, приемник, отправитель и т. Д.? Если да, должен ли я также шифровать эти метаданные?
Но для пояснения, распространено ли отправлять размер пакета в виде метаданных заранее и разделять на фактическую полезную нагрузку, а не передавать только полезную нагрузку? – auermich
Если ваши пакеты имеют переменный размер (и многие делают), то да, отправка размера пакета (как некоторого значения фиксированной длины) в качестве «префикса» довольно распространена. _E.g._ "читать первые 4 байта в виде числа с байтовым номером, указывающего длину следующего пакета", затем "читать количество байтов", а затем "декодировать/анализировать пакет". –
Castaglia
Если вы получаете меньше байтов, чем ожидалось, или информация заголовка неверна, предложите ли вы запустить тайм-аут (на стороне клиента) или, скорее, отправить явное сообщение об ошибке с сервера на клиент?Спасибо за вашу помощь. – auermich