পাঠ ৩৮ · ৫৭-এর মধ্যে · মডিউল ৮
Home / Courses / Computer Networks / WiFi (802.11) বেসিকস

WiFi (802.11) বেসিকস

WiFi (802.11) basics
৮ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • Infrastructure mode বনাম ad-hoc mode-এর পার্থক্য
  • CSMA/CA কেন CSMA/CD-এর চেয়ে ভিন্ন পদ্ধতি ব্যবহার করে — hidden terminal problem-সহ
  • র‍্যান্ডম ব্যাকঅফ কীভাবে কলিশনের সম্ভাবনা কমায় (সম্পূর্ণ দূর করে না)
  • 802.11 স্ট্যান্ডার্ডের প্রজন্মগত অগ্রগতি (n, ac, ax/WiFi 6) সংক্ষেপে

১ · Infrastructure Mode বনাম Ad-hoc Mode

WiFiWiFi / IEEE 802.11ওয়্যারলেস LAN প্রযুক্তির একটি মান, যা রেডিও তরঙ্গের মাধ্যমে ডিভাইসগুলোকে একে অপরের সাথে বা একটি কেন্দ্রীয় Access Point-এর সাথে সংযুক্ত করে। হলো IEEE 802.11 স্ট্যান্ডার্ড পরিবারের উপর ভিত্তি করে তৈরি ওয়্যারলেস LAN প্রযুক্তি। দুটি অপারেশন মোড আছে —

Infrastructure Mode
ডিভাইসগুলো একটি কেন্দ্রীয় Access Point (AP)-এর সাথে সংযুক্ত হয় (L01-এর client-server মডেলের একটি রূপ) — বাসা বা অফিসের সাধারণ সেটআপ।
Ad-hoc Mode
ডিভাইসগুলো সরাসরি একে অপরের সাথে সংযুক্ত হয়, কোনো AP ছাড়াই (L01-এর P2P মডেলের অনুরূপ) — বাস্তবে খুবই বিরল ব্যবহার।

২ · CSMA/CA — কলিশন এভয়ডেন্স, ডিটেকশন নয়

L11-এ আমরা দেখেছি ওয়্যার্ড Ethernet ঐতিহাসিকভাবে CSMA/CD (Carrier Sense Multiple Access with Collision Detection) ব্যবহার করত — ট্রান্সমিট করার আগে শোনা, আর কলিশন হলে সেটা detect করে backoff করা। WiFi-তে এটি সম্ভব নয়, কারণ একটি ট্রান্সমিটিং ডিভাইস নিজে ট্রান্সমিট করার সময় একই সাথে অন্য কারো সিগন্যাল "শুনতে" পারে না নিজের রেডিও রিসিভারে (নিজের নিজের সিগন্যাল অনেক জোরে) — তাই কলিশন detect করার বদলে WiFi ব্যবহার করে CSMA/CACSMA/CACarrier Sense Multiple Access with Collision Avoidance — ট্রান্সমিট করার আগে চ্যানেল ফাঁকা কিনা শোনা এবং একটি random backoff wait করে সম্ভাব্য কলিশন সক্রিয়ভাবে এড়ানোর চেষ্টা করা, যেহেতু কলিশন detect করা কঠিন। — কলিশন এড়ানোর চেষ্টা, detect করার বদলে।

Hidden Terminal Problem

দুটি ডিভাইস (ধরুন A ও B) একে অপরের রেডিও রেঞ্জের বাইরে থাকতে পারে, কিন্তু দুজনেই একই AP-এর রেঞ্জের মধ্যে থাকতে পারে। A যখন ট্রান্সমিট করে, B সেটা শুনতে পায় না (রেঞ্জের বাইরে) — তাই B মনে করতে পারে চ্যানেল ফাঁকা এবং নিজেও ট্রান্সমিট শুরু করে দেয়, ফলে AP-এর কাছে দুটো সিগন্যাল একসাথে এসে কলিশন ঘটে যায়, অথচ কেউই সেটা টের পায় না নিজে নিজে। এই সমস্যা মোকাবেলায় ঐচ্ছিক RTS/CTS হ্যান্ডশেকিং ব্যবহার করা যায় (সংক্ষেপে উল্লেখ — AP একটি "Clear To Send" সিগন্যাল দিয়ে সব ডিভাইসকে জানিয়ে দেয় চ্যানেল কে ব্যবহার করছে)।

