અમને તાજેતરમાં 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() અને વધુ ઉપયોગ , દ્વિસંગી દ્વારા દ્વિસંગી સિસ્ટમનું પ્રતિનિધિત્વ છે જે કહો, દ્વારા મેળવી શકાય છે. આધાર_રૂપાંતર().
ઐતિહાસિક પૃષ્ઠભૂમિવર્ગવિહીન સંબોધન વર્ગ વિભાજન દ્વારા પહેલા હતું. તે દૂરના વર્ષોમાં, કોઈએ કલ્પના પણ કરી ન હતી કે ત્યાં ઘણા બધા સબનેટ હશે; તે મોટા બ્લોક્સમાં ડાબે અને જમણે વિતરિત કરવામાં આવ્યા હતા: વર્ગ 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 માટે હશે, પરંતુ જો જરૂરી હોય તો, તર્કને સરળતાથી સ્વીકારી શકાય છે. મને કેટલાક વિચારો મળ્યા , પરંતુ તેનો અમલ થોડો અલગ રીતે કર્યો. ઉપરાંત, ઉદાહરણો ઇનપુટ ભૂલો માટે તપાસતા નથી. તો, ચાલો જઈએ.
મેં પહેલેથી જ ઉલ્લેખ કર્યો છે તેમ, શ્રેણીની શરૂઆત અને બાઈનરી સબનેટ માસ્કને જાણીને, બીટવાઇઝ ઓપરેશન્સનો ઉપયોગ કરીને શ્રેણીનું પ્રથમ અને છેલ્લું સરનામું નક્કી કરી શકાય છે. તદનુસાર, આપણે સૌ પ્રથમ 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*', $mask) હેક્સ રજૂઆતને તે જ રીતે પેક કરે છે inet_pton(). ફરક માત્ર એટલો જ છે કે ફોન કરતી વખતે પેક() બધા 0 તેમની જગ્યાએ હોવા જોઈએ, અને માનવ-વાંચી શકાય તેવી એન્ટ્રીથી વિપરીત એન્ટ્રીમાં કોઈ કોલોન ન હોવા જોઈએ.
આગળનું પગલું એ શ્રેણીની શરૂઆત અને અંતની ગણતરી કરવાનું છે. અને અહીં ઘોંઘાટ ઊભી થાય છે. બીટવાઇઝ કામગીરી પ્રોસેસરની બીટ ક્ષમતા દ્વારા મર્યાદિત છે. તદનુસાર, મારા 32-બીટ ક્યુબીટ્રક પર, જેનો હું કેટલીકવાર તમામ પ્રકારના ટેસ્ટ પેમ્પરિંગ માટે ઉપયોગ કરું છું, એક ઑપરેશનમાં સરનામાના તમામ 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 ટિકિટમાં આ લેખની લિંક આપીને વેચાણ વિભાગની વિનંતી પર નેધરલેન્ડ, ઇક્વિનિક્સ ટિયર IV ડેટા સેન્ટરમાં તમામ vps સેવાઓ અથવા સમર્પિત સર્વર માટે સંપૂર્ણપણે મફત. આ ઓફર માર્ચ 2020 સુધી માન્ય છે.
કેટલીક જાહેરાતો 🙂
અમારી સાથે રહેવા બદલ આભાર. શું તમને અમારા લેખો ગમે છે? વધુ રસપ્રદ સામગ્રી જોવા માંગો છો? ઓર્ડર આપીને અથવા મિત્રોને ભલામણ કરીને અમને ટેકો આપો, , એન્ટ્રી-લેવલ સર્વર્સનું એક અનન્ય એનાલોગ, જેની શોધ અમારા દ્વારા તમારા માટે કરવામાં આવી છે: (RAID1 અને RAID10 સાથે ઉપલબ્ધ, 24 કોરો સુધી અને 40GB DDR4 સુધી).
એમ્સ્ટરડેમમાં ઇક્વિનિક્સ ટાયર IV ડેટા સેન્ટરમાં ડેલ R730xd 2 ગણું સસ્તું? માત્ર અહીં નેધરલેન્ડમાં! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - $99 થી! વિશે વાંચો
સોર્સ: www.habr.com
