まず、ネームサーバーに渡す名前はドットで区切られていませんが、名前のすべての部分が別々に送信されます。
次に、16進数に変換されたデータを送信するのではなく、直接送信します。16進数(\x01\x01
)は単なる表現です。
したがって、名前の各部分の前にはその長さがあり、最後の部分の後には空の文字列を意味するためgoogle.nl
、の形式でエンコードします。これは、名前チェーンの終わりを示します。"\x06google\x02nl\x00"
\x00
したがって、可変性を維持するには、ドメイン名をそのコンポーネントに分割し、各コンポーネントの前に対応する長さのバイトを付ける必要があります。
何かのようなもの
function domain2dns($domain)
{
$split = explode(".", $domain);
$target = ""; // cumulate here
foreach ($split as $part) {
// For every $part, prepend one byte denoting its length.
// strlen($part) is its length which is supposed to be put into one character.
$target .= chr(strlen($part)).$part;
}
return $target . "\x00";
}
するのに役立つかもしれません
$domainname = "google.nl";
$dnsdomain = domain2dns($domainname);
$package = "\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00" . $dnsdomain . "\x00\xff\x00\x01";