Получение данных на сокете ICMP - PullRequest
2 голосов
/ 15 июля 2009

При получении через сокет ICMP (SOCK_RAW с IPPROTO_ICMP), так как в протоколе ICMP нет понятия «порт», как можно Приложение определяет, что полученный пакет не является частью какого-либо другого TCP / UDP / любая передача сокетов, которая также происходит на в то же время?

Например, предположим, что у вас есть приложение с двумя потоками. Тема 1 устанавливает сокет TCP-сервера и постоянно получает данные от подключенный клиент. Поток 2 непрерывно отправляет пакеты эхо-запроса (пинг) к тому же клиенту с помощью сокета ICMP, а затем получает эхо отвечено. Что мешает потоку 2 получить один из TCP пакеты вместо?

Ответы [ 3 ]

7 голосов
/ 15 июля 2009

ICMP - это протокол, отличный от TCP и UDP, который определяется полем протокола в IP-заголовке . Когда вы открываете сокет с помощью IPPROTO_ICMP, вы указываете сокету передавать и получать только пакеты с заголовками IP, чье поле протокола установлено в ICMP.

Аналогично, сокеты, открытые с помощью IPPROTO_TCP или IPPROTO_UDP, отвечают только на пакеты, IP-заголовки которых содержат поле протокола, установленное на TCP или UDP, соответственно.

1 голос
/ 18 сентября 2012

Полученные пакеты UDP и TCP никогда не передаются в необработанные сокеты. Если процесс хочет прочитать IP-дейтаграмму, содержащую пакеты UDP или TCP, пакеты должны быть прочитаны на канальном уровне. проверить эту ссылку

http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch01s03.html

если пакет не кэшируется на уровне 2, то он обрабатывается ядром. И если пакет имеет протокол icmp и является запросом типа echo, запросом временной метки или запросом маски адреса, то он полностью обрабатывается ядром, иначе он будет передан в RAW SOCKETS.

Еще один - все дейтаграммы с полем протокола, которое ядро ​​не понимает, передаются в необработанные сокеты, только базовая обработка ip выполняется на них

Наконец, если дейтаграмма поступает фрагментами, то в необработанные сокеты ничего не передается, пока все фрагменты не будут собраны и повторно собраны.

Если вы хотите узнать больше, прочитайте эту книгу .

1 голос
/ 02 августа 2011

Вы можете проверить заголовок ICMP для типа и посмотреть, является ли его эхо-ответ ICMP (Тип 0). Также в ICMP ответ будет содержать запрос, который вы отправили в первую очередь.

...