محاسبه محدوده و رنج آدرسIP از Subnet Mask
وقتی یک شبکه طراحی میکنیم، همیشه باید بدانیم که در این شبکه به چند آدرس نیاز داریم. همچنین میخواهیم Range آدرسهای IP شبکه خود را بدانیم تا بتوانیم برای هر دستگاه در شبکه یک آیپی اختصاص دهیم. در این مطلب، قصد داریم یک روش ساده برای یافتن range آدرسهای IP از طریق subnet mask را نشان دهیم.
در IPv4، آدرس IP از عدد 32 بیتی تشکیل شده است و ما آن را با 4 اکتت یا octet (هر کدام 8 بیت) نشان میدهیم. معمولا وقتی حرف از شبکه میزنیم به یک سابنت (subnet) هم اشاره میکنیم که میتواند یک عدد باشد (مثلا 24/) و میتوان آن را مانند یک آدرس IP هم نوشت (مثال 255.255.255.0/). از طریق سابنت، میخواهیم بفهمیم که آدرسهای IP در این شبکه چیست.
به عنوان مثال، اگر یک شبکه 192.168.0.1/24 (یا با سابنت 255.255.255.0) داشته باشیم، در این صورت 256 آدرس قابل استفاده از 192.168.0.0 تا 192.168.0.255 داریم.
ایده الگوریتم
به طور کلی، اگر ما با آدرس IP به عنوان یک عدد 32 بیتی برخورد کنیم و subnet mask را x داشته باشیم، آنگاه subnet mask از نظر تئوری میتواند مقادیری بین [32، 0] بگیرد و ما باید دو چیز را تخمین بزنیم، تعداد آدرسهای ممکن با subnet mask داده شده و آدرس شروع.
با فرمول 2 به توان (32-x) میتوانیم به راحتی تعداد آدرسهای ممکن را به دست آوریم. این بدان معناست که اگر subnet mask صفر داشته باشیم، آدرسهای ممکن 2 به توان 32 هستند و اگر subnet mask را 32 داشته باشیم، تعداد آدرسهای ممکن 2 به توان صفر (یک)است، یعنی آدرس داده شده تنها آدرس ممکن در این مورد است. یک مثال دیگر در مورد subnet mask مثلا 24/ را در نظر بگیریم ، 2 به توان (24-32) که میشود 2 به توان 8 و برابر با 256 آدرس خواهیم داشت.
بعد باید این subnet mask را به شکل octets تفسیر کرد. اگر subnetmask ما 24/ باشد، در واقع یک عدد 32 بیتی داریم که بیشترین 24 بیت را به عنوان یک دارد و بقیه صفر هستند:
از جدول قبلی، ببینیم که چگونه subnet mask را میتوان تفسیر کرد، اگر یک آدرس IP مانند 192.168.0.10/24 داشته باشیم، میتوانیم آن را در جدول بنویسیم تا با اکتتهای باینری مقایسه شود:
آدرس شروع Subnet
برای پیدا کردن آدرس شروع در سابنت زیر، کافیست به سادگی عملیات and باینری را بین آدرس IP و subnet mask انجام دهیم:
آخرین آدرس Subnet
در نهایت، آخرین آدرس IP را با اعمال عملیات or روی آن با معکوس باینری بیتی subnet mask به آدرس IP اول محاسبه میکنیم:
با این مراحل ساده، میدانیم که چگونه تعداد آدرسهای IP ممکن را پیدا کنیم، همچنین میتوانیم اولین و آخرین آدرس IP را پیدا کنیم و محدوده (Range) از 192.168.0.0 تا 192.168.0.255 میشود.
مثالها:
اگر subnet mask داشته باشیم که دقیقا در یکی از اکتتها نباشد، همین ایده اتفاق میافتد. بیایید نمونه 192.168.0.10/30 را ببینیم. با پیروی از همین ایده، 2 به توان 2 یعنی 4 آدرس IP ممکن داریم:
یک مثال دیگر را در نظر بگیریم که در آن subnet mask در اکتت آخر مانند 10.0.0.0/20 نیست. در این مورد ما 2 به توان (32-20)یعنی 2 به توان 12 که میشود 4096 آدرس IP ممکن داریم:
خوشبختانه، در بیشتر زبانهای برنامه نویسی، برای انجام عملیات باینری نیازی به تبدیل بین باینری و دسیمال نداریم. بنابراین، میتوانیم عملیات باینری را مستقیم روی اکثر اعداد قابل شمارش (مانند اعداد صحیح یا کاراکترها) اعمال کنیم. به عبارت دیگر، میتوان آدرس IP را با یک عدد 32 بیتی یا با استفاده از 4 رقم هر کدام 8 بیت (مانند کاراکترها یا بایتها) نشان داد.
خرید سرور مجازی در پنج موقعیت جغرافیایی ایران، ترکیه، هلند، آلمان و آمریکا با قابلیت تحویل آنی در پارسدو فراهم است.
IPv6
در IPv6، همان ایده subnet مشابه IPv4 است. اما تفاوت در اندازه آدرس و محدوده (Range) مجاز است. آدرس IPv6 دارای 128 بیت در مقایسه با 32 بیت در IPv4 است. آدرس در 8 بخش در مقایسه با 4 اکتت در IPv4 نشان داده شده است. هر بخش دارای 4 عدد هگز (hex) است که از 0 تا FFFF در مقایسه با 8 بیت در هر اکتت در IPv4 با دامنه دسیمال 0 تا 255 استفاده میکند.
به طور کلی، میتوانیم تعداد آدرسهای IP موجود را به همان روشی که در IPv4 انجام دادیم، به دست آوریم. بنابراین، اگر یک subnet به اندازه x داشته باشیم، 2 به توان (128-x) آدرس IP موجود داریم که با اعمال بیتی و با ماسکی به اندازه 128 بیت میتوانیم اولین آنها را محاسبه کنیم که x بیتهای اول یک و بقیه صفر هستند و با اضافه کردن اولین آدرس به معکوس ماسک (128 بیت با بیتهای x اول صفر و بقیه یک هستند) میتوانیم آخرین آدرس را به دست آوریم.
بیایید یک مثال IPv6 برای 2001 : 124A : 2000 : 1000 : 0000 : 0000 : 0000 : 0000 /48 ببینیم. توجه داشته باشید که هر بخش به صورت 4 رقم هگز نوشته شده است که برابر با 16 بیت باینری است. تعداد آدرسها 2 به توان (128-48) یعنی 2 به توان 80 خواهد بود:
توجه داشته باشید که FFFF معادل 16 یک است 1111111111111111. نکته دیگر این است که آدرس IPv6 همچنین میتواند با حذف صفرهای ابتدایی در هر بخش، اشکال کوتاه داشته باشد.
بنابراین، آدرس اول مثال خود را می نویسیم:
2001 : 124A : 2000 : 0 : 0 : 0 : 0
و شکل کوتاه شده دیگر این است که یکی از دنبالههای سگمنتهای خالی (همه segmentهای صفر) را با double colon جایگزین کنید. بنابراین، شکل کوتاه شده دیگر این آدرس می شود:
2001 : 124A : 2000 ::
توجه داشته باشید که نسخه کوتاه شده بیش از یک بار اجازه حذف بخشهای صفر را نمیدهد. بنابراین، اگر داریم :
2001 : 124A : 2000 : 0000 : 0000 : 1234 :0000 :0000
نسخه کوتاه شده به صورت زیر خواهد بود:
2001 : 124A : 2000 : : 1234 : 0 : 0
یا:
2001 : 124A : 2000 : 0 : 0 : 1234 ::
در این نسخه کوتاه شده، میتوانیم بدانیم چند صفر حذف شدهاند، زیرا میدانیم که ۱۲۸ بیت داریم که به ۸ بخش تقسیم شدهاند. بنابراین، ما می دانیم که چند بخش از 8 حذف میشود و اینها صفرهایی هستند که حذف شدهاند.
پیچیدگی
پیچیدگیهای زمانی و مکانی یافتن Range آیپی O(1) است زیرا ما فقط باید سابنت را در فرمولی قرار دهیم تا range را پیدا کنیم.
نتیجه گیری
در این مطلب روش سادهای را برای تخمین Range آدرسهای IP ممکن از زیر طریق subnet mask توضیح دادهایم. حتما نظرات خود را در این باره در بخش نظرات با ما در میان بگذارید.