2016-07-25 2 views
1

Я разбираю файл с большим количеством пакетов tcp, которые мне нужно проанализировать. Проблема в том, что они сегментируются, и я не могу найти никаких признаков, когда и где они это делают. Никакие флаги или что-либо еще не указывают, что середина текущего пакета может содержать начало следующего. Протокол выше tcp - это FIX (используется в онлайн-трейдинге), но я бы хотел, чтобы мой код мог работать с любыми протоколами (или, по крайней мере, понимать, что такое протокол). Я пишу код на C++ и не могу использовать какие-либо дополнительные библиотеки. Итак, как мне определить, что такое протокол выше tcp и где он сегментируется?сборка пакета tcp

+1

Чтобы собрать TCP-потоки, сначала вы должны научиться собирать IP-фрагменты. См. RFC 815. – Alnitak

+0

Неясно, что вы просите. Как были взяты эти данные? – EJP

+0

@ Алнитак Я сомневаюсь, что он захватывает необработанные данные здесь. RFC 815 - это то, что происходит внутри сетевого стека, а не снаружи на уровне пользователя. –

ответ

3

Вы не можете. TCP/IP концептуально является потоком, а не последовательностью сообщений (тот факт, что он в конечном итоге реализован как последовательность пакетов, не имеет значения). Когда вы записываете последовательность байтов в поток TCP/IP, эта последовательность добавляется в поток; это не рассматривается как сообщение, которое должно сохранять свою собственную идентичность. Никакое понятие начала/конца сообщения не передается вместе с потоком, если вы не сделаете это самостоятельно в своем собственном протоколе.

Если вам посчастливилось поверить, подумайте о том, как это работает для файлов: если вы записываете последовательность байтов в файл, эта последовательность не может стать записью, которую вы можете позже идентифицировать и получить. Если вы хотите такую ​​структуру, вы должны добавить ее самостоятельно. То же самое верно для TCP/IP.

Транспортные пакеты, используемые для реализации TCP/IP, не имеют никакого отношения к указанным вами блокам данных с вашими вызовами API; это всего лишь способ реализации потока TCP/IP. Для некоторых случаев использования может показаться, что это отображение, но это случайно.

Единственный способ разделить поток TCP/IP на отдельные сообщения - это знание протокола, работающего поверх TCP/IP. В вашем случае это FIX. Я полагаю, вы знаете, как это работает; вы можете использовать эти знания для правильного разделения данных FIX на свои исходные сообщения. Общий разделитель сообщений TCP/IP не может быть выполнен.

+0

s/packets/message/g, пожалуйста - пакеты проходят через провод в протоколах уровня 2 и уровня 3: сообщения протокола -> поток TCP -> сегменты TCP -> IP-пакеты -> пакеты Ethernet – Alnitak

+0

Я изменил пакет к сообщению, где это необходимо, но поскольку исходный вопрос уже задан о пакетах, я не уверен, что он стал более ясным в результате. –

+0

Благодарим вас за подробный ответ –

-2

Как я вижу, ваша проблема заключается в разделении TCP-пакетов. Для его решения вы можете ретранслировать по длине полезной нагрузки (this answer) и контрольной суммы. Если контрольная сумма верна для данных с указанной длиной, чем ваш пакет является правильным, если нет - вам нужно искать в предыдущей части для начала пакета или удалить эту часть данных. По крайней мере, этот подход поможет вам найти точку, где дада была разделена на сегменты.

Для более точного ответа лучше увидеть небольшую часть данных.

Но основная проблема заключается в сегментации пакетов. Для лучшей производительности вы должны попытаться исключить эту проблему (возможно, смените сетевую карту на Intel).

+0

Добро пожаловать в переполнение стека! Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только вы [заработаете] (http: //meta.stackoverflow.com/q/146472/169503) достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы сможете [комментарий] (http://stackoverflow.com/help/privileges/comment) на любую должность. Если у вас есть связанный, но другой вопрос, задайте новый вопрос (http://stackoverflow.com/questions/ask), ссылаясь на этот вопрос, если он поможет обеспечить контекст. – ddb

+1

Сегментация является частью протокола TCP/IP и не имеет ничего общего с маркой сетевой карты. –

Смежные вопросы