موږ پدې وروستیو کې د LIR وضعیت او /29 IPv6 بلاک ترلاسه کړ. او بیا اړتیا رامینځته شوه چې د ټاکل شوي فرعي نیټونو تعقیب وساتل شي. او له هغه وخته چې زموږ بلینګ په PHP کې لیکل شوی ، موږ باید مسلې ته لږ پام وکړو او پوه شو چې دا ژبه د IPv6 سره د کار کولو شرایطو کې خورا دوستانه نده. د کټ لاندې زموږ د هغو ستونزو حل دی چې د ادرسونو او رینجونو سره کار کولو پرمهال رامینځته کیږي. شاید خورا ښکلی نه وي، مګر دا کار کوي.

یو څه تیوری
ردول. که تاسو پوهیږئ چې IPv6 څه شی دی او د څه شی سره راځي، دا برخه ممکن ستاسو لپاره ستړي وي. ښايي دا نه وي.
هغه خلک چې د لومړي ځل لپاره د IPv6 تشریح ګوري ممکن دا خورا ستونزمن وي. وروسته ښکلی 64.233.177.101 موږ ناڅاپه ورسره مخامخ یو 2607:f8b0:4002:c08::8b او موږ ممکن مغشوش شو. دواړه په ترتیب سره د 32 او 128 بټونو یوازې د انسان لوستلو وړ نمایشونه دي. هر IP پاکټ د هر بټ لپاره د سخت معیاري هدف سره سرلیک لري. پرته له دې چې د سرلیکونو جوړښت ته ژور لاړ شو، یو شی چې موږ یې باید له دې څخه لیرې کړو هغه دا دی چې د IP پتې او رینجونو سره د عملیاتو لپاره، دا عموما د بائنری ریاضیاتو او بټ وار عملیات کارول اسانه دي. دا په ډیټابیس کې د ذخیره کولو لپاره خورا اسانه هم دی بائنری(4) د IPv4 لپاره او بائنری(16) د IPv6 لپاره.
بل مهم اړخ چې د لمس کولو وړ دی د شبکې ماسکونه او د CIDR نوټیشن دی. CIDR د کلاس لیس انټر ډومین روټینګ لپاره لنډیز دی (). دې مفهوم د ټولګي مفهوم ځای په ځای کړی ترڅو معلومه کړي چې د IP پتې کومه برخه د شبکې مخکینۍ برخه ده، او کومه برخه په دې شبکه کې د شبکې انٹرفیس پته ده. په عمل کې، لومړی n بټونه چې د مخکینۍ سره مطابقت لري 1 ته ټاکل کیږي، پاتې نور 0 ته.
د انسان د پوهیدو وړ بڼه کې، دا په بڼه لیکل کیږي ip.add.re.ss/cidr. د مثال په توګه 64.233.177.0/24 په ګوته کوي چې لومړی 24 بټونه مخکیني ته اشاره کوي. وروستي 8 بټونه، چې د انسان د لوستلو وړ یادښت کې د وروستي شمیر په نوم هم پیژندل کیږي، د فرعي نیټ دننه پته ته مراجعه کوي. یو څو نور تمرینونه. 64.233.177.101/32 и 2607:f8b0:4002:c08::8b/128 - یو ځانګړی پته. 2607:f8b0:4002:c08::/64 - لومړی 64 بټونه (لومړی 4 ګروپونه) مخکینی دی، پاتې 64 بټونه محلي برخه ده. په هرصورت، که څوک په ننوتلو کې د "::" له امله ګډوډ وي، ډبل کولن د 0 برخو په خپل سري شمیره بدلوي. دا یوازې یو ځل په تشریح کې ښکاره کیدی شي. په بل عبارت، 2607:f8b0:4002:c08::8b = 2607:f8b0:4002:c08:0:0:0:8b.
موږ باید له دې ټولو څخه څه زده کړو؟ لومړی، لومړی او وروستی فرعي پته د بائنری AND او OR په کارولو سره ترلاسه کیدی شي، په بائنری بڼه کې د ماسک په پوهیدو سره. دوهم، د راتلونکي فرعي نیټ اندازه (د بیلګې په توګه د CIDR سره) n د 1 په اضافه کولو سره محاسبه کیدی شي n- په بائنری نمایندګي کې دا موقف. د بائنری په واسطه زما مطلب د افعال کارولو پایله ده بسته () и inet_pton() او نور استعمال ، د بائنری لخوا د بائنری سیسټم نمایندګي ده چې د دې لخوا ترلاسه کیدی شي ، ووایه ، base_convert().
تاریخي پس منظرد ټولګي بې برخې پته د ټولګي جلا کولو څخه مخکې وه. په دې لیرې کلونو کې، هیچا تصور هم نه کاوه چې دومره ډیری فرعي سایټونه به وي؛ دوی په لوی بلاکونو کې کیڼ او ښي خوا ویشل شوي وو: ټولګي A - مخکینی لومړی 8 بټونه (یعنې لومړی شمیره) وه، د 0 مخکښ بټ سره؛ ټولګي B - لومړی 16 (لومړی دوه شمیرې)، مخکښ بټونه 10؛ کلاس C - لومړی 24 بټونه، مخکښ بټونه 110. دا مخکښ بټونه هغه سلسلې مشخصوي چې په کوم کې د ځانګړي ټولګي پته خپره شوې وه: 0.0.0.0 - 127.255.255.255 د A ټولګي لپاره، 128.0.0.0 - 191.255.255.255 - ټولګي B، 192.0.0.0 - 223.255.255.255 - کلاس C. لکه څنګه چې انټرنیټ په ټوله نړۍ کې خپور شو، تنظیم کونکي پوه شول چې دوی نښه له لاسه ورکړې، او د 90 لسیزې په لومړیو کې دوی یو بې کلاسیک مفهوم رامینځته کړ چې دا یې ممکنه کړه چې تړل نشي. مخکښو برخو ته. یو څه نور تفصیل په کې موندل کیدی شي، ووایه: .
راځئ چې تمرین ته لاړ شو
په عمل کې، موږ به درې ډیری احتمالي پلي کړو، لکه څنګه چې ما ته ښکاري، دندې:
- د رینج لومړی او وروستی پته ترلاسه کول؛
- د بل ورکړل شوي اندازې حد ترلاسه کړئ (CIDR)؛
- چک کول چې ایا پته د یوې لړۍ پورې اړه لري.
تطبیق به د IPv6 لپاره وي، مګر که اړتیا وي، منطق په اسانۍ سره تطبیق کیدی شي. ما یو څه نظرونه ترلاسه کړل ، مګر دا یو څه بل ډول پلي کوي. همچنان ، مثالونه د ننوتلو غلطیو لپاره نه ګوري. نو، راځئ چې لاړ شو.
لکه څنګه چې ما مخکې یادونه وکړه، د رینج لومړی او وروستنی پته د bitwise عملیاتو په کارولو سره ټاکل کیدی شي، د رینج پیل او د بائنری سبنیټ ماسک په پوهیدو سره. په دې اساس، لومړی شی چې موږ یې کولو ته اړتیا لرو CIDR په بائنری ماسک بدل کړو. د دې کولو لپاره، موږ به د هغې هیکس نمایش راټول کړو او په بائنری کې به یې بسته کړو.
function cidrToMask ($cidr) {
$mask = str_repeat('f', ceil($cidr / 4));
$mask .= dechex(4 * ($cidr % 4));
$mask = str_pad($mask, 32, '0');
return pack('H*', $mask);
}ننګونې بسته ('H*'، $ماسک) د هیکس نمایش په ورته ډول بسته کوي inet_pton(). یوازینی توپیر دا دی چې کله زنګ ووهئ بسته () ټول 0s باید په خپلو ځایونو کې وي، او په ننوتلو کې باید هیڅ کولن نه وي، د انسان د لوستلو وړ ننوتلو برعکس.
بل ګام د حد پیل او پای محاسبه کول دي. او دلته باریکونه راپورته کیږي. د Bitwise عملیات د پروسیسر د بټ ظرفیت لخوا محدود دي. په دې اساس، زما په 32-bit CubieTruck کې، کوم چې زه ځینې وختونه د هر ډول ازموینې پامیر کولو لپاره کاروم، دا به ممکنه نه وي چې د پتې ټول 128 بټونه په یوه عملیات کې پروسس شي. په هرصورت، هیڅ شی موږ ته د 32 بټونو په ګروپونو کې د ویشلو مخه نه نیسي (یوازې په هغه صورت کې چې څوک پوهیږي چې کوم پروسیسرونه به یې پرمخ بوځي).
function getRangeBoundary ($ip, $cidr, $which, $ipIsBin = false, $returnBin = false) {
$mask = cidrToMask($cidr);
if (!$ipIsBin) {
$ip = inet_pton($ip);
}
$ipParts = str_split($ip, 4);
$maskParts = str_split($mask, 4);
$rangeParts = [];
for ($i = 0; $i < count($ipParts); $i++) {
if ($which == 'start') {
/* Побитовый & адреса и маски оставит только биты префикса. */
$rangeParts[$i] = $ipParts[$i] & $maskParts[$i];
} else {
/* Побитовый | с обратной маской (~) оставит биты префикса и установит все биты локальной части в 1. */
$rangeParts[$i] = $ipParts[$i] | ~$maskParts[$i];
}
}
$rangeBoundary = implode($rangeParts);
if ($returnBin) {
return $rangeBoundary;
} else {
return inet_ntop($rangeBoundary);
}
}د راتلونکي کارونې لپاره، موږ به د IP لیږدولو وړتیا چمتو کړو او پایله به په بائنری او د انسان د لوستلو وړ بڼه ترلاسه کړو. پیرامیټر $کوم دلته دا مشخص کوي چې ایا موږ غواړو د لړۍ پیل یا پای ترلاسه کړو (ارزښتونه 'پیل' او یا 'پای' په ترتیب سره).
راتلونکی دنده (او زموږ د شرکت لپاره خورا عملي) د راتلونکي رینج محاسبه کول دي. د دې کار لپاره، په ذهن کې هیڅ ښه نه و چې پته په بائنری تار کې پراخه کړئ او په مطلوب موقعیت کې 1 اضافه کړئ، او بیا هرڅه بیرته سقوط کړئ. د دې لپاره چې د هنري اثارو هرچیرې څرګندیدو مخه ونیسئ ، ما پریکړه وکړه چې پته د تخریب او مجلس پرمهال د بایټ په واسطه تقسیم کړم.
function getNextBlock ($ipStart, $cidr, $ipIsBin = false, $returnBin = false) {
if (!$ipIsBin) {
$ipStart = inet_pton($ipStart);
}
$ipParts = str_split($ipStart, 1);
$ipBin = '';
foreach ($ipParts as $ipPart) {
$ipBin .= str_pad(base_convert(unpack('H*', $ipPart)[1], 16, 2), 8, '0', STR_PAD_LEFT);
}
/* Добавляем 1 в нужном разряде двоичного представления строки "влоб" :) */
$i = $cidr - 1;
while ($i >= 0) {
if ($ipBin[$i] == '0') {
$ipBin[$i] = '1';
break;
} else {
$ipBin[$i] = '0';
}
$i--;
}
$ipBinParts = str_split($ipBin, 8);
foreach ($ipBinParts as $key => $ipBinPart) {
$ipParts[$key] = pack('H*', str_pad(base_convert($ipBinPart, 2, 16), 2, '0', STR_PAD_LEFT));
}
$nextIp = implode($ipParts);
if ($returnBin) {
return $nextIp;
} else {
return inet_ntop($nextIp);
}
}په محصول کې موږ د راتلونکي اندازې سلسلې مخکینۍ ترلاسه کوو چې په کې مشخص شوي $cidr. د دې فعالیت سره موږ خپلو پیرودونکو ته د پتې بلاکونه تخصیص کوو.
په نهایت کې ، چک کول چې ایا پته د حد پورې اړه لري. د مثال په توګه، موږ پیرودونکو ته د بلاکونو ویشلو لپاره یو بلاک / 48 تخصیص کړی /64، او موږ اړتیا لرو ډاډ ترلاسه کړو چې د ګمارلو پرمهال موږ د تخصیص شوي بلاک څخه بهر نه ځو (په عمل کې دا به ژر نه پیښ شي ، مګر لاهم امکان شتون لري). دلته هرڅه ساده دي. موږ د رینج پیل او پای په بائنری شکل کې ترلاسه کوو او وګورو چې ایا پته د حدودو دننه ده.
function ipInRange ($ip, $rangeStart, $cidr) {
$start = getRangeBoundary($rangeStart, $cidr, 'start',false, true);
$end = getRangeBoundary($rangeStart, $cidr, 'end',false, true);
$ipBin = inet_pton($ip);
return ($ipBin >= $start && $ipBin <= $end);
}زه امید لرم چې دا ګټور و. ستاسو په نظر د ادرسونو سره د کار کولو لپاره نور کوم کارونه ګټور دي؟ هر ډول اضافې، نظرونه او د کوډ بیاکتنې په تبصرو کې په تودوخې سره ښه راغلاست دي.
که تاسو دمخه زموږ پیرودونکي یاست یا یوازې د یو کیدو په اړه فکر کوئ ، د دې مقالې خپرولو په جریان کې موږ تاسو ته وړاندیز کوو چې بلاک ترلاسه کړئ. /64 د ټولو vps خدماتو لپاره په بشپړ ډول وړیا یا د Equinix Tier IV ډیټا مرکز کې وقف شوي سرور، هالنډ د پلور څانګې ته په ټیکټ کې د دې مقالې لینک چمتو کولو سره غوښتنه کوي. وړاندیز د مارچ تر 2020 پورې اعتبار لري.
ځینې اعلانونه 🙂
له موږ سره د پاتې کیدو لپاره مننه. ایا تاسو زموږ مقالې خوښوي؟ غواړئ نور په زړه پورې مینځپانګه وګورئ؟ د امر په ورکولو یا ملګرو ته وړاندیز کولو سره زموږ ملاتړ وکړئ ، , د ننوتلو کچې سرورونو یو ځانګړی انلاګ ، کوم چې زموږ لخوا ستاسو لپاره اختراع شوی و: (د RAID1 او RAID10 سره شتون لري، تر 24 کور پورې او تر 40GB DDR4 پورې).
ډیل R730xd په امستردام کې د Equinix Tier IV ډیټا مرکز کې 2 ځله ارزانه؟ یوازې دلته په هالنډ کې! ډیل R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - له $ 99 څخه! په اړه ولولئ
سرچینه: www.habr.com
