IPv6 পরিচিতি
এই পাঠে যা শিখবেন
- IPv6 ঠিকানার গঠন ও কেন এটি তৈরি হয়েছিল
- সংক্ষিপ্তকরণের দুটি নিয়ম — লিডিং জিরো ও zero-run কমপ্রেশন
- হেডার সরলীকরণ ও অটো-কনফিগারেশনের মতো অন্যান্য উন্নতি
- Python দিয়ে একটি বাস্তব IPv6 কমপ্রেশন ফাংশন লিখে যাচাই
১ · কেন IPv6 — ঠিকানা সংকটের সমাধান
L14-এ আমরা দেখেছি IPv4 ঠিকানা মাত্র ৩২ বিটের, অর্থাৎ সর্বোচ্চ $2^{32} \approx 4.3$ বিলিয়ন ঠিকানা সম্ভব — যা বিশ্বের ক্রমবর্ধমান ডিভাইস সংখ্যার (ফোন, ল্যাপটপ, IoT ডিভাইস) তুলনায় অপ্রতুল। এই সংকট সমাধানের জন্যই তৈরি হয়েছে IPv6Internet Protocol version 6একটি ১২৮-বিট ঠিকানা স্কিম, IPv4-এর ঠিকানা সংকট সমাধানের জন্য ডিজাইন করা — মোট ঠিকানা সংখ্যা 2^128, যা কার্যত অফুরন্ত। — যার ঠিকানা দৈর্ঘ্য ১২৮ বিট, অর্থাৎ $2^{128}$টি সম্ভাব্য ঠিকানা — একটি সংখ্যা এত বিশাল যে ব্যবহারিকভাবে কখনো শেষ হওয়ার কথা নয়।
২ · গঠন ও লেখার নিয়ম
একটি IPv6 ঠিকানা লেখা হয় ৮টি গ্রুপে, প্রতিটি গ্রুপ ৪টি হেক্সাডেসিমেল ডিজিট (১৬ বিট), কোলন দিয়ে আলাদা করে —
2001:0db8:85a3:0000:0000:8a2e:0370:7334
পূর্ণ ঠিকানাটি বেশ দীর্ঘ, তাই দুটি সংক্ষিপ্তকরণ নিয়ম আছে —
- লিডিং জিরো বাদ — প্রতিটি গ্রুপের সামনের শূন্যগুলো বাদ দেওয়া যায় (যেমন
0db8→db8)। - zero-run কমপ্রেশন — টানা এক বা একাধিক সম্পূর্ণ-শূন্য গ্রুপের একটি মাত্র রান
::দিয়ে প্রতিস্থাপন করা যায়।
:: সর্বোচ্চ একবার ব্যবহার করা যায়
যদি একটি ঠিকানায় দুইবার :: ব্যবহার করা হতো, তাহলে প্রতিটি ::-এ ঠিক কতগুলো শূন্য
গ্রুপ লুকিয়ে আছে তা নির্ধারণ করা অসম্ভব হয়ে যেত — মোট ৮টি গ্রুপের মধ্যে শূন্যগুলো কীভাবে ভাগ হয়েছে তা
দ্ব্যর্থক (ambiguous) হয়ে যেত। তাই নিয়ম অনুযায়ী প্রতি ঠিকানায় সর্বোচ্চ একবার :: ব্যবহার করা
যায় — এবং সেটি হয় দীর্ঘতম zero-run-এর জায়গায়।
# একটি বাস্তব IPv6 কমপ্রেশন ফাংশন -- লিডিং জিরো বাদ + দীর্ঘতম zero-run কে :: দিয়ে প্রতিস্থাপন
def compress_ipv6(full_address):
groups = full_address.split(":")
# ১. প্রতিটি গ্রুপের লিডিং জিরো বাদ দিন (সম্পূর্ণ-শূন্য গ্রুপ হলে একটিমাত্র "0" রাখুন)
stripped = [g.lstrip("0") or "0" for g in groups]
# ২. কোন কোন গ্রুপ সম্পূর্ণ শূন্য তা চিহ্নিত করুন
is_zero = [int(g, 16) == 0 for g in groups]
# ৩. সবচেয়ে দীর্ঘ টানা শূন্য-গ্রুপের রান খুঁজে বের করুন
best_start, best_len = -1, 0
i = 0
while i < len(is_zero):
if is_zero[i]:
j = i
while j < len(is_zero) and is_zero[j]:
j += 1
run_len = j - i
if run_len > best_len:
best_start, best_len = i, run_len
i = j
else:
i += 1
# ৪. শুধু ২ বা তার বেশি দৈর্ঘ্যের রান থাকলেই :: প্রয়োগ করুন
if best_len >= 2:
left = stripped[:best_start]
right = stripped[best_start + best_len:]
return ":".join(left) + "::" + ":".join(right)
return ":".join(stripped)
full = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
compressed = compress_ipv6(full)
print("পূর্ণ ঠিকানা: ", full)
print("সংক্ষিপ্ত ঠিকানা: ", compressed)
expected = "2001:db8:85a3::8a2e:370:7334"
print("প্রত্যাশিত ফলাফল: ", expected)
print("মিলছে কি? ", compressed == expected)
assert compressed == expected
# আরও কিছু কেস দিয়ে যাচাই -- সব-শূন্য ও শুরুতে শূন্য থাকা ঠিকানা
print()
print("::1 ->", compress_ipv6("0000:0000:0000:0000:0000:0000:0000:0001"))
print("0:0:0:0:0:0:0:0 ->", compress_ipv6("0000:0000:0000:0000:0000:0000:0000:0000"))
2001:db8:85a3::8a2e:370:7334 — তিনটি ধাপেই ঠিকানার প্রকৃত মান অপরিবর্তিত থাকে, শুধু লেখার ধরন সংক্ষিপ্ত হয়।compressed == expected চেক True দেখায়, এবং
assert লাইনটি নিশ্চিত করে ফাংশনটি সঠিকভাবে কাজ করছে। শেষ দুটি টেস্ট কেসও গুরুত্বপূর্ণ —
"::1" (লুপব্যাক ঠিকানা, শুরুতে শূন্য রান) এবং সম্পূর্ণ-শূন্য ঠিকানা ঠিকভাবে শুধু
"::"-এ সংকুচিত হয়।
৩ · IPv6-এর অন্যান্য উন্নতি ও dual-stack বাস্তবতা
শুধু বিশাল ঠিকানা স্থানই নয় — IPv6-এ আরও কিছু উন্নতি আছে: একটি সরলীকৃত, স্থির-আকারের হেডার (রাউটারের জন্য প্রসেসিং দ্রুততর), এবং বিল্ট-ইন অটো-কনফিগারেশন (একটি ডিভাইস তার নিজের MAC ও নেটওয়ার্ক প্রিফিক্স থেকে নিজেই একটি ঠিকানা তৈরি করতে পারে, DHCP-এর মতো বাহ্যিক সার্ভার ছাড়াই)। নীতিগতভাবে IPv6-এ আর NAT প্রয়োজন নেই (যেহেতু প্রতিটি ডিভাইস একটি অনন্য পাবলিক ঠিকানা পেতে পারে), যদিও বাস্তবে অন্যান্য কারণে (যেমন নিরাপত্তা নীতি) NAT এখনও কখনো কখনো ব্যবহৃত হয়।
বাস্তবতা হলো — IPv4 ও IPv6 আজও পাশাপাশি চলে, একে বলা হয় dual-stack। পুরনো IPv4 অবকাঠামো রাতারাতি বদলানো সম্ভব নয়, তাই সম্পূর্ণ মাইগ্রেশন কয়েক দশক ধরে ধীরে ধীরে চলছে।
IPv6-এর মূল ধারণা সহজ — ঠিকানার আকার এত বাড়িয়ে দাও যে সংকটের প্রশ্নই না আসে। সংক্ষিপ্তকরণের নিয়মগুলো
(লিডিং জিরো বাদ, একবার ::) শুধু এই দীর্ঘ ঠিকানাগুলোকে মানুষের পড়ার উপযোগী করে তোলে —
অন্তর্নিহিত ১২৮-বিট মান কখনোই বদলায় না।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
একটি ঠিকানায় যদি দুটি ভিন্ন স্থানে সমান দৈর্ঘ্যের শূন্য-রান থাকে (টাই), তাহলে কোনটি :: দিয়ে প্রতিস্থাপন করা উচিত?
প্রথাগত নিয়ম (এবং RFC 5952 canonical form) অনুযায়ী — টাই হলে প্রথম (বামদিকের) রানটি
প্রতিস্থাপন করা হয়। উপরের কোডেও এই আচরণ অনুসরণ করা হয়েছে, কারণ আমরা শুধু কঠোরভাবে বড় (>)
রান পেলেই best_len আপডেট করি — সমান দৈর্ঘ্যের পরবর্তী রান পেলে প্রথমটিই থেকে যায়।
প্র ০২
কোড ইচ্ছাকৃতভাবে শুধু ২ বা তার বেশি দৈর্ঘ্যের শূন্য-রানেই :: প্রয়োগ করে — একটিমাত্র শূন্য গ্রুপের জন্য কেন নয়?
একটিমাত্র শূন্য গ্রুপকে ::-এ পরিণত করলে জায়গা বাঁচে না বললেই চলে (:0: বনাম
:: প্রায় সমান দৈর্ঘ্যের), অথচ পড়তে বিভ্রান্তিকর হতে পারে। তাই ব্যবহারিক ও প্রমিত অনুশীলন
হলো শুধু ২ বা তার বেশি টানা শূন্য গ্রুপ থাকলেই কমপ্রেশন প্রয়োগ করা।
প্র ০৩ dual-stack বাস্তবতায় (IPv4 ও IPv6 পাশাপাশি) একটি ওয়েবসাইট সার্ভারকে কী বিবেচনা করতে হয়?
সার্ভারকে সাধারণত উভয় প্রকার ঠিকানায়ই শোনা (listen) দরকার হয় — কিছু ভিজিটরের ডিভাইস/ISP এখনও শুধু IPv4 সমর্থন করে, আবার কিছু আধুনিক নেটওয়ার্ক IPv6-কে অগ্রাধিকার দেয়। DNS-এও (M6/L30) উভয়ের জন্য আলাদা রেকর্ড রাখতে হয় — A রেকর্ড (IPv4) ও AAAA রেকর্ড (IPv6) — যাতে যেকোনো ধরনের ক্লায়েন্ট সঠিকভাবে সংযোগ করতে পারে।
অনুশীলন
-
চিন্তা করুন:
2001:0db8:0000:0000:0000:0000:0000:0001ঠিকানাটি হাতে সংক্ষিপ্ত করার চেষ্টা করুন, তারপর কোড চালিয়ে মিলিয়ে দেখুন।প্রথম দুটি গ্রুপের পর টানা ৫টি শূন্য গ্রুপ আছে (দৈর্ঘ্য ৫, ঠিকানার একমাত্র ও দীর্ঘতম রান) — তাই ফলাফল হবে
2001:db8::1। কোড চালিয়েcompress_ipv6("2001:0db8:0000:0000:0000:0000:0000:0001")একই ফলাফল দেয় কিনা যাচাই করুন। -
পরীক্ষা করুন: উপরের কোড সেলে এমন একটি ঠিকানা টেস্ট করুন যেখানে দুটি ভিন্ন স্থানে সমান
দৈর্ঘ্যের (প্রতিটি ১টি করে) শূন্য গ্রুপ আছে — নিশ্চিত করুন ফাংশনটি
::মোটেও প্রয়োগ করে না (কারণ দৈর্ঘ্য ২-এর কম)।যেমন
"2001:0000:85a3:0000:1234:8a2e:0370:7334"টেস্ট করলে — এখানে দুটি বিচ্ছিন্ন একক-গ্রুপ শূন্য রান আছে (উভয়ের দৈর্ঘ্য ১), কোডের শর্তbest_len >= 2পূরণ না হওয়ায় ফলাফল হবে2001:0:85a3:0:1234:8a2e:370:7334— লিডিং জিরো বাদ গেছে কিন্তু কোথাও::বসেনি।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ পরবর্তী পাঠ — রাউটিং বেসিকস, রাউটিং টেবিল ও ফরওয়ার্ডিং — এখনই পড়ুন।
- Cloud Computing & DevOps কোর্স সঙ্গী কোর্স ক্লাউডে IPv6 সমর্থন ও DNS কনফিগারেশন কীভাবে করা হয় তা শিখতে দেখুন।
- Cybersecurity & Ethical Hacking কোর্স সঙ্গী কোর্স IPv6-এর নতুন ঠিকানা স্থান নিরাপত্তা স্ক্যানিংকে কীভাবে প্রভাবিত করে তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps ও Computer Networks — সব এক জায়গায়।