Комментарии: Хелперы для работы c IPv4 и не только… http://delphifeeds2.ru/2019/11/02/%d1%85%d0%b5%d0%bb%d0%bf%d0%b5%d1%80%d1%8b-%d0%b4%d0%bb%d1%8f-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-c-ipv4-%d0%b8-%d0%bd%d0%b5-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be/ Лучшие Delphi блоги Рунета Thu, 04 Mar 2021 13:04:45 +0000 hourly 1 https://wordpress.org/?v=4.9.20 Автор: Александр http://delphifeeds2.ru/2019/11/02/%d1%85%d0%b5%d0%bb%d0%bf%d0%b5%d1%80%d1%8b-%d0%b4%d0%bb%d1%8f-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-c-ipv4-%d0%b8-%d0%bd%d0%b5-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be/#comment-6688 Sun, 03 Nov 2019 09:49:33 +0000 http://delphifeeds2.ru/2019/11/02/%d1%85%d0%b5%d0%bb%d0%bf%d0%b5%d1%80%d1%8b-%d0%b4%d0%bb%d1%8f-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-c-ipv4-%d0%b8-%d0%bd%d0%b5-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be/#comment-6688 6 FF = 1 — проверка кода протокола. Код протокола хранится в 9-м (считая с нуля) байте IPv4-заголовка. Чтобы получить это значение, мы берем 4-х байтовый блок с шестого по девятый байт, а затем при помощи маски выделяем последний, интересующий нас байт в это блоке, и сравниваем его с единицей (код протокола ICMP). 4 3FFF = 0 — проверка, не является ли наш пакет фрагментом. Фрагменты ICMP-пакетов не содержат ICMP-заголовка, в котором должен храниться тип ICMP, поэтому для них дальнейшая проверка не имеет смысла. Пользуясь описанным выше принципом, наша программа выделяет последние 14 бит в блоке с 4-го по 7-й байт, и сравнивает полученное значение с нулем. Строго говоря, для наших целей достаточно было бы и 13 бит (маска 1FFF), выделяющих только поле смещения фрагмента (fragment offset, оно должно быть равным нулю для первого пакета в цепочке фрагментов), а использование 14 бит, как это сделано в примере из официальной документации, также захватит и флаг MF (more fragments), что отсечет вообще все фрагментированные пакеты, даже те, которые являются первыми в последовательности и содержат все нужные нам заголовки.

]]>