Я новичок в сетях и, в частности, TCP (я немного обманывал UDP, но это все). Я разрабатываю простой протокол, основанный на обмене сообщениями между двумя конечными точками. Эти сообщения должны быть сертифицированы, поэтому я реализовал криптографический уровень, который позаботится об этом. Однако, хотя UDP имеет звуковое определение пакета, который составляет минимальную единицу, которая может быть передана за один раз, протокол TCP (насколько я понимаю) полностью ориентирован на поток.Разметка сообщений в TCP-связи
Теперь это меня немного озадачивает. Как обмениваться сообщениями, как я могу сказать, где начать, а другой заканчивается? В принципе, я могу, очевидно, передавать сообщения фиксированной длины или сначала сообщать размер каждого сообщения в каком-то заголовке. Тем не менее, это может быть подвергнуто атакам: хотя, конечно, невозможно будет исказить или определить содержание сообщения, вышеупомянутая техника упростит полное разрушение моего общения, просто добавив один байт посередине.
Скажите, что мне нужно передать сообщение длиной 1234567 байт. Прежде всего, я связываю 4 байта с целым числом, представляющим размер сообщения. Хорошо. Затем я отправляю сообщение. Это сообщение делится на несколько пакетов, которые получают отдельно. Теперь злоумышленник просто отправляет в дополнительный пакет, подделывая его так, как если бы он был частью разговора. Это может быть только один байт: это полностью разрушает любой механизм синхронизации, который я реализовал! Сообщение имеет ложный байт в середине, и он не будет успешно декодироваться. Кроме того, последний байт первого сообщения нарушает выравнивание второго сообщения и т. Д.: Соединение разрушается и с простой, простой атакой! Насколько вероятна и возможна эта атака?
Так что мне интересно: какой максимальный блок данных может быть передан сразу? Я понимаю, что вызов на вызов не соответствует вызову для приема: сообщение можно разделить на разные куски. Как сгруппировать пакеты каким-то образом, чтобы я знал, что они собираются вместе? Есть ли способ определить сообщение более высокого уровня, которое восстанавливается и выравнивается вместе и запускает один вызов функции приема? Если нет, то какие другие решения я могу найти, чтобы поддерживать связь между собой даже в присутствии злоумышленника?
http://www.ietf.org/rfc/rfc2385.txt весьма уместен для того, что вы описываете. (И несколько операционных систем поддерживают сигнатуры TCP-MD5, обычно включаемые с некоторыми вызовами setsockopt()) – nos
1) TCP имеет порядковые номера; вы не можете * впрыснуть * несколько байтов в поток без обмена сообщениями. 2) Нет сообщений bounderies; вам придется реализовать свои собственные bounderies в протоколе уровня приложения, либо используя сообщения фиксированной длины, либо путем префикса * сообщений * заголовком (что ожидать) или путем их разметки * концом сообщения *, например '\ n'. – wildplasser
@wildplasser Фактически вы _probably_ можете вставлять несколько байтов в поток, так как активный злоумышленник MITM также может модифицировать SEQ/ACK.И для определенных сетевых стеков это еще проще из-за их (неправильной) обработки [внеполосных данных] (https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Out-of-band_data). – vlp