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