Квитирование TCP с сокетом SOCK_RAW

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

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

17
задан Kev 5 December 2011 в 11:41
поделиться

6 ответов

Вы хотите реализовать часть стека TCP в пространстве пользователя..., это в порядке, некоторые другие приложения делают это.

Одна проблема, с которой Вы столкнетесь, состоит в том, что ядро будет отсылать (вообще отрицательный, бесполезный) ответы на входящие пакеты. Это собирается завинтить любую коммуникацию, которую Вы пытаетесь инициировать.

Один способ избежать это должно использовать IP-адрес и интерфейс, что ядро не имеет своего собственного использования стека IP - который прекрасен, но необходимо будет иметь дело с материалом канального уровня (а именно, arp) сами. Это потребовало бы сокета ниже, чем IPPROTO_IP, SOCK_RAW - Вам нужен пакетный сокет (я думаю).

может также быть возможно заблокировать ответы ядра с помощью правила iptables - но я скорее подозреваю, что правила будут относиться собственным пакетам также так или иначе, если Вам не сможет удаться рассматривать их по-другому (возможно, применение netfilter "метка" к Вашим собственным пакетам?)

Read страницы справочника

сокет (7) IP (7) пакет (7)

, Которые объясняют о различных вариантах и ioctls, которые относятся к типам сокетов.

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

Жаль я не могу рекомендовать определенное учебное руководство.

Удача.

11
ответ дан 30 November 2019 в 14:01
поделиться

Я понимаю, что это старая ветка, но вот учебник, выходящий за рамки обычных SYN-флудеров: http://www.enderunix.org/docs/en/rawipspoof/

Надеюсь, это кому-нибудь поможет.

4
ответ дан 30 November 2019 в 14:01
поделиться

Я не могу выручить Вас ни на каких учебных руководствах.

, Но я могу дать Вам некоторый совет относительно инструментов, которые Вы могли использовать для помощи в отладке.

Прежде всего, как bmdhacks предложил, вовлеките себя копия wireshark (или tcpdump - но wireshark легче использовать). Получите хорошее квитирование. Удостоверьтесь, что Вы сохраняете это.

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

Затем, вовлекают себя копия tcpreplay. Это должно также включать инструмент, названный "tcprewrite". tcprewrite позволит Вам разделять свои ранее сохраненные файлы получения на два - один для каждой стороны квитирования. Можно тогда использовать tcpreplay для воспроизведения одной стороны квитирования, таким образом, у Вас есть непротиворечивое множество пакетов для игры с.

Тогда Вы используете wireshark (снова) для проверки ответов.

2
ответ дан 30 November 2019 в 14:01
поделиться

У меня нет учебного руководства, но я недавно использовал Wireshark успешно для отладки некоторого программирования неструктурированных сокетов, которое я делал. При получении пакетов, Вы отправляете, wireshark сделает хорошее задание показа Вас, если они будут уродливы или нет. Это полезно для по сравнению с нормальным соединением также.

1
ответ дан 30 November 2019 в 14:01
поделиться

Существуют структуры для IP и заголовков TCP, объявленных в netinet/ip.h & netinet/tcp.h соответственно. Можно хотеть посмотреть на другие заголовки в этом каталоге для дополнительных макросов & материал, который может быть полезным.

Вы отправляете пакет с набором флага SYN и случайным порядковым номером (x). Необходимо получить SYN+ACK от другой стороны. Этот пакет будет иметь подтверждение номер (y), который указывает на следующий порядковый номер, который другая сторона ожидает получать, а также другой порядковый номер (z). Вы передаете обратно пакет ACK, который имеет порядковый номер x+1 и ack номер z+1 для завершения соединения.

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

TCP определяется в RFC 793, доступном здесь: http://www.faqs.org/rfcs/rfc793.html

0
ответ дан 30 November 2019 в 14:01
поделиться

В зависимости от того, что вы пытаетесь сделать, может быть проще получить существующее программное обеспечение для обработки установления связи TCP для вас.

Один стек IP с открытым исходным кодом - это lwIP ( http://savannah.nongnu.org/projects/lwip/ ), который предоставляет полный стек tcp / ip. Очень возможно запустить его в пользовательском режиме, используя SOCK_RAW или pcap.

0
ответ дан 30 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: