![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Всем доброго вечера.
сразу скажу: ОС - UNIX. Суть вопроса и создания темы вот в чем: на мой комп отправляют какой-то пакет, по проводам он идет в виде ethernet-кадра. Какой-то маршрутизатор решил, что его нужно фрагментировать. Поделил и отправил уже ко мне два таких кадра. На компе стоит анализатор трафика. Сокет сырой(принимает ethernet-кадры). Вопрос: на этот сокет придут ДВА пакета? Или система, прежде чем передать поделенный пакет, примет его, соберет и передаст уже готовый целый? Это сообщение отредактировал(а) konshyn - 19.10.2013, 18:27 -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Судя по "принимает ethernet-кадры" на сокет придут два кадра. Проверьте с помощью утилиты ping с размером данных в 2000 байт.
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
В модуле IP есть таймер сборки фрагментов. В Юниксе это 30 сек.
Если за это время приходят все фрагменты, то модуль собирает их в один IP-пакет. RAW сокет завязан на уровень IP, поэтому придет один IP-пакет. Имхо. Теоретически это так... |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Вот и вопрос. Сокет AF_PACKET или AF_INET?
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
o2n3e |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 19.8.2011 Репутация: нет Всего: -5 |
Модератор: Сообщение скрыто. |
|||
|
||||
konshyn |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Да. Получается так. Сокет был PF_PACKET. Но теперь решил принимать только IP, поэтому AF_INET. Но теперь вопрос немного не по теме... Я создаю сокет вот так:
и мне нужно принимать ЛЮБОЙ IP-пакет с определенного интерфейса и с любых портов. я привязал этот сокет к интерфейсу так:
можно сделать через bind() привязывая к ip-адресу, но там задается порт, который обязателен. а мне нужно считывать со всех портов, а не с конкретного считываю так:
но как бы не работает. висит на этой функции recvfrom() и все. Как мне принять любой IP-пакет? Добавлено через 8 минут и 7 секунд Прости, но ты не прав
Создает сырой сокет, который принимает все кадры. И в буфер считается все: eth-заголовок, ip-заголовок и т.д.
Отличу. В IP заголовке есть пункт, который показывает, что это фрагмент целого пакета. В разделе "флаги", третий бит. И есть поле - "смещение фрагмента", идет сразу после поля "флаги". -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||||||||
|
|||||||||||
o2n3e |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 19.8.2011 Репутация: нет Всего: -5 |
Модератор: Сообщение скрыто. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Честно говоря, я даже не уверен, что на сырой сокет можно делать bind. К тому же IP-трафик - это не только UDP/TCP, но и другие протоколы, для которых понятие порта не определено. Если AF_INET, то, скорее всего, начальный пакет предварительно будет собран из фрагментов. Опять же нужно проверить ![]() А вот здесь правильно ли: Вот зачем здесь htons? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Эээ, нет, не правильно. Я Вам давал ссылку на правильный код ![]() Ссылка в явном виде: http://codingrelic.geekhold.com/2009/10/co...ndtodevice.html -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
konshyn |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
В какой-то статье так было сделано. Я проверил, работает. Но этой строкой я хотел сказать, что привязвал к физическому интерфейсу(по названию), а не к IP-адресу, как это делает функция bind(). Можно. Для сырого сокета используется структура
По идее, нужно(у Стивенса так было написано с каким-то протоколом, если не ошибаюсь, то именно с сырым PF_PACKET. Но вообще, в поле протокол - значение должно быть в сетевом порядке вроде как). Но с ним или без него, не работает. Но допустим мы определились. IP - пакет собирается на месте, а потом передается сокету. Т.е. я получаю целый пакет. Сырой сокет для IP пакетов создается так
нужен htons или нет, неважно, это легко потом проверить. допустим, у меня один интерфейс(сетевая карта) eth0. Как или через какую функцию мне начать принимать пакеты? потому что recvfrom - не работает, или я ее неправильно использую в данном случае. -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||
|
|||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Ну, вообще-то работа с RAW- это работа без портов в принципе, и поэтому думаю, что все что будет приходить по этому сокету - должно бы поступать в него со всех интерфейсов как бы автоматически, именно этому приложению (если оно единственное кто работает с RAW). Впрочем, это только имхо... ![]() Да нет, это важно. В порядок байтов сети должны быть преобразованы только те целые числа, которые обрабатываются маршрутизаторами (это IP-адрес) и конечной системой - а это порт. Поле протокола никогда не преобразуется - например TCP- номер 6, UDP- 17, а IP - это номер 0, и его как ни крути - будет 0. А потому и с htons и без него - один шиш. Это сообщение отредактировал(а) Олег2005 - 19.10.2013, 22:11 |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Потом - это когда? Почему не сейчас?
Взято с википедии. В man'ах Вы найдёте то же самое. Можно изучить SOCK_RAW Demystified. И я как-то сомневаюсь, что у Стивенса было с htons. Приведите, пожалуйста, ссылку. Передали неправильный параметр, получили ничего в recvfrom. Ну это несколько другой bind, не тот, о котором Вы говорили И ещё нужно правильно определить индекс интерфейса. Всё равно это не правильно. Статья - хакерская, не иначе. Правильный путь - через struct ifreq, как и написано в руководстве. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Спасибо за ссылку!!! ![]() Вот нашел ссылку, откуда Ноги растут Это сообщение отредактировал(а) Олег2005 - 19.10.2013, 22:15 |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Вы, наверное, имели в виду
Но при чём здесь IPPROTO_RAW? Добавлено через 2 минуты и 1 секунду ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Нашел такое определение в хедере
#define ETH_P_ALL 0x0003 Нашел и это sockaddr_ll является не зависимым от устройства адресом физического уровня. struct sockaddr_ll { unsigned short sll_family; /* Всегда AF_PACKET */ unsigned short sll_protocol; /* Протокол физического уровня */ int sll_ifindex; /* Hомер интерфейса */ unsigned short sll_hatype; /* Тип заголовка */ unsigned char sll_pkttype; /* Тип пакета */ unsigned char sll_halen; /* Длина адреса */ unsigned char sll_addr[8]; /* Адрес физического уровня */ }; sll_protocol - тип стандартного протокола ethernet в сетевом порядке байтов, определенный в файле linux/if_ether.h. Он определяет протокол сокета по умолчанию. Кстати, вопрос к топикстартеру - ведь такую тему вы уже поднимали: http://forum.vingrad.ru/topic-372076.html Это сообщение отредактировал(а) Олег2005 - 19.10.2013, 22:43 |
|||
|
||||
konshyn |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
а какая разница - IPPROTO_RAW или ETH_P_ALL. числа-то ведь ненулевые, как в случае с IPPROTO_IP. Спасибо) Добавлено через 1 минуту и 6 секунд а какая разница - IPPROTO_RAW или ETH_P_ALL. числа-то ведь ненулевые, как в случае с IPPROTO_IP. Спасибо) Добавлено через 8 минут и 5 секунд
Не совсем так. Тут был другой вопрос: что происходит при фрагментации пакета маршрутизатором при получении этого пакета ОС. Просто когда начал уже переделывать проект под IP-сокет, а не eth-кадры, то возникли проблемы, решил новую тему не создавать, а уже задать вопрос здесь. Добавлено через 12 минут и 2 секунды определить индекс не проблема функция ioctl или есть еще структура
и функция похожая(не помню точное название), которая при вызове требует эту структуру. оно создает список всех имен интерфейсов и их индексов. Добавлено через 14 минут и 27 секунд кажется, я не доразобрался со структурами для сокетов. спасибо)) но проблема остается. не могу получать пакеты, висит на функции recvfrom... -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||
|
|||||
konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Да, оттуда. Есть статья, которой видимо многие пользовались. Но там, как и я, человек создавал сырой сокет для канального уровня (ethernet). А сейчас я пытаюсь сделать сырой сокет для IP. -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
рука-лицо.жереге ![]() Ну вот представьте себе, что просто IPPROTO_RAW и не просто htons(ETH_P_ALL). Вообще все ETH_* константы требуют htons, а IPPROTO_* - нет. Посмотрел про IPPROTO_RAW в Линуксе:
Вот так. Хотя народ пишет, что и связка AF_PACKET/SOCK_RAW/IPPROTO_RAW работает... При этом
Добавлено через 6 минут и 28 секунд Я понимаю, что это возможно, но речь шла о байнде сырого сокета на конкретный IP адрес конкретного интерфейса, а вот в этом я уже сомневаюсь... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
||||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Да я и не сомневался)))) Почему сразу и спросил, какой сокет имеется в виду - AF_PACKET или AF_INET. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
konshyn |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
Вот этого я не знал. Теперь знаю. Извиняюсь за повтор(как писал уже feodorv ), Но вот по ссылке. Пишут сначала:
потом:
P.S. Это действительно . Столько времени потратил на понимание, почему не считывает при создании с IPPROTO_RAW, а пишут, что принимает... Пока писал верхнюю часть, понял, что под словомами "принимает все протоколы IP" имеется в виду изменение всех вложенных протоколов в ip-пакет, а не "принимать" = "считывать" из сети. Ладно, тут все понял. Сырой сокет чисто для IP-пакетов(всех IP-пакетов, а не отдельных - TCP, UDP и др.) я создать не смогу(для приема). Только пакетный. А пакетные сокеты не собирают пакет воедино, если он был где-то в пути фрагментирован. Правильно все понял? -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
||||||
|
|||||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Ну да. В Линуксе не получится. Сформулировано, конечно, не очень...
![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
konshyn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 19.9.2013 Репутация: нет Всего: нет |
feodorv, спасибо.
По-моему, во всех созданных мной темах выручаете:) Добавлено через 6 минут и 21 секунду И информация для тех, кто сюда заглянет. Если кто-то захочет привязать сокет к определенному устройству через опцию SO_BINDTODEVICE функцией setsockopt(), то привязывать можно только сокеты AF_INET. AF_PACKET придется привязывать через bind(). -------------------- «Потому что ценность акта действия в этой стране возрастает в несколько раз». |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
konshyn, не за что)))
Хорошо, что Вы написали, а то я как-то об этом забыл... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |