পাঠ ১৬ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Computer Networks / IPv6 পরিচিতি

IPv6 পরিচিতি

Introduction to IPv6
৮ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • 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-এর জায়গায়।

Python
# একটি বাস্তব 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:0db8:85a3:0000:0000:8a2e:0370:7334 লিডিং জিরো বাদ: 2001:db8:85a3:0:0:8a2e:370:7334 দীর্ঘতম শূন্য-রান (0:0) খুঁজে :: দিয়ে প্রতিস্থাপন
ফলাফল: 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 অবকাঠামো রাতারাতি বদলানো সম্ভব নয়, তাই সম্পূর্ণ মাইগ্রেশন কয়েক দশক ধরে ধীরে ধীরে চলছে।

মূল কথা · Key takeaway

IPv6-এর মূল ধারণা সহজ — ঠিকানার আকার এত বাড়িয়ে দাও যে সংকটের প্রশ্নই না আসে। সংক্ষিপ্তকরণের নিয়মগুলো (লিডিং জিরো বাদ, একবার ::) শুধু এই দীর্ঘ ঠিকানাগুলোকে মানুষের পড়ার উপযোগী করে তোলে — অন্তর্নিহিত ১২৮-বিট মান কখনোই বদলায় না।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একটি ঠিকানায় যদি দুটি ভিন্ন স্থানে সমান দৈর্ঘ্যের শূন্য-রান থাকে (টাই), তাহলে কোনটি :: দিয়ে প্রতিস্থাপন করা উচিত?

প্রথাগত নিয়ম (এবং RFC 5952 canonical form) অনুযায়ী — টাই হলে প্রথম (বামদিকের) রানটি প্রতিস্থাপন করা হয়। উপরের কোডেও এই আচরণ অনুসরণ করা হয়েছে, কারণ আমরা শুধু কঠোরভাবে বড় (>) রান পেলেই best_len আপডেট করি — সমান দৈর্ঘ্যের পরবর্তী রান পেলে প্রথমটিই থেকে যায়।

প্র ০২ কোড ইচ্ছাকৃতভাবে শুধু ২ বা তার বেশি দৈর্ঘ্যের শূন্য-রানেই :: প্রয়োগ করে — একটিমাত্র শূন্য গ্রুপের জন্য কেন নয়?

একটিমাত্র শূন্য গ্রুপকে ::-এ পরিণত করলে জায়গা বাঁচে না বললেই চলে (:0: বনাম :: প্রায় সমান দৈর্ঘ্যের), অথচ পড়তে বিভ্রান্তিকর হতে পারে। তাই ব্যবহারিক ও প্রমিত অনুশীলন হলো শুধু ২ বা তার বেশি টানা শূন্য গ্রুপ থাকলেই কমপ্রেশন প্রয়োগ করা।

প্র ০৩ dual-stack বাস্তবতায় (IPv4 ও IPv6 পাশাপাশি) একটি ওয়েবসাইট সার্ভারকে কী বিবেচনা করতে হয়?

সার্ভারকে সাধারণত উভয় প্রকার ঠিকানায়ই শোনা (listen) দরকার হয় — কিছু ভিজিটরের ডিভাইস/ISP এখনও শুধু IPv4 সমর্থন করে, আবার কিছু আধুনিক নেটওয়ার্ক IPv6-কে অগ্রাধিকার দেয়। DNS-এও (M6/L30) উভয়ের জন্য আলাদা রেকর্ড রাখতে হয় — A রেকর্ড (IPv4) ও AAAA রেকর্ড (IPv6) — যাতে যেকোনো ধরনের ক্লায়েন্ট সঠিকভাবে সংযোগ করতে পারে।

অনুশীলন

  1. চিন্তা করুন: 2001:0db8:0000:0000:0000:0000:0000:0001 ঠিকানাটি হাতে সংক্ষিপ্ত করার চেষ্টা করুন, তারপর কোড চালিয়ে মিলিয়ে দেখুন।

    প্রথম দুটি গ্রুপের পর টানা ৫টি শূন্য গ্রুপ আছে (দৈর্ঘ্য ৫, ঠিকানার একমাত্র ও দীর্ঘতম রান) — তাই ফলাফল হবে 2001:db8::1। কোড চালিয়ে compress_ipv6("2001:0db8:0000:0000:0000:0000:0000:0001") একই ফলাফল দেয় কিনা যাচাই করুন।

  2. পরীক্ষা করুন: উপরের কোড সেলে এমন একটি ঠিকানা টেস্ট করুন যেখানে দুটি ভিন্ন স্থানে সমান দৈর্ঘ্যের (প্রতিটি ১টি করে) শূন্য গ্রুপ আছে — নিশ্চিত করুন ফাংশনটি :: মোটেও প্রয়োগ করে না (কারণ দৈর্ঘ্য ২-এর কম)।

    যেমন "2001:0000:85a3:0000:1234:8a2e:0370:7334" টেস্ট করলে — এখানে দুটি বিচ্ছিন্ন একক-গ্রুপ শূন্য রান আছে (উভয়ের দৈর্ঘ্য ১), কোডের শর্ত best_len >= 2 পূরণ না হওয়ায় ফলাফল হবে 2001:0:85a3:0:1234:8a2e:370:7334 — লিডিং জিরো বাদ গেছে কিন্তু কোথাও :: বসেনি।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

পাঠ ১৫
সাবনেটিং ও CIDR