usng libpcap для реализации tcp listen()

У меня есть исследовательская работа, которая требует модификации tcp, и я хочу реализовать свою версию функции TCP listen(). Моя идея состоит в том, чтобы использовать libpcap для захвата всех пакетов TCP SYN с определенного порта, а затем использовать необработанный сокет для создания/отправки SYN/ACK и следующие пакеты ACK

мои вопросы

  1. как реализован традиционный/обычный стек TCP listen(), может ли кто-нибудь кратко описать механизм?
  2. моя идея реализуема? есть какие-то хитрости/барьеры?
  3. есть ли другие библиотеки/исходные фрагменты, которые я могу использовать, чтобы понять, что мне нужно?

Благодарность!


person misteryes    schedule 12.04.2013    source источник


Ответы (2)


Если вы хотите знать, как реализован listen(), вам следует просто посмотреть исходный код реализации в свободной операционной системе, но в основном его задача состоит в том, чтобы установить флаг в структуре данных ядра, связанный с сокетом, чтобы будущие входящие SYN пакеты получат ответ SYN|ACK (и настроить, сколько таких SYN должно ответить, прежде чем приложение истощит их из очереди, используя accept()).

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

Одна вещь, которая вам понадобится, — это правила брандмауэра, чтобы ядро ​​не отвечало на входящие TCP-пакеты, чтобы ваш код мог вместо этого отвечать на них.

person Celada    schedule 12.04.2013
comment
Я до сих пор не понимаю, как устроена функция listen() стека tcp, не могли бы вы рассказать об этом немного подробнее, спасибо! - person misteryes; 12.04.2013
comment
Вы не найдете более подробной информации, чем эта: lxr.linux.no/#linux+v3.8.7/net/ipv4/af_inet.c#L192 - person Celada; 13.04.2013

Вы не можете этого сделать. Libpcap не дает вам способа остановить дальнейшую обработку пакетов, поэтому каждый пакет будет по-прежнему обрабатываться остальной частью стека TCP/IP. Таким образом, SYN будут подтверждены, ACK на SYN/ACKS создадут TCP-соединения, FIN завершат их и т. д. и т. д.

person user207421    schedule 12.04.2013
comment
Вы вполне могли это сделать. Все, что вам нужно сделать, чтобы предотвратить генерацию пакетов стеком tcp/ip, — это не настраивать его, то есть оставить интерфейс включенным, но не настроенным. Это означает, что вам придется реализовать любую функциональность стека tcp/ip самостоятельно. - person Iron Savior; 14.05.2013