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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что происходит при фрагментации пакетов 
:(
    Опции темы
konshyn
Дата 20.10.2013, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @  19.10.2013,  22:10 Найти цитируемый пост)
Но при чём здесь IPPROTO_RAW?

а какая разница - IPPROTO_RAW или ETH_P_ALL. числа-то ведь ненулевые, как в случае с IPPROTO_IP.

Цитата(feodorv @  19.10.2013,  22:05 Найти цитируемый пост)
 Можно изучить SOCK_RAW Demystified. 

Спасибо)

Добавлено через 1 минуту и 6 секунд
Цитата(feodorv @  19.10.2013,  22:10 Найти цитируемый пост)
Но при чём здесь IPPROTO_RAW?

а какая разница - IPPROTO_RAW или ETH_P_ALL. числа-то ведь ненулевые, как в случае с IPPROTO_IP.

Цитата(feodorv @  19.10.2013,  22:05 Найти цитируемый пост)
 Можно изучить SOCK_RAW Demystified. 

Спасибо)

Добавлено через 8 минут и 5 секунд
Цитата(Олег2005 @  19.10.2013,  22:25 Найти цитируемый пост)

Кстати, вопрос к топикстартеру - ведь такую тему вы уже поднимали:


Не совсем так. Тут был другой вопрос: что происходит при фрагментации пакета маршрутизатором при получении этого пакета ОС.
Просто когда начал уже переделывать проект под IP-сокет, а не eth-кадры, то возникли проблемы, решил новую тему не создавать, а уже задать вопрос здесь.

Добавлено через 12 минут и 2 секунды
Цитата(feodorv @  19.10.2013,  22:05 Найти цитируемый пост)
И ещё нужно правильно определить индекс интерфейса.

определить индекс не проблема
функция ioctl
или есть еще структура 
Код

struct if_nameindex 

и функция похожая(не помню точное название), которая при вызове требует эту структуру. оно создает список всех имен интерфейсов и их индексов.

Добавлено через 14 минут и 27 секунд
Цитата(Олег2005 @  19.10.2013,  22:25 Найти цитируемый пост)
Нашел такое определение в хедере
#define ETH_P_ALL    0x0003

кажется, я не доразобрался со структурами для сокетов. спасибо))
но проблема остается. не могу получать пакеты, висит на функции recvfrom...


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
Дата 20.10.2013, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Олег2005 @  19.10.2013,  22:08 Найти цитируемый пост)
Вот нашел ссылку, откуда Ноги растут

Да, оттуда. Есть статья, которой видимо многие пользовались. Но там, как и я, человек создавал сырой сокет для канального уровня (ethernet). 
А сейчас я пытаюсь сделать сырой сокет для IP.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
feodorv
Дата 20.10.2013, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(konshyn @  20.10.2013,  01:16 Найти цитируемый пост)
а какая разница - IPPROTO_RAW или ETH_P_ALL. числа-то ведь ненулевые, как в случае с IPPROTO_IP.

рука-лицо.жереге  smile 
Ну вот представьте себе, что просто IPPROTO_RAW и не просто htons(ETH_P_ALL). Вообще все ETH_* константы требуют htons, а IPPROTO_* - нет.


Посмотрел про IPPROTO_RAW в Линуксе:
Цитата
Сокет IPPROTO_RAW предназначен только для передачи (посылки) пакетов. Если Вы хотите получать все пакеты IP, используйте пакетный сокет ( packet(7)) с протоколом ETH_P_IP. Обратите внимание, что пакетные сокеты в отличие от raw-сокетов не собирают фрагменты IP. 

Вот так. Хотя народ пишет, что и связка AF_PACKET/SOCK_RAW/IPPROTO_RAW работает...


При этом 
Цитата

ETH_IP_P only sees incoming packets. For performance issue reasons only ETH_P_ALL sees your output.


