Чтение заголовка TCP и управление соединением TCP с помощью RAW_SOCKET - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь получить заголовок TCP TCP-соединения в C ++ 11.Читая уже существующие вопросы StackOverflow ( здесь , здесь , здесь и здесь ) кажется, что мне нужно открыть RAW_SOCKETили написать модуль ядра Linux (LKM) для доступа к нему.

Из того, что я понял, открытие необработанного сокета означает обработку всего протокола TCP (рукопожатие, размер окна и т. д.),Есть ли способ получить заголовок TCP и позволить ядру управлять протоколом TCP («вручную» или с какой-то платформой)?

Я знаю, что мог бы использовать libpcap для захвата пакетов, но это означало быдля моего приложения сопоставление входящего пакета в сокете TCP и полученного пакета из libpcap.Хотя это возможное решение, оно было бы громоздким (и я бы не хотел этого делать).

Любая помощь приветствуется, спасибо!

1 Ответ

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

«Быстрый и грязный» подход может заключаться в использовании двух подключений: внешнего подключения к удаленному хосту и чисто внутреннего.Конечно, это не самый эффективный подход, но его легко (и быстро) реализовать (основная особенность «решений» QAD ...):

socket ext_raw  ------- socket remote, TCP (likely, at least)
socket int_raw  ---
                   |    (loop back connection)
socket int_tcp  ---

Любые входящие сообщения на ext_raw и int_raw просто пересылаются от одного к другому (в то время как входящие сообщения на ext_raw могут проверяться на наличие заголовков TCP), тогда как вся обычная обработка TCP выполняется внутренним сокетом TCP.Таким образом, вы будете туннелировать TCP-соединение через два необработанных сокета ...

...