যেহেতু কলিশন সম্পূর্ণ এড়ানো যায় না, CSMA/CA প্রতিটি ডিভাইসকে ট্রান্সমিট করার আগে একটি random backoff (একটি এলোমেলো সংখ্যক "স্লট" অপেক্ষা করা) বেছে নিতে বলে — যদি সব ডিভাইস একই মুহূর্তে ট্রান্সমিট করতে চায়, ভিন্ন ভিন্ন র‍্যান্ডম ব্যাকঅফ থাকায় তাদের মধ্যে অন্তত কেউ একজন আগে শুরু করবে, বাকিরা চ্যানেল ব্যস্ত দেখে অপেক্ষা করবে — এটি কলিশনের সম্ভাবনা কমায়, সম্পূর্ণ দূর করে না (দুই ডিভাইস কাকতালীয়ভাবে একই ব্যাকঅফ বেছে নিলে কলিশন তখনও ঘটতে পারে)।

৩ · স্ট্যান্ডার্ডের বিবর্তন — 802.11n, ac, ax (WiFi 6)

802.11 স্ট্যান্ডার্ড সময়ের সাথে বিবর্তিত হয়েছে — প্রতিটি নতুন প্রজন্ম মোটামুটিভাবে সর্বোচ্চ থিওরেটিক্যাল থ্রুপুট ও efficiency বাড়িয়েছে: 802.11n → 802.11ac → 802.11ax (WiFi 6)। এখানে গভীর টেকনিক্যাল ডেরিভেশনের দরকার নেই — শুধু এটুকু মনে রাখাই যথেষ্ট যে এই নামগুলো একটি অগ্রগতির ধারা বোঝায়, প্রতিটি প্রজন্ম আগেরটির চেয়ে দ্রুত ও অধিক ডিভাইস-ঘনত্বে দক্ষ।

Python
# CSMA/CA-এর র‍্যান্ডম ব্যাকঅফ সিমুলেশন
# প্রতিটি ডিভাইসের জন্য একটি ফিক্সড-সিড random.Random(seed) ব্যবহার করা হয়েছে
# (কখনোই বেয়ার unseeded random নয়) — ফলে ফলাফল সবসময় পুনরুৎপাদনযোগ্য।
import random

devices = [("Device-A", 11), ("Device-B", 22), ("Device-C", 33), ("Device-D", 44)]

backoffs = []
for name, seed in devices:
    rng = random.Random(seed)          # প্রতিটি ডিভাইসের নিজস্ব ফিক্সড-সিড generator
    slot = rng.randint(0, 15)          # contention window: 0 থেকে 15 স্লট
    backoffs.append((name, slot))

print("প্রতিটি ডিভাইসের র‍্যান্ডম ব্যাকঅফ (contention window 0-15 স্লট):")
for name, slot in backoffs:
    print(f"  {name}: {slot} স্লট অপেক্ষা")

order = sorted(backoffs, key=lambda x: x[1])
print("\nট্রান্সমিশন অর্ডার (সবচেয়ে কম ব্যাকঅফ আগে ট্রান্সমিট করে):")
for i, (name, slot) in enumerate(order, 1):
    print(f"  {i}. {name} (backoff={slot})")

winner = order[0]
print(f"\nবিজয়ী: {winner[0]} সবার আগে ট্রান্সমিট করবে (backoff={winner[1]})")
if order[0][1] == order[1][1]:
    print("সতর্কতা: শীর্ষ দুই ডিভাইসের ব্যাকঅফ সমান -> কলিশনের ঝুঁকি!")
else:
    print("কোনো টাই নেই -> এই রাউন্ডে কলিশন এড়ানো গেছে।")

    
লক্ষ্য করুন — প্রতিটি ডিভাইসের জন্য একটি আলাদা, ফিক্সড seed-সহ random.Random(seed) ব্যবহার করা হয়েছে (কখনোই বেয়ার unseeded random নয়), তাই এই কোড প্রতিবার চালালে ঠিক একই ব্যাকঅফ মান ও একই বিজয়ী দেবে — বাস্তব WiFi ডিভাইসে ব্যাকঅফ সত্যিকারের র‍্যান্ডম হয়, এখানে শুধু reproducibility-এর জন্য সিড ফিক্স করা হয়েছে।
মূল কথা · Key takeaway

WiFi-তে কলিশন detect করা কঠিন বলে CSMA/CA সক্রিয়ভাবে কলিশন এড়ানোর চেষ্টা করে — carrier sensing ও random backoff-এর মাধ্যমে। hidden terminal problem দেখায় কেন এড়ানো কখনোই ১০০% নিশ্চিত হয় না — শুধু সম্ভাবনা কমানো যায়। পরের পাঠে (L39) আমরা সেলুলার নেটওয়ার্কের দিকে যাব, যেখানে ভিন্ন এক ধরনের শেয়ারড-স্পেকট্রাম চ্যালেঞ্জ আছে।

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

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

প্র ০১ WiFi কেন Ethernet-এর মতো CSMA/CD (কলিশন detect) ব্যবহার করতে পারে না, CSMA/CA (কলিশন avoid) ব্যবহার করতে হয়?

