![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
Собственно вопрос по незнанию механизма сокетов. Я всегда считал, что сокет это конечная точка между двумя принимающими частями, клиент или сервер обмениваются данными по определенному протоколу, порту и прочему. Недавно начал более глубокое изучение сокетов и наткнулся на очень интересный для меня момент.
В программе создаю два типа сокетов - на отправку UDP пакетов
- и на получение ICMP сообщений, с последующим разбором сообщения (сырой)
всё работает и вот отсюда у меня возник вопрос ПОЧЕМУ? Если данные серверу отправляются из другой дырки, то почему я могу поймать их в этой? А если у меня будет два сырых сокета ICMP типа, что тогда? Возможно вопрос для профи глупый, поэтому отправка учить матчасть в качестве ответа сойдет, но только со ссылкой на неё Был бы очень признателен за аргументированный ответ или ссылки на хорошую инфу по поводу механизмов |
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 3 Всего: 33 |
http://www.rsdn.ru/article/unix/sockets.xml
http://book.itep.ru/7/sock_71.htm http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%...%BA%D0%BB%D0%B8 http://www.developerweb.net/forum/forumdisplay.php?f=70 http://www.softlab.ntua.gr/facilities/docu...socket-faq.html Еще порекомендовал бы купить эту книжку: http://www.ozon.ru/context/detail/id/4571632/ и ее продолжение. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
реализация 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, такой ответ - сродни отсылки к гуглу тем более, насколько я заметил, ответа на вопрос там нету в общем лучше совсем не отвечать, чем отвечать так -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
то есть пришедшие ICMP пакеты будут доставлены всем сокетам в СИСТЕМЕ, которые обращались к этому серверу по данному протоколу? Именно по этой причине в реализации утилиты ping поле данных ICMP пакета заполняется идентификатором процесса, чтобы определить по возвращению, что именно эта копия ping была отправителем? так как система отправит копию объекта структуры sk_buff всем открытым RAW сокетам ICMP отправлявшим icmp сообщения данному серверу? Это из функции поиска открытых сокетов удовлетворяющих условиям и отправки копии skb_clone
Если сказанное мной выше верно, то любое сообщение, как от пакетных, так и от сырых сокетов можно перехватить из любого приложения в рамках системы? А что касается реализации других типов сокетов? Датаграммы, потоки, у них другие реализации? Добавлено через 2 минуты и 26 секунд ЗЫ: я не знаю для чего ifindex и что это такое... |
||||||
|
|||||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
если для raw сокета не был вызван connect()/bind() и setsockopt() с SO_BINTODEVICE, то inet->daddr = 0, inet->rcv_saddr = 0 и sk->sk_bound_dev_if = 0 => да, всем таким сокетам иначе условия выше да, чтобы иметь возможность узнать, на какой echo request пришел ответ но это не имеет никакого отношения к raw сокетам -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
как это... вроде для создания утилиты ping необходимо формировать заголовок ICMP, чтобы занести в поле данных идентификатор процесса и время отправки?
или что ты имел в виду под этой фразой? Это сообщение отредактировал(а) null56 - 4.12.2009, 04:07 |
|||
|
||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
Ладно, не столь важно, что ты имел в виду. Просто на сколько мне известно ping работает именно на сырых сокетах...
ОГРОМНОЕ тебе спасибо за отличный ответ на исходниках... в принципе дальше могу сам их посмотреть с целью понять поведение сетевой подсистемы linux, точку отсчета ты дал |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
не, я к тому, что сам протокол ICMP не зависит от средств реализации где-то его можно юзать через raw сокеты, где-то, возможно, напрямую через те же пакетные сокеты можно не только его реализовать -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |