Всем привет. Пара вопросов,желательно прямые,краткие и точные ответы. Пинать,отсылать читать RFC пожалуйста не нужно. SOCKET socket(int af, int type, int protocol ) если type=SOCK_RAW, и в опциях задан IP_HDRINCL как обрабатывается параметр prolocol,где-то встретил информацию,что он просто заносится в IP заголовок в поле,где указывается протокол? Отправляю IP-датаграммы c нулевой контрольной суммой IP и UDP заголовков,на другом конце принимаю успешно. Какое она тогда имеет значение?
Просто на windows SOCK_STREAM подразумевает TCP/6, а SOCK_DGRAM - UDP/17. На unix больше вариантов (например локальные sockets). API пришёл из Unix мира.
При использовании IP_HDRINCL заголовок IP для каждого вызова отправки заполняется самостоятельно. UDP - ненадежный протокол, вычисление контрольной суммы не обязательно (=0).. Контрольную сумму IP вычисляет сетевой стек, поэтому она не задается в коде (=0).
researcher Правильно. Есть 2 поля в кадре, на которые не удастся вам воздействовать на программном уровне (не залезая в дров сетевухи) и в том числе обнулить контрольную сумму. Когда кадр сформирован, перед тем как положить его в кольцевой буфер кадров (есть такой внутренний буфер сетевухи) для отсылки, система вычисляет контрольную сумму. Кадр с одной стороны обволакивается преамбулой, с другой - добавляется контрольная сумма. В итоге получается нечто такое: [Preambula][кадр][чексумма]. Вот так вот
TermoSINteZ Предположу, что эти два поля: ip_id - уникальный идентификатор и ip_offset - смещение фрагмента.
researcher Ну не совсем, это поля вы можете изменить (тока это уже будет нечто некошерное). Канальный уровень тоже доступен весь. А вот чуть ниже.. Смотрите, Фрейм Ethernet выглядит так: [Preamble] [Destination Address] [Source Address] [EtherType] [Payload] [FCS] Так вот Preamble и FCS добавляет сетевая карта (то есть ее драйвер). И тут даже NDIS вам не поможет. Нужно ниже брать. Для других протоколов, другие поля, с другими назначениями. Но они тоже есть.
Сколько не встретил примеров,везде ее считают самостоятельно,нигде не пишут - не заморачиваемся,за нас все сделает сетевой стек.Почему?) Получается можно в поле вызова socket-->protocol вписывать ноль?
В примерах могут ошибаться, потверждение тому твой работающий код (ведь соединяется!). Поищи примеры из книги Джонс Э., Оланд Дж. "Программирование в сетях Microsoft Windows. Мастер-класс", книга переводная с издания Microsoft Corporation. Глава 13. Простые сокеты. Там есть раздел "Использование IP_HDRINCL". Да. Это обычная практика для всех типов сокетов, протокол задается позже, на этапе соединения для клиента или привязки для сервера. Иначе, если Windows не разрешает такой протокол, то сокет может не создаться.
Здесь речь идет о разных вещах. TermoSINteZ говорит о контрольных суммах Ethernet, которые действительно считает дров сетевой карты. А чексуммы IP, TCP и прочего обычно считаются стеком (некоторые сетевухи умеют их считать, т.н. checksum offload)
TermoSINteZ а исходящие syn-пакеты?? слышал что они режутся в драйвере и отправить таковой из user-mode'a вообще невозможно (без патчинга драйверов и других извратов)