Обнаружение IP-пакетов внутри потока данных
Иногда в процессе отладки сетевых приложений возникает необходимость проанализировать содержимое пакетов по бинарным/hex логам обмена, и при этом под рукой может не оказаться специализированной программы для анализа.
Тем более, что, сформировать вручную бинарный файл (совместимый с форматом «снимков», поддерживаемых анализатором) содержащий «сырые» сетевые пакеты, зачастую, бывает гораздо сложнее, чем «вручную» эти пакеты «распарсить».
Либо, возникает ситуация, когда, просто нет возможности перехватить некоторые сетевые пакеты с помощью таких программ.
Например, мне так и не удалось «натравить» Microsoft Network Monitor на локально-установленный Apache.
Не помог даже специальный драйвер LoopBack-интерфейса, который я установил, в надежде что он поможет NetMon'у перехватывать локальные сетевые пакеты, типа PING 127.0.0.1 и ему подобные.
Тем не менее, вновь-созданный VPN-туннель, позволяющий отправлять в сеть «сырые» IP-пакеты, без проблем прослушивается NetMon'ом, (несмотря на то, что он так же как и Apache, поднят локально).
Приведенный ниже код позволяет в блоке «сырых» данных $raw_data отыскивать позиции начала возможных заголовков IP-пакетов версии 4.
Проверка контрольной суммы заголовка полностью решает эту проблему.
Нужно так же обнаруживать заголовки пакетов IP версии 6.
Кто-нибудь подскажет как это попроще сделать?
Тем более, что, сформировать вручную бинарный файл (совместимый с форматом «снимков», поддерживаемых анализатором) содержащий «сырые» сетевые пакеты, зачастую, бывает гораздо сложнее, чем «вручную» эти пакеты «распарсить».
Либо, возникает ситуация, когда, просто нет возможности перехватить некоторые сетевые пакеты с помощью таких программ.
Например, мне так и не удалось «натравить» Microsoft Network Monitor на локально-установленный Apache.
Не помог даже специальный драйвер LoopBack-интерфейса, который я установил, в надежде что он поможет NetMon'у перехватывать локальные сетевые пакеты, типа PING 127.0.0.1 и ему подобные.
Тем не менее, вновь-созданный VPN-туннель, позволяющий отправлять в сеть «сырые» IP-пакеты, без проблем прослушивается NetMon'ом, (несмотря на то, что он так же как и Apache, поднят локально).
Приведенный ниже код позволяет в блоке «сырых» данных $raw_data отыскивать позиции начала возможных заголовков IP-пакетов версии 4.
<?php
$mask="/[E-O](?=.{8}[\x01\x06\x11])/s";
$res=preg_match_all($mask, $raw_data, $result, PREG_OFFSET_CAPTURE);
foreach ($result[0] as $rrr)
echo $rrr[1],"\r\n";
Данный способ обнаружения довольно грубый, и дает очень много ложных срабатываний, поэтому, желательно так же более тщательно проверять результаты.Проверка контрольной суммы заголовка полностью решает эту проблему.
function checksum($data, $bool=false)
{
if (strlen($data) & 1)
$data .= "\x00";
$bit = unpack("n*", $data);
$sum = array_sum($bit);
while ($sum >> 16)
$sum = ($sum >> 16) + ($sum & 0xffff);
if ($bool) return ($sum===0xffff);
return pack("n", ~$sum);
}
Собственно вопрос:Нужно так же обнаруживать заголовки пакетов IP версии 6.
Кто-нибудь подскажет как это попроще сделать?
$raw_data может содержать данные из файлов захвата Network Monitor'а "*.cap", либо «растранспарированные» (untranspared) данные считанные напрямую из последовательного порта модема.
Внутри самого потока (в области обнаруживаемого пакета) нет никаких «посторонних» включений.
При этом, сам пакет может быть окружен с обоих сторон заголовками инкапсуляций канального (и, даже, транспортного) уровня. Сами RAW-данные не сжатые и незашифрованные. 1010101001000100110100111,