ipaddress --- کتابخانهی دستکاری IPv4/IPv6¶
کد منبع: Lib/ipaddress.py
ipaddress قابلیتهایی برای ایجاد، دستکاری و کار با نشانیها و شبکههای IPv4 و IPv6 فراهم میکند.
توابع و کلاسهای این ماژول، انجام وظایف مختلف مربوط به آدرسهای IP را ساده میکنند؛ از جمله بررسی این که آیا دو میزبان در یک زیرشبکه هستند یا خیر، پیمایش روی تمام میزبانهای یک زیرشبکه خاص، بررسی این که آیا یک رشته نشاندهنده یک آدرس IP معتبر یا تعریف شبکه است یا خیر، و غیره.
این مرجع کامل API ماژول است—برای مرور کلی و مقدمه، مقدمهای بر ماژول ipaddress را ببینید.
اضافه شده در نسخهی 3.3.
توابع کارخانهای سهولتبخش¶
ماژول ipaddress توابع کارخانهای (factory functions) را برای ایجاد آسان آدرسهای IP، شبکهها و رابطها ارائه میدهد:
- ipaddress.ip_address(address)¶
یک شیء
IPv4AddressیاIPv6Addressرا بسته به نشانی IP دادهشده بهعنوان آرگومان برمیگرداند. میتوان نشانیهای IPv4 یا IPv6 را ارائه کرد؛ اعداد صحیح کوچکتر از2**32بهطور پیشفرض IPv4 در نظر گرفته میشوند. اگر address نشاندهنده یک نشانی IPv4 یا IPv6 معتبر نباشد، یکValueErrorپرتاب میشود.>>> ipaddress.ip_address('192.168.0.1') IPv4Address('192.168.0.1') >>> ipaddress.ip_address('2001:db8::') IPv6Address('2001:db8::')
- ipaddress.ip_network(address, strict=True)¶
یک شیء
IPv4NetworkیاIPv6Networkرا بسته به آدرس IP ارسالشده بهعنوان آرگومان بازمیگرداند. address یک رشته یا عدد صحیح است که نشاندهندهی شبکهی IP است. میتوان شبکههای IPv4 یا IPv6 را ارائه کرد؛ اعداد صحیح کوچکتر از2**32بهطور پیشفرض IPv4 در نظر گرفته میشوند. strict به سازندهیIPv4NetworkیاIPv6Networkارسال میشود. اگر address نشاندهندهی یک آدرس IPv4 یا IPv6 معتبر نباشد، یا اگر شبکه دارای بیتهای میزبان تنظیمشده باشد، یک استثنایValueErrorپرتاب میشود.>>> ipaddress.ip_network('192.168.0.0/28') IPv4Network('192.168.0.0/28')
- ipaddress.ip_interface(address)¶
بسته به نشانی IP دادهشده بهعنوان آرگومان، یک شیء
IPv4InterfaceیاIPv6Interfaceبرمیگرداند. address یک رشته یا عدد صحیح است که نشانی IP را نشان میدهد. میتوان نشانیهای IPv4 یا IPv6 را ارائه کرد؛ اعداد صحیح کوچکتر از2**32بهطور پیشفرض IPv4 در نظر گرفته میشوند. اگر address یک نشانی IPv4 یا IPv6 معتبر را نشان ندهد، استثنایValueErrorپرتاب میشود.
یکی از معایب این توابع کمکی این است که نیاز به پشتیبانی از هر دو قالب IPv4 و IPv6 باعث میشود پیامهای خطا اطلاعات حداقلی دربارهی خطای دقیق ارائه کنند، زیرا توابع نمیدانند قالب IPv4 مدنظر بوده است یا IPv6. گزارش خطای با جزئیات بیشتر را میتوان با فراخوانی مستقیم سازندههای کلاس متناسب با نسخه به دست آورد.
آدرسهای IP¶
اشیای نشانی¶
اشیای IPv4Address و IPv6Address ویژگیهای مشترک زیادی دارند. برخی از ویژگیها که فقط برای آدرسهای IPv6 معنادار هستند، توسط اشیای IPv4Address نیز پیادهسازی شدهاند، تا نوشتن کدی که هر دو نسخهی IP را بهدرستی مدیریت میکند، آسانتر شود. اشیای آدرس هشپذیر (hashable) هستند، بنابراین میتوان از آنها بهعنوان کلید در دیکشنریها استفاده کرد.
- class ipaddress.IPv4Address(address)¶
ساخت یک نشانی IPv4. اگر address یک نشانی IPv4 معتبر نباشد،
AddressValueErrorپرتاب میشود.عبارت زیر یک نشانی IPv4 معتبر را تشکیل میدهد:
رشتهای با نمادگذاری دهدهی-نقطهای، شامل چهار عدد صحیح دهدهی در بازهی بستهی ۰ تا ۲۵۵ است که با نقطه از هم جدا شدهاند (مانند
192.168.0.1). هر عدد صحیح نشاندهندهی یک هشتبیتی (بایت) در نشانی است. صفرهای آغازین مجاز نیستند تا از اشتباه با نمایش مبنای هشت جلوگیری شود.عدد صحیحی که در ۳۲ بیت جای میگیرد.
یک عدد صحیح که در یک شیء
bytesبه طول ۴ بستهبندی شده است (ابتدا پرارزشترین هشتبیتی).
>>> ipaddress.IPv4Address('192.168.0.1') IPv4Address('192.168.0.1') >>> ipaddress.IPv4Address(3232235521) IPv4Address('192.168.0.1') >>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01') IPv4Address('192.168.0.1')
تغییر یافته در نسخهی 3.8: صفرهای پیشرو پذیرفته میشوند، حتی در موارد مبهمی که شبیه نمادگذاری مبنای هشت هستند.
تغییر یافته در نسخهی 3.9.5: صفرهای ابتدایی دیگر مجاز نیستند و بهعنوان خطا تلقی میشوند. رشتههای نشانی IPv4 اکنون به همان سختگیری glibc
inet_pton()تجزیه میشوند.- version¶
شمارهی نسخهی مناسب:
4برای IPv4،6برای IPv6.تغییر یافته در نسخهی 3.14: روی کلاس در دسترس قرار گرفته است.
- max_prefixlen¶
تعداد کل بیتها در نمایش نشانی برای این نسخه:
32برای IPv4،128برای IPv6.پیشوند تعداد بیتهای ابتدایی در یک نشانی را تعریف میکند که برای تعیین اینکه آیا یک نشانی بخشی از یک شبکه است یا خیر، مقایسه میشوند.
تغییر یافته در نسخهی 3.14: روی کلاس در دسترس قرار گرفته است.
- compressed¶
- exploded¶
نمایش رشتهای در نمادگذاری دهدهی نقطهدار. صفرهای آغازین هرگز در این نمایش گنجانده نمیشوند.
از آنجا که IPv4 نمادگذاری کوتاهشدهای برای نشانیهایی که هشتبیتیهای آنها روی صفر تنظیم شدهاند تعریف نمیکند، این دو ویژگی برای نشانیهای IPv4 همیشه با
str(addr)یکسان هستند. در دسترس قرار دادن این ویژگیها، نوشتن کد نمایشی را که بتواند هر دو نشانی IPv4 و IPv6 را مدیریت کند، آسانتر میکند.
- packed¶
بازنمایی دودویی این نشانی - یک شیء
bytesبا طول مناسب (ابتدا پرارزشترین هشتبیتی). این مقدار برای IPv4 برابر ۴ بایت و برای IPv6 برابر ۱۶ بایت است.
- reverse_pointer¶
نام رکورد PTR معکوس DNS برای نشانی IP، برای نمونه:
>>> ipaddress.ip_address("127.0.0.1").reverse_pointer '1.0.0.127.in-addr.arpa' >>> ipaddress.ip_address("2001:db8::1").reverse_pointer '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
این نامی است که میتوان از آن برای انجام جستوجوی PTR استفاده کرد، نه خود نام میزبان حلشده.
اضافه شده در نسخهی 3.5.
- is_multicast¶
اگر نشانی برای استفادهی چندپخشی (multicast) رزرو شده باشد،
Trueاست. RFC 3171 (برای IPv4) یا RFC 2373 (برای IPv6) را ببینید.
- is_private¶
Trueاگر نشانی توسط iana-ipv4-special-registry (برای IPv4) یا iana-ipv6-special-registry (برای IPv6) بهعنوان غیرقابلدسترس بهصورت سراسری تعریف شده باشد، با استثناهای زیر:is_privateبرای فضای آدرس مشترک (100.64.0.0/10) برابرFalseاستبرای آدرسهای IPv6 نگاشتشده به IPv4، مقدار
is_privateبر اساس معنای آدرسهای IPv4 زیرین تعیین میشود و شرط زیر برقرار است (بهIPv6Address.ipv4_mappedمراجعه کنید):address.is_private == address.ipv4_mapped.is_private
is_privateمقداری مخالفis_globalدارد، بهجز فضای آدرس مشترک (محدودهی100.64.0.0/10) که در آن هر دوFalseهستند.تغییر یافته در نسخهی 3.13: برخی مثبتهای کاذب و منفیهای کاذب برطرف شدند.
192.0.0.0/24بهاستثنای192.0.0.9/32و192.0.0.10/32خصوصی در نظر گرفته میشود (پیشتر: فقط زیرمحدودهی192.0.0.0/29خصوصی در نظر گرفته میشد).64:ff9b:1::/48خصوصی در نظر گرفته میشود.2002::/16خصوصی در نظر گرفته میشود.در
2001::/23استثناهایی وجود دارد (که در غیر این صورت خصوصی در نظر گرفته میشود):2001:1::1/128،2001:1::2/128،2001:3::/32،2001:4:112::/48،2001:20::/28،2001:30::/28. این استثناها خصوصی در نظر گرفته نمیشوند.
- is_global¶
Trueاگر نشانی توسط iana-ipv4-special-registry (برای IPv4) یا iana-ipv6-special-registry (برای IPv6) بهعنوان قابل دسترس سراسری تعریف شده باشد، با این استثنا:برای آدرسهای IPv6 نگاشتشده به IPv4، مقدار
is_privateبر اساس معنای آدرسهای IPv4 زیرین تعیین میشود و شرط زیر برقرار است (بهIPv6Address.ipv4_mappedمراجعه کنید):address.is_global == address.ipv4_mapped.is_global
is_globalمقداری مخالفis_privateدارد، بهجز فضای آدرس مشترک (محدوده100.64.0.0/10) که در آن هر دوFalseهستند.اضافه شده در نسخهی 3.4.
تغییر یافته در نسخهی 3.13: برخی مثبتهای کاذب و منفیهای کاذب برطرف شدند؛ برای جزئیات
is_privateرا ببینید.
- is_unspecified¶
اگر نشانی نامشخص باشد،
Trueاست. RFC 5735 (برای IPv4) یا RFC 2373 (برای IPv6) را ببینید.
- is_reserved¶
اگر آدرس بهعنوان رزروشده از سوی IETF ثبتشده باشد،
Trueاست. برای IPv4، این فقط240.0.0.0/4، بلوک آدرسReservedاست. برای IPv6، این تمام آدرسهایی است که برای استفاده آینده بهعنوانReserved by IETFاختصاصیافته هستند.توجه
برای IPv4،
is_reservedبه مقدار بلوک آدرسِ ستونReserved-by-Protocolدر iana-ipv4-special-registry مربوط نیست.ملاحظه
برای IPv6،
fec0::/10، پیشوند نشانی سابق با محدودهی Site-Local، در حال حاضر از آن فهرست مستثنی شده است (بهis_site_localو RFC 3879 مراجعه کنید).
- is_loopback¶
اگر این یک نشانی حلقهای (loopback) باشد،
Trueاست. RFC 3330 (برای IPv4) یا RFC 2373 (برای IPv6) را ببینید.
- is_link_local¶
اگر نشانی برای استفادهی محلی پیوند (link-local) رزرو شده باشد،
Trueاست. RFC 3927 را ببینید.
- ipv6_mapped¶
شیء
IPv4Addressکه نشاندهندهی نشانی IPv6 با نگاشت IPv4 است. RFC 4291 را ببینید.اضافه شده در نسخهی 3.13.
- IPv4Address.__format__(fmt)¶
یک نمایش رشتهای از نشانی IP را، که با یک رشتهی قالببندی صریح کنترل میشود، برمیگرداند. fmt میتواند یکی از موارد زیر باشد:
's'، گزینهی پیشفرض، معادلstr()،'b'برای رشتهی دودویی که با صفر پر شده است،'X'یا'x'برای نمایش مبنای شانزده با حروف بزرگ یا کوچک، یا'n'، که برای نشانیهای IPv4 معادل'b'و برای IPv6 معادل'x'است. برای نمایشهای دودویی و مبنای شانزده، مشخصکنندهی قالب'#'و گزینهی گروهبندی'_'در دسترس هستند.__format__توسطformat،str.formatو افاسترینگها استفاده میشود.>>> format(ipaddress.IPv4Address('192.168.0.1')) '192.168.0.1' >>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1')) '0b11000000101010000000000000000001' >>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}' '2001:db8::1000' >>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X') '2001_0DB8_0000_0000_0000_0000_0000_1000' >>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000')) '0x2001_0db8_0000_0000_0000_0000_0000_1000'
اضافه شده در نسخهی 3.9.
- class ipaddress.IPv6Address(address)¶
یک نشانی IPv6 میسازد. اگر address یک نشانی IPv6 معتبر نباشد،
AddressValueErrorپرتاب میشود.مورد زیر یک نشانی IPv6 معتبر را تشکیل میدهد:
رشتهای متشکل از هشت گروه چهارتایی از ارقام مبنای شانزده است، که هر گروه بیانگر ۱۶ بیت است. گروهها با دونقطه از یکدیگر جدا میشوند. این یک نمادگذاری بازشده (نوشتار کامل) را توصیف میکند. این رشته همچنین میتواند با روشهای مختلف بهصورت فشرده (نمادگذاری کوتاهنویسی) درآید. برای جزئیات، RFC 4291 را ببینید. برای مثال،
"0000:0000:0000:0000:0000:0abc:0007:0def"میتواند به"::abc:7:def"فشرده شود.بهصورت اختیاری، رشته ممکن است یک شناسهی ناحیهی محدوده (scope zone ID) نیز داشته باشد که با پسوند
%scope_idبیان میشود. در صورت وجود، شناسهی محدوده باید غیرخالی باشد و نباید شامل%باشد. برای جزئیات، RFC 4007 را ببینید. برای مثال،fe80::1234%1ممکن است نشانیfe80::1234را در اولین پیوند گره مشخص کند.یک عدد صحیح که در ۱۲۸ بیت جای میگیرد.
یک عدد صحیح بستهبندیشده در یک شیء
bytesبه طول ۱۶، به صورت بزرگاندیان (big-endian).
>>> ipaddress.IPv6Address('2001:db8::1000') IPv6Address('2001:db8::1000') >>> ipaddress.IPv6Address('ff02::5678%1') IPv6Address('ff02::5678%1')
- compressed¶
شکل کوتاه نمایش نشانی، که در آن صفرهای پیشرو در گروهها حذف شدهاند و طولانیترین دنباله از گروههایی که کاملاً از صفر تشکیل شدهاند به یک گروه خالی فشرده میشود.
این نیز مقداری است که توسط
str(addr)برای نشانیهای IPv6 برگردانده میشود.- exploded¶
قالب بلند نمایش نشانی، شامل همهی صفرهای ابتدایی و گروههایی که بهطور کامل از صفر تشکیل شدهاند.
برای ویژگیها و متدهای زیر، مستندات مربوط به کلاس
IPv4Addressرا ببینید:- packed¶
- reverse_pointer¶
- version¶
- max_prefixlen¶
- is_multicast¶
- is_private¶
- is_global¶
اضافه شده در نسخهی 3.4.
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
- is_site_local¶
اگر نشانی برای استفادهی محلی سایت (site-local) رزرو شده باشد،
Trueاست. توجه داشته باشید که فضای نشانی محلی سایت (site-local) در RFC 3879 منسوخ شده است. برای بررسی اینکه آیا این نشانی در فضای نشانیهای محلی یکتا (unique local addresses) تعریفشده در RFC 4193 قرار دارد، ازis_privateاستفاده کنید.
- ipv4_mapped¶
برای نشانیهایی که به نظر میرسد نشانیهای IPv4 نگاشتشده در محدوده
::FFFF:0:0/96مطابق تعریف RFC 4291 باشند، این ویژگی نشانی IPv4 تعبیهشده را گزارش میدهد. برای هر نشانی دیگر، این ویژگیNoneخواهد بود.
- scope_id¶
برای نشانیهای دارای محدوده، همانطور که در RFC 4007 تعریف شدهاند، این ویژگی منطقهی خاصی از محدودهی نشانی را که نشانی به آن تعلق دارد، بهصورت یک رشته مشخص میکند. وقتی هیچ منطقهی محدودهای مشخص نشده باشد، این ویژگی
Noneخواهد بود.
- IPv6Address.__format__(fmt)¶
به مستندات متد مربوطه در
IPv4Addressمراجعه کنید.اضافه شده در نسخهی 3.9.
تبدیل به رشتهها و اعداد صحیح¶
برای تعامل با رابطهای شبکهای مانند ماژول socket، نشانیها باید به رشتهها یا اعداد صحیح تبدیل شوند. این کار با استفاده از توابع توکار str() و int() انجام میشود:
>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521
>>> str(ipaddress.IPv6Address('::1'))
'::1'
>>> int(ipaddress.IPv6Address('::1'))
1
توجه داشته باشید که آدرسهای IPv6 محدودهدار بدون شناسه ناحیه محدوده (scope zone ID) به عدد صحیح تبدیل میشوند.
عملگرها¶
اشیای نشانی از برخی عملگرها پشتیبانی میکنند. مگر اینکه خلاف آن ذکر شده باشد، عملگرها فقط میتوانند بین اشیای سازگار اعمال شوند (یعنی IPv4 با IPv4، IPv6 با IPv6).
عملگرهای مقایسه¶
میتوان اشیای نشانی را با مجموعهی معمول عملگرهای مقایسه مقایسه کرد. نشانیهای IPv6 یکسان با شناسههای متفاوت منطقهی محدوده (scope zone IDs) برابر نیستند. چند نمونه:
>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
True
>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
False
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
True
>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')
False
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
True
عملگرهای حسابی¶
میتوان اعداد صحیح را به اشیای نشانی افزود یا از آنها کم کرد. برخی مثالها:
>>> IPv4Address('127.0.0.2') + 3
IPv4Address('127.0.0.5')
>>> IPv4Address('127.0.0.2') - 3
IPv4Address('126.255.255.255')
>>> IPv4Address('255.255.255.255') + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
تعاریف شبکه IP¶
اشیاء IPv4Network و IPv6Network سازوکاری برای تعریف و بررسی تعاریف شبکهی IP فراهم میکنند. یک تعریف شبکه شامل یک mask و یک آدرس شبکه است و به همین صورت بازهای از آدرسهای IP را تعریف میکند که با اعمال نقاب بر آنها (AND دودویی) برابر با آدرس شبکه میشوند. برای مثال، یک تعریف شبکه با نقاب 255.255.255.0 و آدرس شبکه 192.168.1.0 شامل آدرسهای IP در بازهی بستهی 192.168.1.0 تا 192.168.1.255 است.
پیشوند، نقاب شبکه و نقاب میزبان¶
چندین روش معادل برای مشخص کردن نقابهای شبکه IP وجود دارد. پیشوند /<nbits> نمادگذاری است که نشان میدهد چند بیت مرتبه بالا در نقاب شبکه روشن هستند. نقاب شبکه نشانی IP است که تعدادی از بیتهای مرتبه بالای آن روشن هستند. بنابراین پیشوند /24 معادل نقاب شبکه 255.255.255.0 در IPv4، یا ffff:ff00:: در IPv6 است. علاوه بر این، نقاب میزبان معکوس منطقی نقاب شبکه است و گاهی (برای مثال در فهرستهای کنترل دسترسی سیسکو) برای نشان دادن یک نقاب شبکه به کار میرود. نقاب میزبان معادل /24 در IPv4 برابر 0.0.0.255 است.
اشیاء شبکه¶
همهی ویژگیهای پیادهسازیشده در اشیاء آدرس، در اشیاء شبکه نیز پیادهسازی شدهاند. علاوه بر این، اشیاء شبکه ویژگیهای اضافی را پیادهسازی میکنند. همهی این موارد بین IPv4Network و IPv6Network مشترک هستند، بنابراین برای جلوگیری از تکرار، فقط برای IPv4Network مستند شدهاند. اشیاء شبکه hashable هستند، بنابراین میتوان از آنها بهعنوان کلید در دیکشنریها استفاده کرد.
- class ipaddress.IPv4Network(address, strict=True)¶
یک تعریف شبکهی IPv4 ایجاد میکند. address میتواند یکی از موارد زیر باشد:
رشتهای شامل یک نشانی IP و یک نقاب اختیاری است که با یک اسلش (
/) از هم جدا شدهاند. نشانی IP، نشانی شبکه است و نقاب میتواند یک عدد تنها باشد که در این صورت یک پیشوند محسوب میشود، یا نمایش رشتهای یک نشانی IPv4 باشد. اگر حالت دوم باشد، چنانچه نقاب با یک فیلد غیرصفر آغاز شود، بهعنوان نقاب شبکه تفسیر میشود؛ و اگر با یک فیلد صفر آغاز شود، بهعنوان نقاب میزبان تفسیر میشود. تنها استثنا نقابی است که کاملاً صفر است و بهعنوان نقاب شبکه در نظر گرفته میشود. اگر هیچ نقابی ارائه نشود، بهصورت/32در نظر گرفته میشود.برای مثال، مشخصات نشانی زیر معادل هستند:
192.168.1.0/24،192.168.1.0/255.255.255.0و192.168.1.0/0.0.0.255.عدد صحیحی که در ۳۲ بیت جای میگیرد. این معادل یک شبکهی تکنشانی است که در آن نشانی شبکه address و نقاب
/32است.یک عدد صحیح بستهبندیشده در یک شیء
bytesبه طول ۴، بزرگاندیان (big-endian). تفسیر آن مشابه یک نشانی از نوع عدد صحیح است.یک تاپل دوتایی از توصیف نشانی و نقاب شبکه، که توصیف نشانی میتواند یک رشته، یک عدد صحیح ۳۲ بیتی، یک عدد صحیح ۴ بایتی بستهبندیشده، یا یک شیء
IPv4Addressموجود باشد؛ و نقاب شبکه میتواند یک عدد صحیح نشاندهندهی طول پیشوند (برای نمونه24) یا یک رشته نشاندهندهی نقاب پیشوند (برای نمونه255.255.255.0) باشد.
اگر address یک نشانی IPv4 معتبر نباشد، یک
AddressValueErrorپرتاب میشود. اگر نقاب برای یک نشانی IPv4 معتبر نباشد، یکNetmaskValueErrorپرتاب میشود.اگر strict برابر
Trueباشد و بیتهای میزبان در نشانی ارائهشده برقرار باشند،ValueErrorپرتاب میشود. در غیر این صورت، بیتهای میزبان نقاب میشوند تا نشانی شبکه مناسب تعیین شود.مگر اینکه خلاف آن ذکر شده باشد، همهی متدهای شبکهای که دیگر اشیاء شبکه/نشانی را میپذیرند، در صورتی که نسخهی IP آرگومان با
selfناسازگار باشد،TypeErrorرا پرتاب میکنند.تغییر یافته در نسخهی 3.5: قالب دو-تایی (two-tuple) برای پارامتر address در سازنده افزوده شد.
- version¶
- max_prefixlen¶
به مستندات ویژگی متناظر در
IPv4Addressمراجعه کنید.
- is_multicast¶
- is_private¶
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
این ویژگیها برای کل شبکه برقرار هستند اگر برای هر دو نشانی شبکه و نشانی پخش (broadcast) برقرار باشند.
- network_address¶
نشانی شبکه برای شبکه. نشانی شبکه و طول پیشوند با هم بهطور یکتا یک شبکه را تعریف میکنند.
- broadcast_address¶
نشانی پخش شبکه. بستههای ارسالشده به نشانی پخش باید توسط هر میزبان در شبکه دریافت شوند.
- hostmask¶
نقاب میزبان، بهصورت یک شیء
IPv4Address.
- netmask¶
نقاب شبکه، بهصورت یک شیء
IPv4Address.
- with_prefixlen¶
- compressed¶
- exploded¶
نمایش رشتهای از شبکه، با نقاب در نماد پیشوندی.
with_prefixlenوcompressedهمیشه باstr(network)یکسان هستند.explodedاز شکل گسترشیافتهی نشانی شبکه استفاده میکند.
- with_netmask¶
یک نمایش رشتهای از شبکه، با نقاب در نمادگذاری نقاب شبکه.
- with_hostmask¶
یک نمایش رشتهای از شبکه، با نقاب در نمادگذاری نقاب میزبان (host mask notation).
- num_addresses¶
تعداد کل آدرسهای شبکه.
- prefixlen¶
طول پیشوند شبکه، بر حسب بیت.
- hosts()¶
پیمایشگری بر روی میزبانهای قابلاستفاده در شبکه برمیگرداند. میزبانهای قابلاستفاده همه آدرسهای IP متعلق به شبکه هستند، بهجز خود آدرس شبکه و آدرس پخش شبکه (broadcast). برای شبکههایی با طول نقاب ۳۱، آدرس شبکه و آدرس پخش شبکه (broadcast) نیز در نتیجه قرار میگیرند. شبکههایی با نقاب ۳۲، فهرستی شامل تنها آدرس میزبان را برمیگردانند.
>>> list(ip_network('192.0.2.0/29').hosts()) [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'), IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'), IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')] >>> list(ip_network('192.0.2.0/31').hosts()) [IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')] >>> list(ip_network('192.0.2.1/32').hosts()) [IPv4Address('192.0.2.1')]
- overlaps(other)¶
Trueاگر این شبکه بهطور جزئی یا کلی در other قرار داشته باشد یا other بهطور کلی در این شبکه قرار داشته باشد.
- address_exclude(network)¶
تعریفهای شبکه حاصل از حذف network دادهشده از این شبکه را محاسبه میکند. پیمایشگری از اشیاء شبکه برمیگرداند. اگر network بهطور کامل در این شبکه قرار نداشته باشد، استثنای
ValueErrorرا پرتاب میکند.>>> n1 = ip_network('192.0.2.0/28') >>> n2 = ip_network('192.0.2.1/32') >>> list(n1.address_exclude(n2)) [IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
- subnets(prefixlen_diff=1, new_prefix=None)¶
زیرشبکههایی که بسته به مقادیر آرگومان، با هم ترکیب میشوند تا تعریف شبکهی جاری را بسازند. prefixlen_diff مقداری است که طول پیشوند ما باید به اندازهی آن افزایش یابد. new_prefix پیشوند جدید موردنظر برای زیرشبکههاست؛ باید بزرگتر از پیشوند ما باشد. یکی و فقط یکی از prefixlen_diff و new_prefix باید تنظیم شود. یک پیمایشگر از اشیای شبکه برمیگرداند.
>>> list(ip_network('192.0.2.0/24').subnets()) [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')] >>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2)) [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'), IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')] >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26)) [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'), IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')] >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23)) Traceback (most recent call last): File "<stdin>", line 1, in <module> raise ValueError('new prefix must be longer') ValueError: new prefix must be longer >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25)) [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
- supernet(prefixlen_diff=1, new_prefix=None)¶
ابرشبکهای که شامل این تعریف شبکه است، بسته به مقدارهای آرگومانها. prefixlen_diff مقداری است که طول پیشوند ما باید به اندازه آن کاهش یابد. new_prefix پیشوند جدید دلخواه ابرشبکه است؛ باید از پیشوند ما کوچکتر باشد. یکی و فقط یکی از prefixlen_diff و new_prefix باید تنظیم شود. یک شیء شبکه واحد را برمیگرداند.
>>> ip_network('192.0.2.0/24').supernet() IPv4Network('192.0.2.0/23') >>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2) IPv4Network('192.0.0.0/22') >>> ip_network('192.0.2.0/24').supernet(new_prefix=20) IPv4Network('192.0.0.0/20')
- subnet_of(other)¶
اگر این شبکه زیرشبکهای از other باشد،
Trueرا برمیگرداند.>>> a = ip_network('192.168.1.0/24') >>> b = ip_network('192.168.1.128/30') >>> b.subnet_of(a) True
اضافه شده در نسخهی 3.7.
- supernet_of(other)¶
اگر این شبکه، ابرشبکهای از other باشد،
Trueرا برمیگرداند.>>> a = ip_network('192.168.1.0/24') >>> b = ip_network('192.168.1.128/30') >>> a.supernet_of(b) True
اضافه شده در نسخهی 3.7.
- compare_networks(other)¶
این شبکه را با other مقایسه میکند. در این مقایسه فقط نشانیهای شبکه در نظر گرفته میشوند؛ بیتهای میزبان در نظر گرفته نمیشوند. یکی از
-1،0یا1را برمیگرداند.>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32')) -1 >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32')) 1 >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32')) 0
منسوخ شده از نسخهی 3.7: از همان الگوریتم ترتیبدهی و مقایسه مانند "<"، "==" و ">" استفاده میکند.
- class ipaddress.IPv6Network(address, strict=True)¶
یک تعریف شبکه IPv6 ایجاد کنید. address میتواند یکی از موارد زیر باشد:
رشتهای شامل یک نشانی IP و یک طول پیشوند اختیاری، که با یک اسلش (
/) از هم جدا شدهاند. نشانی IP همان نشانی شبکه است و طول پیشوند باید یک عدد باشد، همان پیشوند. اگر طول پیشوندی ارائه نشود، مقدار آن/128در نظر گرفته میشود.توجه داشته باشید که در حال حاضر از نقابهای شبکهی گسترشیافته (netmask) پشتیبانی نمیشود. این بدان معناست که
2001:db00::0/24یک آرگومان معتبر است، در حالی که2001:db00::0/ffff:ff00::معتبر نیست.عدد صحیحی که در ۱۲۸ بیت جای میگیرد. این معادل یک شبکه تکنشانی است که نشانی شبکه آن address و نقاب آن
/128است.یک عدد صحیح بستهبندیشده در یک شیء
bytesبه طول ۱۶، با ترتیب بزرگاندیان (big-endian). تفسیر آن مشابه یک نشانی عدد صحیحی است.یک تاپل دوتایی شامل یک توصیف نشانی و یک نقاب شبکه، که در آن توصیف نشانی میتواند یک رشته، یک عدد صحیح ۱۲۸ بیتی، یک عدد صحیح فشرده ۱۶ بایتی، یا یک شیء
IPv6Addressموجود باشد؛ و نقاب شبکه یک عدد صحیح است که طول پیشوند را نشان میدهد.
اگر address یک نشانی IPv6 معتبر نباشد، یک
AddressValueErrorپرتاب میشود. اگر نقاب برای یک نشانی IPv6 معتبر نباشد، یکNetmaskValueErrorپرتاب میشود.اگر strict برابر
Trueباشد و بیتهای میزبان در نشانی ارائهشده برقرار باشند،ValueErrorپرتاب میشود. در غیر این صورت، بیتهای میزبان نقاب میشوند تا نشانی شبکه مناسب تعیین شود.تغییر یافته در نسخهی 3.5: قالب دو-تایی (two-tuple) برای پارامتر address در سازنده افزوده شد.
- version¶
- max_prefixlen¶
- is_multicast¶
- is_private¶
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
- network_address¶
- broadcast_address¶
- hostmask¶
- netmask¶
- with_prefixlen¶
- compressed¶
- exploded¶
- with_netmask¶
- with_hostmask¶
- num_addresses¶
- prefixlen¶
- hosts()¶
پیمایشگری بر روی میزبانهای قابلاستفاده در شبکه برمیگرداند. میزبانهای قابلاستفاده، تمام آدرسهای IP متعلق به شبکه هستند، بهجز آدرس Subnet-Router anycast. برای شبکههایی با طول نقاب ۱۲۷، آدرس Subnet-Router anycast نیز در نتیجه گنجانده میشود. شبکههایی با نقاب ۱۲۸، فهرستی حاوی آدرس میزبان واحد را برمیگردانند.
- overlaps(other)¶
- address_exclude(network)¶
- subnets(prefixlen_diff=1, new_prefix=None)¶
- supernet(prefixlen_diff=1, new_prefix=None)¶
- subnet_of(other)¶
- supernet_of(other)¶
- compare_networks(other)¶
به مستندات ویژگی متناظر در
IPv4Networkمراجعه کنید.
- is_site_local¶
این ویژگی برای کل شبکه درست است، اگر برای هر دو آدرس شبکه و آدرس پخش درست باشد.
عملگرها¶
اشیای شبکه از برخی عملگرها پشتیبانی میکنند. مگر آنکه خلاف آن ذکر شده باشد، عملگرها را فقط میتوان بین اشیای سازگار اعمال کرد (یعنی IPv4 با IPv4، IPv6 با IPv6).
عملگرهای منطقی¶
اشیای شبکه را میتوان با مجموعهی معمول عملگرهای منطقی مقایسه کرد. اشیای شبکه ابتدا بر اساس نشانی شبکه و سپس بر اساس نقاب شبکه مرتب میشوند.
پیمایش¶
میتوان اشیای شبکه را پیمایش کرد تا همهی آدرسهای متعلق به شبکه فهرست شوند. در پیمایش، همه میزبانها برگردانده میشوند، از جمله میزبانهای غیرقابل استفاده (برای میزبانهای قابل استفاده، از متد hosts() استفاده کنید). یک مثال:
>>> for addr in IPv4Network('192.0.2.0/28'):
... addr
...
IPv4Address('192.0.2.0')
IPv4Address('192.0.2.1')
IPv4Address('192.0.2.2')
IPv4Address('192.0.2.3')
IPv4Address('192.0.2.4')
IPv4Address('192.0.2.5')
IPv4Address('192.0.2.6')
IPv4Address('192.0.2.7')
IPv4Address('192.0.2.8')
IPv4Address('192.0.2.9')
IPv4Address('192.0.2.10')
IPv4Address('192.0.2.11')
IPv4Address('192.0.2.12')
IPv4Address('192.0.2.13')
IPv4Address('192.0.2.14')
IPv4Address('192.0.2.15')
شبکهها بهعنوان ظرفهایی از آدرسها¶
اشیای شبکه میتوانند بهعنوان ظرفهایی از آدرسها عمل کنند. برخی نمونهها:
>>> IPv4Network('192.0.2.0/28')[0]
IPv4Address('192.0.2.0')
>>> IPv4Network('192.0.2.0/28')[15]
IPv4Address('192.0.2.15')
>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
True
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
False
اشیای رابط¶
اشیای رابط hashable هستند، بنابراین میتوان از آنها بهعنوان کلید در دیکشنریها استفاده کرد.
- class ipaddress.IPv4Interface(address)¶
یک رابط IPv4 بسازید. معنای address همانند سازندهی
IPv4Networkاست، با این تفاوت که آدرسهای میزبان دلخواه همیشه پذیرفته میشوند.IPv4Interfaceزیرکلاسی ازIPv4Addressاست، بنابراین تمام ویژگیها را از آن کلاس به ارث میبرد. علاوه بر این، ویژگیهای زیر در دسترس هستند:- ip¶
نشانی (
IPv4Address) بدون اطلاعات شبکه.>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.ip IPv4Address('192.0.2.5')
- network¶
شبکه (
IPv4Network) که این رابط به آن تعلق دارد.>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.network IPv4Network('192.0.2.0/24')
- with_prefixlen¶
نمایش رشتهای رابط با نقاب در نماد پیشوندی.
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_prefixlen '192.0.2.5/24'
- with_netmask¶
یک نمایش رشتهای از رابط، با شبکه بهصورت نقاب شبکه.
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_netmask '192.0.2.5/255.255.255.0'
- with_hostmask¶
یک نمایش رشتهای از رابط با شبکه بهصورت نقاب میزبان.
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_hostmask '192.0.2.5/0.0.0.255'
- class ipaddress.IPv6Interface(address)¶
یک رابط IPv6 بسازید. معنای address همانند سازندهی
IPv6Networkاست، با این تفاوت که نشانیهای میزبان دلخواه همیشه پذیرفته میشوند.IPv6Interfaceیک زیرکلاس ازIPv6Addressاست، بنابراین تمام ویژگیهای آن کلاس را به ارث میبرد. علاوه بر این، ویژگیهای زیر نیز در دسترس هستند:- ip¶
- network¶
- with_prefixlen¶
- with_netmask¶
- with_hostmask¶
به مستندات ویژگی مربوطه در
IPv4Interfaceمراجعه کنید.
عملگرها¶
اشیاء رابط از برخی عملگرها پشتیبانی میکنند. مگر اینکه خلاف آن ذکر شده باشد، عملگرها فقط میتوانند بین اشیاء سازگار اعمال شوند (یعنی IPv4 با IPv4، IPv6 با IPv6).
عملگرهای منطقی¶
اشیاء رابط را میتوان با مجموعهی معمول عملگرهای منطقی مقایسه کرد.
برای مقایسهی برابری (== و !=)، برای این که اشیاء برابر باشند، هم آدرس IP و هم شبکه باید یکسان باشند. یک رابط با هیچ شیء آدرس یا شبکهای برابر مقایسه نخواهد شد.
برای مرتبسازی (<، >، و غیره) قواعد متفاوت است. اشیاء رابط و نشانی با نسخهی IP یکسان قابل مقایسه هستند و اشیاء نشانی همیشه پیش از اشیاء رابط مرتب میشوند. دو شیء رابط ابتدا بر اساس شبکههایشان مقایسه میشوند و اگر آنها یکسان باشند، سپس بر اساس آدرسهای IP آنها.
سایر توابع سطح ماژول¶
این ماژول همچنین توابع زیر را در سطح ماژول فراهم میکند:
- ipaddress.v4_int_to_packed(address)¶
یک نشانی را بهصورت ۴ بایت فشرده در ترتیب شبکه (big-endian) بازنمایی میکند. address یک بازنمایی از یک نشانی IP IPv4 بهصورت عدد صحیح است. اگر عدد صحیح منفی باشد یا برای یک نشانی IP IPv4 بیش از حد بزرگ باشد، یک
ValueErrorپرتاب میشود.>>> ipaddress.ip_address(3221225985) IPv4Address('192.0.2.1') >>> ipaddress.v4_int_to_packed(3221225985) b'\xc0\x00\x02\x01'
- ipaddress.v6_int_to_packed(address)¶
یک نشانی را بهصورت ۱۶ بایت فشرده با ترتیب شبکه (big-endian) نمایش میدهد. address نمایش یک نشانی IPv6 بهصورت عدد صحیح است. اگر عدد صحیح منفی یا بیش از حد بزرگ برای یک نشانی IPv6 باشد،
ValueErrorپرتاب میشود.
- ipaddress.summarize_address_range(first, last)¶
یک پیمایشگر از محدوده شبکه خلاصهشده بر اساس اولین و آخرین آدرس IP برمیگرداند. first اولین
IPv4AddressیاIPv6Addressدر محدوده است و last آخرینIPv4AddressیاIPv6Addressدر محدوده است. در صورتی که first یا last آدرس IP نباشند یا نسخه یکسانی نداشته باشند، یکTypeErrorپرتاب میشود. در صورتی که last بزرگتر از first نباشد یا نسخه آدرس first ۴ یا ۶ نباشد، یکValueErrorپرتاب میشود.>>> [ipaddr for ipaddr in ipaddress.summarize_address_range( ... ipaddress.IPv4Address('192.0.2.0'), ... ipaddress.IPv4Address('192.0.2.130'))] [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
- ipaddress.collapse_addresses(addresses)¶
یک پیمایشگر از اشیای جمعشدهی
IPv4NetworkیاIPv6Networkبرمیگرداند. addresses یک پیمایشپذیر از اشیایIPv4NetworkیاIPv6Networkاست. اگر addresses شامل اشیایی با نسخههای مختلط باشد، یکTypeErrorپرتاب میشود.>>> [ipaddr for ipaddr in ... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'), ... ipaddress.IPv4Network('192.0.2.128/25')])] [IPv4Network('192.0.2.0/24')]
- ipaddress.get_mixed_type_key(obj)¶
کلیدی مناسب برای مرتبسازی میان شبکهها و آدرسها برمیگرداند. اشیاء Address و Network بهطور پیشفرض قابل مرتبسازی نیستند؛ آنها اساساً با هم متفاوتاند، بنابراین عبارت:
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
معنایی ندارد. با این حال، گاهی اوقات ممکن است بخواهید
ipaddressاینها را به هر صورت مرتبسازی کند. اگر نیاز به این کار دارید، میتوانید از این تابع بهعنوان آرگومان key برایsorted()استفاده کنید.obj یا یک شیء شبکه است یا یک شیء نشانی.
استثناهای سفارشی¶
برای پشتیبانی از گزارشدهی دقیقتر خطا از سازندههای کلاس، این ماژول استثناهای زیر را تعریف میکند:
- exception ipaddress.AddressValueError(ValueError)¶
هر خطای مقدار مرتبط با نشانی.
- exception ipaddress.NetmaskValueError(ValueError)¶
هر خطای مقدار مربوط به نقاب شبکه (net mask).