Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Механизм сокетов, Отсюда ушел, оттуда пришел 
V
    Опции темы
null56
Дата 3.12.2009, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



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

socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)


- и на получение ICMP сообщений, с последующим разбором сообщения (сырой)
Код

socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)


всё работает и вот отсюда у меня возник вопрос ПОЧЕМУ?
Если данные серверу отправляются из другой дырки, то почему я могу поймать их в этой? А если у меня будет два сырых сокета ICMP типа, что тогда?

Возможно вопрос для профи глупый, поэтому отправка учить матчасть в качестве ответа сойдет, но только со ссылкой на неё

Был бы очень признателен за аргументированный ответ или ссылки на хорошую инфу по поводу механизмов

PM MAIL   Вверх
andrew_121
Дата 3.12.2009, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33





--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 3.12.2009, 09:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(null56 @  3.12.2009,  01:39 Найти цитируемый пост)
Если данные серверу отправляются из другой дырки, то почему я могу поймать их в этой? А если у меня будет два сырых сокета ICMP типа, что тогда?

реализация raw сокетов в принципе может быть различна в разных ОС
в Linux реализация аналогична пакетным сокетам, т. е. на raw сокет приходит _копия_ пакета (объекта структуры sk_buff)
если есть 2 таких сокета, то каждый получит свою копию

вот реализация функции поиска и вызова обработчика протокола L4 (выполняется после завершения всех NF_IP_LOCAL_IN обработчиков netfilter)
ссылка1
как видим, raw_local_deliver() отрабатывает раньше handler'а ipprot->handler()
реализация raw_local_deliver() тут
ссылка2
там же в raw_v4_input() осуществляется поиск всех raw советов, удовлетворяющих пакету с т. з. IP, т. е. принимаются во внимание saddr, daddr, ifindex и protocol

Добавлено через 2 минуты и 55 секунд
andrew_121
такой ответ - сродни отсылки к гуглу
тем более, насколько я заметил, ответа на вопрос там нету
в общем лучше совсем не отвечать, чем отвечать так


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
null56
Дата 3.12.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Цитата(MAKCim @  3.12.2009,  09:43 Найти цитируемый пост)
там же в raw_v4_input() осуществляется поиск всех raw советов, удовлетворяющих пакету с т. з. IP, т. е. принимаются во внимание saddr, daddr, ifindex и protocol

то есть пришедшие ICMP пакеты будут доставлены всем сокетам в СИСТЕМЕ, которые обращались к этому серверу по данному протоколу?
Именно по этой причине в реализации утилиты ping поле данных ICMP пакета заполняется идентификатором процесса, чтобы определить по возвращению, что именно эта копия ping была отправителем? так как система отправит копию объекта структуры sk_buff всем открытым RAW сокетам ICMP отправлявшим icmp сообщения данному серверу?
Это из функции поиска открытых сокетов удовлетворяющих условиям и отправки копии skb_clone
Код

71         sk = __raw_v4_lookup(net, __sk_head(head), iph->protocol,
172                              iph->saddr, iph->daddr,
173                              skb->dev->ifindex);
174 
175         while (sk) {
176                 delivered = 1;
177                 if (iph->protocol != IPPROTO_ICMP || !icmp_filter(sk, skb)) {
178                         struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
179 
180                         /* Not releasing hash table! */
181                         if (clone)
182                                 raw_rcv(sk, clone);
183                 }
184                 sk = __raw_v4_lookup(net, sk_next(sk), iph->protocol,
185                                      iph->saddr, iph->daddr,
186                                      skb->dev->ifindex);
187         }



Цитата

в Linux реализация аналогична пакетным сокетам, т. е. на raw сокет приходит _копия_ пакета (объекта структуры sk_buff)

Если сказанное мной выше верно, то любое сообщение, как от пакетных, так и от сырых сокетов можно перехватить из любого приложения в рамках системы?

А что касается реализации других типов сокетов? Датаграммы, потоки, у них другие реализации?

Добавлено через 2 минуты и 26 секунд
ЗЫ: я не знаю для чего ifindex и что это такое...
PM MAIL   Вверх
MAKCim
Дата 3.12.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(null56 @  3.12.2009,  16:25 Найти цитируемый пост)
то есть пришедшие ICMP пакеты будут доставлены всем сокетам в СИСТЕМЕ, которые обращались к этому серверу по данному протоколу?

Код

111static struct sock *__raw_v4_lookup(struct net *net, struct sock *sk,
112                 unsigned short num, __be32 raddr, __be32 laddr, int dif)
113 {
114         struct hlist_node *node;
115 
116         sk_for_each_from(sk, node) {
117                 struct inet_sock *inet = inet_sk(sk);
118 
119                 if (net_eq(sock_net(sk), net) && inet->num == num       &&
120                     !(inet->daddr && inet->daddr != raddr)              &&
121                     !(inet->rcv_saddr && inet->rcv_saddr != laddr)      &&
122                     !(sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif))
123                         goto found; /* gotcha */
124         }
125         sk = NULL;
126 found:
127         return sk;
128 }

если для raw сокета не был вызван connect()/bind() и setsockopt() с SO_BINTODEVICE, то inet->daddr = 0, inet->rcv_saddr = 0 и sk->sk_bound_dev_if = 0 => да, всем таким сокетам
иначе условия выше

Цитата(null56 @  3.12.2009,  16:25 Найти цитируемый пост)
Именно по этой причине в реализации утилиты ping поле данных ICMP пакета заполняется идентификатором процесса, чтобы определить по возвращению, что именно эта копия ping была отправителем?

да, чтобы иметь возможность узнать, на какой echo request пришел ответ
но это не имеет никакого отношения к raw сокетам




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
null56
Дата 3.12.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Цитата(MAKCim @  3.12.2009,  22:17 Найти цитируемый пост)
но это не имеет никакого отношения к raw сокетам

как это... вроде для создания утилиты ping необходимо формировать заголовок ICMP, чтобы занести в поле данных идентификатор процесса и время отправки?
Код

socket(PF_INET, SOCK_RAW, IPPROTO_ICMP);

или что ты имел в виду под этой фразой?


Это сообщение отредактировал(а) null56 - 4.12.2009, 04:07
PM MAIL   Вверх
null56
Дата 4.12.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Ладно, не столь важно, что ты имел в виду. Просто на сколько мне известно ping работает именно на сырых сокетах...
ОГРОМНОЕ тебе спасибо за отличный ответ на исходниках... в принципе дальше могу сам их посмотреть с целью понять поведение сетевой подсистемы linux, точку отсчета ты дал
PM MAIL   Вверх
MAKCim
Дата 4.12.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(null56 @  3.12.2009,  22:31 Найти цитируемый пост)
как это... вроде для создания утилиты ping необходимо формировать заголовок ICMP, чтобы занести в поле данных идентификатор процесса и время отправки?

не, я к тому, что сам протокол ICMP не зависит от средств реализации
где-то его можно юзать через raw сокеты, где-то, возможно, напрямую
через те же пакетные сокеты можно не только его реализовать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.