Добавлено через 6 минут и 28 секунд
Цитата(konshyn @  20.10.2013,  01:16 Найти цитируемый пост)
определить индекс не проблема

Я понимаю, что это возможно, но речь шла о байнде сырого сокета на конкретный IP адрес конкретного интерфейса, а вот в этом я уже сомневаюсь...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Олег2005
Дата 20.10.2013, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 11



Цитата(feodorv @  20.10.2013,  00:16 Найти цитируемый пост)
Обратите внимание, что пакетные сокеты в отличие от raw-сокетов не собирают фрагменты IP. 

Ну да, они же ниже сетевого уровня...
Так что мы в принципе думаем верно... smile 
PM MAIL WWW MSN   Вверх
feodorv
Дата 20.10.2013, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(Олег2005 @  20.10.2013,  02:38 Найти цитируемый пост)
Так что мы в принципе думаем верно... smile  

Да я и не сомневался))))
Почему сразу и спросил, какой сокет имеется в виду - AF_PACKET или AF_INET.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
konshyn
Дата 21.10.2013, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @  20.10.2013,  01:16 Найти цитируемый пост)
Ну вот представьте себе, что просто IPPROTO_RAW и не просто htons(ETH_P_ALL). Вообще все ETH_* константы требуют htons, а IPPROTO_* - нет.

Вот этого я не знал. Теперь знаю.

Извиняюсь за повтор(как писал уже feodorv ),
Но вот по ссылке. Пишут сначала:
Цитата

Протокол IPPROTO_RAW подразумевает разрешенный IP_HDRINCL
и принимает все протоколы IP. 

потом:
Цитата

Сокет IPPROTO_RAW предназначен только для передачи
(посылки) пакетов.


P.S. Это действительно 
Цитата(feodorv @  20.10.2013,  01:16 Найти цитируемый пост)
рука-лицо.жереге  smile 
. Столько времени потратил на понимание, почему не считывает при создании с IPPROTO_RAW, а пишут, что принимает... Пока писал верхнюю часть, понял, что под словомами "принимает все протоколы IP" имеется в виду изменение всех вложенных протоколов в ip-пакет, а не "принимать" = "считывать"  из сети.

Ладно, тут все понял.
Сырой сокет чисто для IP-пакетов(всех IP-пакетов, а не отдельных - TCP, UDP и др.) я создать не смогу(для приема). Только пакетный.

А пакетные сокеты не собирают пакет воедино, если он был где-то в пути фрагментирован. Правильно все понял?



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
feodorv
Дата 21.10.2013, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(konshyn @  21.10.2013,  12:02 Найти цитируемый пост)
Сырой сокет чисто для IP-пакетов(всех IP-пакетов, а не отдельных - TCP, UDP и др.) я создать не смогу(для приема)

Ну да. В Линуксе не получится.


Цитата(konshyn @  21.10.2013,  12:02 Найти цитируемый пост)
под словомами "принимает все протоколы IP"

Сформулировано, конечно, не очень...


Цитата(konshyn @  21.10.2013,  12:02 Найти цитируемый пост)
А пакетные сокеты не собирают пакет воедино, если он был где-то в пути фрагментирован. Правильно все понял?

 smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
konshyn
  Дата 21.10.2013, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



feodorv, спасибо.
По-моему, во всех созданных мной темах выручаете:)

Добавлено через 6 минут и 21 секунду
И информация для тех, кто сюда заглянет. 
Если кто-то захочет привязать сокет к определенному устройству через опцию SO_BINDTODEVICE функцией setsockopt(), то привязывать можно только сокеты AF_INET.
AF_PACKET придется привязывать через bind().


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
feodorv
Дата 21.10.2013, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



konshyn, не за что)))

Цитата(konshyn @  21.10.2013,  16:43 Найти цитируемый пост)
AF_PACKET придется привязывать через bind(). 

Хорошо, что Вы написали, а то я как-то об этом забыл...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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