একটি ট্রান্সমিটিং রেডিও ডিভাইস নিজের ট্রান্সমিশনের সময় নিজের রিসিভারে অন্য কারো দুর্বল সিগন্যাল শুনতে পারে না (নিজের সিগন্যাল অনেক বেশি শক্তিশালী, একে "self-interference" সমস্যা বলা যায়) — তাই ট্রান্সমিট করার সময় real-time-এ কলিশন detect করা কার্যত অসম্ভব। ওয়্যার্ড Ethernet-এ ভোল্টেজ পরিবর্তন সহজে detect করা যায় বলে CSMA/CD সম্ভব ছিল, কিন্তু ওয়্যারলেসে সেই মেকানিজম কাজ করে না।

প্র ০২ hidden terminal problem-এ ঠিক কী ঘটে, এবং কেন এটি শুধু ওয়্যারলেসেই দেখা যায়, ওয়্যার্ড Ethernet-এ নয়?

দুটি ডিভাইস একে অপরের রেডিও রেঞ্জের বাইরে থাকলেও একই AP-এর রেঞ্জে থাকতে পারে — একে অপরের ট্রান্সমিশন শুনতে না পেয়ে দুজনেই "চ্যানেল ফাঁকা" মনে করে একসাথে ট্রান্সমিট করে ফেলতে পারে, যা AP-এর কাছে গিয়ে কলিশন ঘটায়। ওয়্যার্ড Ethernet-এ এটি ঘটে না কারণ একই শেয়ারড ক্যাবলে থাকা সব ডিভাইস একে অপরের সিগন্যাল সরাসরি একই মাধ্যমে শুনতে পায় — কোনো "রেঞ্জ" সীমাবদ্ধতা নেই যা কাউকে অন্যের ট্রান্সমিশন থেকে "লুকিয়ে" রাখতে পারে।

প্র ০৩ র‍্যান্ডম ব্যাকঅফ ব্যবহার করেও কলিশন কেন সম্পূর্ণ দূর হয় না, শুধু কমে?

যেহেতু প্রতিটি ডিভাইস স্বাধীনভাবে একটি সীমিত রেঞ্জ (যেমন 0-15) থেকে ব্যাকঅফ বেছে নেয়, দুই বা ততোধিক ডিভাইস কাকতালীয়ভাবে একই সংখ্যক স্লট বেছে নিতে পারে — বিশেষ করে যখন অনেক ডিভাইস একই সাথে ট্রান্সমিট করতে চায় এবং রেঞ্জ ছোট হয়। এই কাকতালীয় টাই ঘটলে কলিশন তখনও ঘটবে — র‍্যান্ডম ব্যাকঅফ শুধু সম্ভাবনা কমায় (রেঞ্জ যত বড়, টাইয়ের সম্ভাবনা তত কম), পুরোপুরি নিশ্চয়তা দেয় না।

অনুশীলন

  1. পরীক্ষা করুন: উপরের কোড সেলে Device-B-এর সিড বদলে ১১ (Device-A-এর সিডের সমান) করুন এবং চালান। কী পার্থক্য দেখেন?

    যেহেতু একই সিড দিলে random.Random(seed) ঠিক একই ধারাবাহিক মান তৈরি করে, Device-A ও Device-B এখন ঠিক একই backoff স্লট পাবে — কোডটি তখন "সতর্কতা: শীর্ষ দুই ডিভাইসের ব্যাকঅফ সমান -> কলিশনের ঝুঁকি!" প্রিন্ট করবে, যা বাস্তবে দুটি ডিভাইসের কাকতালীয়ভাবে একই ব্যাকঅফ বেছে নেওয়ার পরিস্থিতি অনুকরণ করে।

  2. চিন্তা করুন: contention window randint(0, 15)-এর বদলে যদি randint(0, 1) করা হয় (মাত্র ২টি সম্ভাব্য মান), কলিশনের সম্ভাবনা কী বাড়বে না কমবে?

    বাড়বে। যত ছোট রেঞ্জ থেকে ব্যাকঅফ বেছে নেওয়া হয়, ততই বেশি সম্ভাবনা থাকে একাধিক ডিভাইস কাকতালীয়ভাবে একই মান বেছে নেওয়ার — মাত্র ২টি সম্ভাব্য মানে (0 বা 1) ৪টি ডিভাইসের মধ্যে অন্তত দুজনের একই মান পাওয়ার সম্ভাবনা অনেক বেশি। এই কারণেই বাস্তব CSMA/CA প্রোটোকল কলিশন repeated হলে contention window ধাপে ধাপে বড় করে (exponential backoff), সম্ভাবনা কমাতে।

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

আগের পাঠ
নেটওয়ার্ক প্রোগ্রামিং প্যাটার্ন