Kita bubar nampa status LIR lan /29 blok IPv6. Banjur perlu kanggo nglacak subnet sing ditugasake. Lan amarga tagihan kita ditulis ing PHP, kita kudu nliti masalah kasebut sethithik lan ngerti yen basa iki ora paling ramah babagan nggarap IPv6. Ing ngisor potongan kasebut minangka solusi kanggo masalah sing muncul nalika nggarap alamat lan kisaran. Mbok menawa dudu sing paling elegan, nanging nindakake tugas kasebut.

Minangka teori
Penafian. Yen sampeyan ngerti apa IPv6 lan apa sing disedhiyakake, bagean iki bisa uga mboseni kanggo sampeyan. Bisa uga ora.
Wong sing sepisanan ndeleng anotasi IPv6 bisa uga angel banget. Sawise elegan 64.233.177.101 kita dumadakan ngadhepi 2607:f8b0:4002:c08::8b lan kita bisa uga bingung. Loro-lorone mung perwakilan sing bisa diwaca manungsa saka 32 lan 128 bit, masing-masing. Sembarang paket IP ngemot header kanthi tujuan standar sing ketat kanggo saben bit. Tanpa luwih jero babagan struktur header, siji bab sing kudu kita lakoni yaiku kanggo operasi karo alamat IP lan kisaran, umume trep nggunakake matématika binar lan operasi bitwise. Iku uga paling trep kanggo nyimpen ing database minangka BINARI(4) kanggo IPv4 lan BINARI(16) kanggo IPv6.
Aspek penting liyane sing kudu didemek yaiku topeng jaringan lan notasi CIDR. CIDR minangka akronim saka Classless Inter-Domain Routing (). Konsep iki wis ngganti konsep kelas kanggo nemtokake bagean alamat IP minangka awalan jaringan, lan bagean kasebut minangka alamat antarmuka jaringan ing jaringan iki. Ing praktik, n bit pisanan sing cocog karo awalan bakal disetel dadi 1, liyane dadi 0.
Ing wangun dingerteni manungsa, iki ditulis ing wangun ip.add.re.ss/cidr. Contone, 64.233.177.0/24 nuduhake yen 24 bit pisanan nuduhake awalan. 8 bit pungkasan, uga dikenal minangka nomer pungkasan ing notasi sing bisa diwaca manungsa, deleng alamat ing subnet. Saperangan latihan liyane. 64.233.177.101/32 и 2607:f8b0:4002:c08::8b/128 - siji alamat tartamtu. 2607:f8b0:4002:c08::/64 - 64 bit pisanan (4 klompok pisanan) minangka awalan, sisa 64 bit minangka bagéan lokal. Miturut cara, yen ana sing bingung karo "::" ing entri, titik dobel ngganti nomer sewenang-wenang saka bagean sing ngemot 0. Bisa katon mung sapisan ing anotasi. Ing tembung liya, 2607:f8b0:4002:c08::8b = 2607:f8b0:4002:c08:0:0:0:8b.
Apa sing kudu kita sinau saka kabeh iki? Kaping pisanan, alamat subnet pisanan lan pungkasan bisa dipikolehi nggunakake binar AND lan OR, ngerti topeng ing wangun binar. Kapindho, ukuran subnet sabanjure (yaiku karo CIDR) n bisa diwilang kanthi nambah 1 kanggo n-posisi kasebut ing perwakilan binar. Kanthi binar tegese asil nggunakake fungsi paket() и inet_pton() lan nggunakake luwih , kanthi binar yaiku perwakilan sistem biner sing bisa diduweni dening, ucapake, base_convert().
Latar belakang SajarahPengalamatan tanpa kelas didhisiki pemisahan kelas. Ing taun-taun sing adoh, ora ana sing mbayangake manawa bakal ana akeh subnet, disebarake ing kiwa lan tengen ing blok gedhe: kelas A - awalan yaiku 8 bit pisanan (yaiku nomer pisanan), kanthi bit 0; kelas B - pisanan 16 (loro nomer pisanan), anjog bit 10; kelas C - pisanan 24 bit, anjog bit 110. Iki leading bits nemtokake kisaran kang alamat kelas tartamtu ditanggepi: 0.0.0.0 - 127.255.255.255 kanggo kelas A, 128.0.0.0 - 191.255.255.255 - kelas B, 192.0.0.0 - 223.255.255.255 - kelas C. Nalika Internet nyebar ing saindhenging planet, regulator nyadari yen dheweke wis ora kejawab, lan ing awal 90-an dheweke ngembangake konsep tanpa kelas sing ndadekake ora bisa diikat. menyang bit anjog. Rincian liyane bisa ditemokake ing, ucapake, .
Ayo padha nerusake kanggo latihan
Ing praktik, kita bakal ngetrapake telung tugas sing paling mungkin, kaya sing dakkarepake:
- entuk alamat pisanan lan pungkasan saka sawetara;
- entuk kisaran ukuran sabanjure (CIDR);
- mriksa apa alamat kalebu sawetara.
Implementasine bakal kanggo IPv6, nanging yen perlu, logika bisa gampang diadaptasi. Aku entuk sawetara gagasan , nanging dileksanakake rada beda. Uga, conto ora mriksa kesalahan input. Dadi, ayo padha lunga.
Kaya sing wis dakcritakake, alamat pisanan lan pungkasan saka sawetara bisa ditemtokake kanthi nggunakake operasi bitwise, ngerti wiwitan kisaran lan topeng subnet binar. Mula, sing pertama kudu ditindakake yaiku ngowahi CIDR dadi topeng binar. Kanggo nindakake iki, kita bakal ngumpulake perwakilan hex lan ngemas dadi binar.
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);
}Telpon paket('H*', $topeng) ngemas perwakilan hex ing cara sing padha inet_pton(). Bedane mung nalika nelpon paket() kabeh 0s kudu ing panggonan, lan ora ana titik titik ing entri, ora kaya entri sing bisa diwaca manungsa.
Langkah sabanjure yaiku ngetung wiwitan lan pungkasan kisaran. Lan kene nuances muncul. Operasi bitwise diwatesi dening kapasitas bit prosesor. Patut, ing CubieTruck 32-dicokot, kang kadhangkala digunakake kanggo kabeh jinis test pampering, iku ora bakal bisa kanggo proses kabeh 128 bit alamat ing siji operasi. Nanging, ora ana sing ngalang-alangi kita dibagi dadi kelompok 32 bit (mung yen, sapa ngerti prosesor apa sing bakal kita lakoni).
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);
}
}Kanggo nggunakake ing mangsa ngarep, kita bakal menehi kemampuan kanggo ngirim IP lan nampa asil ing wangun binar lan bisa diwaca manungsa. Parameter $kang ing kene nemtokake manawa kita pengin entuk wiwitan utawa pungkasan kisaran (nilai 'wiwit' utawa 'mburi' mungguh).
Tugas sabanjure (lan uga sing paling praktis kanggo perusahaan kita) yaiku ngitung kisaran sabanjure. Kanggo tugas iki, ora ana sing luwih apik tinimbang nggedhekake alamat menyang senar binar lan nambah 1 ing posisi sing dikarepake, banjur ambruk kabeh maneh. Supaya artefak ora katon ing ngendi wae, aku mutusake kanggo pamisah alamat kanthi bait sajrone dekomposisi lan perakitan.
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);
}
}Ing output, kita entuk awalan saka sawetara ukuran sabanjure sing ditemtokake ing $cidr. Kanthi fungsi iki, kita nyedhiyakake blok alamat menyang klien.
Pungkasan, priksa manawa alamat kasebut kalebu kisaran. Contone, kita nyedhiyakake siji blok / 48 kanggo nyebarake blok menyang klien /64, lan kita kudu nggawe manawa nalika nemtokake kita ora ngluwihi pemblokiran diparengake (ing laku iki ora bakal kelakon rauh, nanging isih ana kamungkinan). Kabeh iku prasaja ing kene. Kita entuk wiwitan lan pungkasan kisaran kanthi bentuk binar lan priksa manawa alamat kasebut ana ing watesan.
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);
}Mugi iki migunani. Apa fungsi liyane kanggo nggarap alamat sing bisa migunani miturut sampeyan? Sembarang tambahan, komentar lan review kode sambutan apik ing komentar.
Yen sampeyan wis dadi klien utawa mung mikir dadi siji, nalika nerbitake artikel iki, kita nawakake sampeyan nampa blokir /64 rampung free kanggo kabeh layanan vps utawa server darmabakti ing pusat data Equinix Tier IV, Walanda marang panyuwunan kanggo departemen sales kanthi menehi link kanggo artikel iki ing tiket. Penawaran berlaku nganti Maret 2020.
Sawetara iklan 🙂
Matur nuwun kanggo tetep karo kita. Apa sampeyan seneng karo artikel kita? Pengin ndeleng konten sing luwih menarik? Ndhukung kita kanthi nggawe pesenan utawa menehi rekomendasi menyang kanca, , analog unik saka server level entri, sing diciptakake kanggo sampeyan: (kasedhiya karo RAID1 lan RAID10, munggah 24 intine lan nganti 40GB DDR4).
Dell R730xd 2 kaping luwih murah ing pusat data Equinix Tier IV ing Amsterdam? Mung kene ing Walanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - saka $99! Maca babagan
Source: www.habr.com
