সরাসরি পর্বে যান
পর্ব ২৬ · ৬২-এর মধ্যে · মডিউল ৪

Multicast আর QoS — একসাথে অনেককে পাঠানো আর অগ্রাধিকার

IP Multicast and Quality of Service — Group Addresses, IGMP Snooping, RPF and PIM Trees, DSCP Marking, Token Buckets, IntServ and DiffServ

Taught in Bangla, this lesson covers sending once to many: unicast, broadcast, multicast and anycast, IPv4 multicast addresses and their Ethernet MAC mapping, IGMP and IGMP snooping, RPF checks and PIM distribution trees. It then explains quality of service: classifying and marking with DSCP, queue scheduling, policing and shaping with token buckets, and the IntServ and DiffServ models.

এই পর্বে যা শিখবেন

  • চার রকম পাঠানো, multicast কোথায় লাভজনক, আর IPv4 multicast ঠিকানার পরিসর ও MAC-এ রূপান্তর (হাতে আর কোডে)
  • IGMP-র join, leave আর query, IGMP snooping switch-এর টেবিল, আর IPv6-এ MLD
  • Source tree বনাম shared tree, RPF check, flood-and-prune বনাম explicit join (PIM-DM, PIM-SM, SSM) — আর কেন ইন্টারনেট-জুড়ে multicast জমেনি
  • ভয়েস আর ভিডিওর delay, jitter, loss-এর বাজেট; DSCP আর 802.1p চিহ্ন, trust boundary, policing বনাম shaping আর token bucket-এর হিসাব
  • LLQ, IntServ বনাম DiffServ, MPLS-TE, ECN, net neutrality আর বাসার Wi-Fi-র WMM

১ · একজনকে, সবাইকে, দলকে, কাছেরজনকে — চার রকম পাঠানো

এ পর্যন্ত প্রায় সব packet ছিল একজন প্রেরক থেকে একজন প্রাপকের দিকে। কিন্তু অনেক কাজে একই ডেটা একসাথে অনেকের দরকার — একটি টিভি চ্যানেল হাজার বাড়িতে। প্রত্যেককে আলাদা কপি পাঠালে প্রেরকের link ভেঙে পড়ে। এই পর্বের প্রথম অর্ধেক এর নেটওয়ার্ক-স্তরের সমাধান — multicast. দ্বিতীয় অর্ধেক অন্য প্রশ্ন: সবাই যখন একই লাইনে, কার packet আগে যাবে — QoS.

ধরনকে পায়ঠিকানার উদাহরণদৈনন্দিন তুলনা
Unicastএকজন নির্দিষ্ট প্রাপক192.0.2.10, একটি সাধারণ MACকুরিয়ারে একটি পার্সেল, একটি ঠিকানায়
Broadcastএকই LAN-এর (broadcast domain) সবাই, চাক বা না চাক255.255.255.255, ff:ff:ff:ff:ff:ffমহল্লার মসজিদের মাইকে ঘোষণা — সবাই শোনে
Multicastযারা দলে যোগ দিয়েছে, তারা — যেকোনো জায়গায়239.1.1.1, 01:00:5e:01:01:01, ff02::1টিভির একটি চ্যানেল — যে বাড়ি ওই চ্যানেল ধরেছে, শুধু সে দেখে
Anycastএকই ঠিকানার কয়েকজনের মধ্যে routing-এর হিসাবে সবচেয়ে কাছেরজনবড় পাবলিক DNS resolver-এর ঠিকানা“নিকটস্থ শাখায় যোগাযোগ করুন” — ব্যাংকের যেকোনো শাখা একই সেবা দেয়

Router broadcast পার করে না (পর্ব ১৮); IPv6-এ broadcast নেই, তার কাজ করে multicast (পর্ব ২১)। Anycast-এর আলাদা ঠিকানা নেই — একই prefix কয়েক জায়গা থেকে BGP-তে ঘোষণা করলেই হয় (পর্ব ২৫, ৩৮)।

Multicast কেন — একটি হিসাব

ধরুন একটি অফিসে একটি ভিডিও সম্প্রচার চলছে, প্রতিটি stream ৪ Mbps, দেখছেন ১০০ জন। Unicast-এ সার্ভারকে ১০০টি আলাদা stream পাঠাতে হয় — সার্ভারের link-এ ১০০ × ৪ = ৪০০ Mbps, আর পথের প্রতিটি ভাগাভাগির link-এ একই ডেটার অনেক কপি। Multicast-এ সার্ভার পাঠায় একটি stream, ৪ Mbps; router আর switch শুধু যেখানে পথ ভাগ হয় সেখানে কপি বানায়। ফলে প্রতিটি link-এ এই চ্যানেলের সর্বোচ্চ একটি কপি — দর্শক ১০০ হোক বা ১০,০০০.

 Unicast: S থেকে ১০০টি কপি           Multicast: S থেকে ১টি কপি
   S ══(100 কপি)══ R1                   S ──(1)── R1
                  ╱  ╲                            ╱  ╲
          (60 কপি)    (40 কপি)                 (1)    (1)
               R2      R3                      R2      R3
             60 জন    40 জন                  60 জন    40 জন

বাস্তবে multicast চলে যেখানে একই ডেটা একই মুহূর্তে অনেকের দরকার:

  • IPTV: অনেক দেশে ISP নিজের নেটওয়ার্কে সরাসরি সম্প্রচারের চ্যানেল multicast-এ পাঠায় — চ্যানেল বদলানো মানে এক দল ছেড়ে আরেক দলে যোগ দেওয়া। (চাহিদামতো ভিডিও একেকজন একেক সময়ে দেখে — তাই সেটি unicast আর CDN, পর্ব ৩৮ ও ৪০।)
  • শেয়ারবাজারের ডেটা আর OS imaging: অনেক এক্সচেঞ্জ দামের হালনাগাদ multicast feed-এ ছাড়ে, আর অনেক ল্যাব-টুল একসাথে বহু কম্পিউটারে একই disk image পাঠাতে multicast ব্যবহার করতে পারে।
  • নেটওয়ার্কের নিজের কাজ: OSPF 224.0.0.5/6-এ কথা বলে (পর্ব ২৪), mDNS 224.0.0.251-এ প্রিন্টার খোঁজে, IPv6-এর neighbor discovery চলে multicast-এ।

টিভিতে ক্রিকেট ম্যাচ: চ্যানেল প্রতিটি বাড়িতে আলাদা করে পাঠায় না — একটি সম্প্রচার, যে টিভি ওই চ্যানেলে আছে সে দেখে। Multicast আরও চালাক — যে গলিতে কেউ ওই চ্যানেল চায়নি, সেই গলির তারে ম্যাচের ডেটা যায়ই না। কে চেয়েছে আর কোন গলি দিয়ে পাঠাতে হবে — এই হিসাবই multicast-এর কাজ।

Multicast প্রায় সবসময় UDP-র ওপর চলে: TCP দুজনের সংযোগ, আর হাজার জনের ACK ফিরে এলে প্রেরক ডুবে যেত (ACK implosion). হারানো packet সামলায় অ্যাপ্লিকেশন — যেমন FEC দিয়ে (পর্ব ০৯)।

২ · Multicast ঠিকানা — পরিসর আর MAC-এ রূপান্তর

IPv4-এ multicast ঠিকানা মানে প্রথম চার bit 1110 — অর্থাৎ 224.0.0.0/4, পুরোনো ভাষায় Class D (পর্ব ১৬)। একটি multicast ঠিকানা কোনো যন্ত্রের নয়, একটি দলের। প্রেরক সাধারণ unicast উৎস ঠিকানা দিয়ে গন্তব্যে দলের ঠিকানা লেখে; multicast ঠিকানা কখনো উৎস হয় না। পরিসরের ভেতরে কয়েকটি গুরুত্বপূর্ণ ভাগ:

পরিসরনাম আর কাজRouter পার হয়?উদাহরণ
224.0.0.0/24Local Network Control Block — শুধু এই link-এর protocol-এর জন্যনা (সাধারণত TTL ১)224.0.0.1 সব host, 224.0.0.2 সব router, 224.0.0.5/6 OSPF, 224.0.0.13 PIM, 224.0.0.22 IGMPv3, 224.0.0.251 mDNS
224.0.1.0/24Internetwork Control Block — বাইরেও যেতে পারে এমন নিয়ন্ত্রণ-trafficহ্যাঁ224.0.1.1 NTP
232.0.0.0/8Source-Specific Multicast (RFC 4607) — প্রাপক উৎসও বেছে নেয়হ্যাঁIPTV-র (S, 232.x.x.x) চ্যানেল
239.0.0.0/8Administratively scoped (RFC 2365) — প্রতিষ্ঠানের ভেতরে ব্যবহারের জন্য, private ঠিকানার মতোপ্রতিষ্ঠানের ভেতরে হ্যাঁ, সীমানায় আটকানো হয়অফিসের ভিডিও, ল্যাবের imaging
বাকি অংশবিশ্বব্যাপী দল, IANA-র বরাদ্দ বা নানা বিশেষ ব্যবস্থাহ্যাঁ—

IPv6-এ multicast ঠিকানা ff00::/8, আর ঠিকানার ভেতরেই একটি scope-এর ঘর (যেমন ff02 = link-local, ff05 = site-local) — পর্ব ২১-এ দেখেছেন। বাকিটা এখানে IPv4 ধরে।

IP দল থেকে Ethernet MAC — শুধু ২৩ bit

LAN-এ packet যায় frame-এ, আর frame-এর গন্তব্য MAC চাই। Unicast-এ MAC খুঁজতে ARP লাগে (পর্ব ১৮); multicast-এ ARP নেই — MAC সরাসরি দলের ঠিকানা থেকে হিসাব করা হয় (RFC 1112):

  • প্রথম ২৫ bit স্থির: 01:00:5e আর তারপর একটি ০ bit. প্রথম byte-এর সবচেয়ে কম মানের bit ১ — অর্থাৎ group ঠিকানা (I/G bit, পর্ব ১২)।
  • বাকি ২৩ bit = IP দলের ঠিকানার শেষ ২৩ bit.

কিন্তু IP দলের ঠিকানায় চলমান bit আছে ২৮টি (প্রথম চারটি সবসময় 1110). ২৮ − ২৩ = ৫টি bit MAC-এ হারিয়ে যায়, তাই ২৫ = ৩২টি আলাদা IP দল একই MAC পায়. হাতে করে দেখি — 239.1.1.1:

239.1.1.1  = 1110 1111 . 0000 0001 . 0000 0001 . 0000 0001
              ^^^^ ^^^^   ^
              স্থির  হারানো ৫ bit (প্রথম byte-এর শেষ ৪ + দ্বিতীয় byte-এর প্রথম ১)
শেষ ২৩ bit  =               000 0001 . 0000 0001 . 0000 0001  = 01 . 01 . 01
MAC         = 01:00:5e  +  01:01:01   = 01:00:5e:01:01:01

দ্বিতীয় byte থেকে শুধু শেষ ৭ bit নেওয়া হয় (দ্বিতীয় byte & 0x7f). তাই 224.1.1.1, 225.129.1.1 (129 = 10000001), 238.129.1.1 — সবাই একই MAC 01:00:5e:01:01:01. প্রথম byte ২২৪ থেকে ২৩৯ — ১৬ রকম, দ্বিতীয় byte-এর প্রথম bit ০ বা ১ — ২ রকম: ১৬ × ২ = ৩২.

নিচের simulator দুটি কাজ করে। প্রথম অংশ কয়েকটি দলের MAC হিসাব করে আর গুনে দেখায় 239.1.1.1-এর MAC আর কতগুলো দল ভাগ করে। দ্বিতীয় অংশ একটি IGMP snooping switch-এর টেবিল চালায় — পরের অংশের বিষয়, তবে MAC আর port একসাথে দেখতে এখানেই রাখা হলো। Switch-এর port 1-এ router (stream সেখান দিয়ে ঢোকে), port 2–6-এ host.

// Part 1: IPv4 group -> Ethernet MAC (RFC 1112): 01:00:5e + the low 23 bits of the group.
const hex = n => n.toString(16).padStart(2, "0");
function groupMac(ip) {
  const o = ip.split(".").map(Number);
  return ["01", "00", "5e", hex(o[1] & 0x7f), hex(o[2]), hex(o[3])].join(":");
}
for (const g of ["224.0.0.1", "224.0.0.251", "239.1.1.1", "224.1.1.1", "225.129.1.1", "238.129.1.1"])
  console.log(g.padEnd(12), "->", groupMac(g));
let same = 0;                         // how many groups share the MAC of 239.1.1.1?
for (let first = 224; first <= 239; first++)
  for (const second of [1, 129])
    if (groupMac(`${first}.${second}.1.1`) === groupMac("239.1.1.1")) same++;
console.log("groups sharing 01:00:5e:01:01:01 =", same);

// Part 2: an IGMP snooping switch. The stream for each group enters on port 1 (router).
const members = new Map();            // group -> Set of host ports
function step(what, type, port, group) {
  if (!members.has(group)) members.set(group, new Set());
  if (type === "join") members.get(group).add(port);
  if (type === "leave") members.get(group).delete(port);
  const out = g => [...(members.get(g) || [])].sort().join(",") || "none";
  console.log(what.padEnd(36), "| 239.1.1.1 ->", out("239.1.1.1").padEnd(5),
    "| 239.2.2.2 ->", out("239.2.2.2"));
}
console.log("\nevent (switch ports 2-6 have hosts)   | ports that get each stream");
step("port 5 TV: Report 239.1.1.1", "join", 5, "239.1.1.1");
step("port 3 PC: Report 239.1.1.1", "join", 3, "239.1.1.1");
step("port 4 PC: Report 239.2.2.2", "join", 4, "239.2.2.2");
step("port 3 PC: Leave 239.1.1.1", "leave", 3, "239.1.1.1");
step("general query; ports 4, 5 report", "none", 0, "239.1.1.1");
step("port 5 unplugged, 260 s no report", "leave", 5, "239.1.1.1");
console.log("without snooping every stream -> 2,3,4,5,6");

আউটপুট:

224.0.0.1    -> 01:00:5e:00:00:01
224.0.0.251  -> 01:00:5e:00:00:fb
239.1.1.1    -> 01:00:5e:01:01:01
224.1.1.1    -> 01:00:5e:01:01:01
225.129.1.1  -> 01:00:5e:01:01:01
238.129.1.1  -> 01:00:5e:01:01:01
groups sharing 01:00:5e:01:01:01 = 32

event (switch ports 2-6 have hosts)   | ports that get each stream
port 5 TV: Report 239.1.1.1          | 239.1.1.1 -> 5     | 239.2.2.2 -> none
port 3 PC: Report 239.1.1.1          | 239.1.1.1 -> 3,5   | 239.2.2.2 -> none
port 4 PC: Report 239.2.2.2          | 239.1.1.1 -> 3,5   | 239.2.2.2 -> 4
port 3 PC: Leave 239.1.1.1           | 239.1.1.1 -> 5     | 239.2.2.2 -> 4
general query; ports 4, 5 report     | 239.1.1.1 -> 5     | 239.2.2.2 -> 4
port 5 unplugged, 260 s no report    | 239.1.1.1 -> none  | 239.2.2.2 -> 4
without snooping every stream -> 2,3,4,5,6

প্রথম অংশ: 224.0.0.1 (সব host-এর দল) → 01:00:5e:00:00:01, mDNS-এর 224.0.0.251 → শেষ byte ২৫১ = fb. তারপর চারটি আলাদা দল — 239.1.1.1, 224.1.1.1, 225.129.1.1, 238.129.1.1 — সবাই 01:00:5e:01:01:01. লুপটি ২২৪–২৩৯ আর দ্বিতীয় byte ১ বা ১২৯-এর সব জোড়া পরীক্ষা করে পেয়েছে ঠিক ৩২টি — হাতের হিসাবের সাথে মিলেছে।

ফল: 239.1.1.1-এ যোগ দেওয়া কম্পিউটারের card 224.1.1.1-এর frame-ও নেয়, kernel-কে IP header দেখে ছাঁকতে হয়; আর শুধু MAC দেখা snooping switch দুই দলকে আলাদা করতে পারে না। তাই একই নেটওয়ার্কে শেষ ২৩ bit মেলে এমন দুটি দল বাছবেন না।

দ্বিতীয় অংশ: টিভি (5) আর PC (3) যোগ দিলে stream যায় শুধু 3 আর 5-এ; port 4 নিল 239.2.2.2. PC-র Leave-এ port 3 বাদ; general query-তে কিছু বদলায়নি। টিভি হঠাৎ খুলে ফেলায় Leave যায়নি — ২৬০ সেকেন্ড পর port 5-ও বাদ। Snooping না থাকলে প্রতিটি stream যেত 2–6 সব port-এ। নিজে চেষ্টা করুন: শেষে step("port 6 TV: Report 239.2.2.2", "join", 6, "239.2.2.2"); যোগ করার আগে ফল অনুমান করুন।

IPv6-এ একই ধারণা, অন্য সংখ্যা: MAC = 33:33 আর দলের ঠিকানার শেষ ৩২ bit (RFC 2464) — এখানেও বাকি bit হারায়, তবে অনেক কম সংঘর্ষ।

৩ · IGMP — “আমি এই দলে আছি” আর switch-এর কান পাতা

কে চায় — প্রেরক জানে না, জানার দরকারও নেই। জানতে হয় প্রাপকের কাছের router-কে: তার LAN-এ কোনো দলের অন্তত একজন সদস্য আছে কি না। এই খবরের protocol IGMP (IP protocol নম্বর ২)। IPv6-এ একই কাজ করে MLD, ICMPv6-এর অংশ হিসেবে।

সংস্করণমূল বার্তানতুন কী এনেছে
IGMPv1 (RFC 1112, ১৯৮৯)Query, Reportশুধু যোগ দেওয়া; ছাড়ার বার্তা নেই — router টাইমআউট পর্যন্ত অপেক্ষা করে
IGMPv2 (RFC 2236, ১৯৯৭)Membership Query (0x11), v2 Membership Report (0x16), Leave Group (0x17)Leave বার্তা আর একটি নির্দিষ্ট দলের জন্য প্রশ্ন (group-specific query) — চ্যানেল বদলানো দ্রুত হয়
IGMPv3 (RFC 3376, ২০০২)Query, v3 Membership Report (0x22, যায় 224.0.0.22-এ)উৎস বাছাই: “শুধু S থেকে” (INCLUDE) বা “S বাদে সবার থেকে” (EXCLUDE) — SSM-এর ভিত্তি

IGMPv2-এর কাজের ধারা, সংক্ষেপে:

  • যোগ দেওয়া: host নিজে থেকেই দলের ঠিকানায় Report পাঠায় (TTL ১)।
  • নিয়মিত প্রশ্ন: querier router ডিফল্টে প্রতি ১২৫ সেকেন্ডে 224.0.0.1-এ General Query পাঠায়; সদস্যরা ১০ সেকেন্ডের মধ্যে Report দেয় (v2-তে অন্যের Report শুনলে নিজেরটি চেপে যায়)।
  • ছাড়া: host 224.0.0.2-এ Leave পাঠায়; router group-specific query পাঠিয়ে দেখে আর কেউ আছে কি না।
  • নিঃশব্দে চলে যাওয়া: Leave ছাড়া বন্ধ হলে ২ × ১২৫ + ১০ = ২৬০ সেকেন্ড Report না এলে সদস্যপদ শেষ।

IGMP snooping — switch যখন কান পাতে

Switch MAC শেখে frame-এর উৎস দেখে (পর্ব ১২), কিন্তু 01:00:5e:… কখনো উৎস হয় না — তাই switch অজানা গন্তব্যের মতো সব port-এ ছড়িয়ে দেয়। একটি ২০ Mbps-এর stream তখন যে চায়নি তার port-এও যায়, Wi-Fi access point-এ গেলে বাতাসের সময়ও খায় (পর্ব ১৪)।

সমাধান IGMP snooping (নির্দেশিকা RFC 4541): switch IGMP বার্তায় উঁকি দিয়ে টেবিল রাখে কোন port-এ কোন দলের সদস্য, আর router-এর port (mrouter port) মনে রাখে, যাতে Report সেখানে পৌঁছায়। Snooping চলে VLAN ধরে (পর্ব ১৩)।

একটি switch: port 1 → router (querier), port 3 → PC, port 5 → IPTV box
ঘটনা
IGMP বার্তা
Switch-এর snooping টেবিল
Report কোথায় গেল
Router-এর অবস্থা
Stream যায় port-এ
  1. শুরু। Router (port 1) LAN-এর querier. কেউ কোনো দলে নেই — snooping টেবিল খালি, কোনো multicast আসছে না।
  2. Box Report পাঠাল। চ্যানেল বদলানো মানে দলে যোগ দেওয়া: গন্তব্য 239.1.1.1 (MAC 01:00:5e:01:01:01)-এ IGMPv2 Report. Switch snoop করে লিখল “239.1.1.1 → port 5”, আর Report পাঠাল শুধু router-এর port 1-এ।
  3. Router জানল। এই interface-এ সদস্য আছে; router নিজে গাছে না থাকলে উৎস বা RP-র দিকে PIM Join পাঠায় (অংশ ৪) — এভাবে stream টেনে আনা হয়।
  4. Stream শুধু port 5-এ। Stream port 1 দিয়ে ঢুকল; switch টেবিল দেখে পাঠাল শুধু port 5-এ। Snooping না থাকলে 2–6 সবাই পেত।
  5. দ্বিতীয় সদস্য। Port 3-এর PC-ও Report দিল; টেবিল {3, 5}. Router-এর কাছে কিছু বদলায়নি — তার জানার বিষয় শুধু “সদস্য আছে কি না”.
  6. PC ছাড়ল। Leave গেল 224.0.0.2-এ; router-এর group-specific query-তে port 5-এর box উত্তর দিল, তাই দল রইল। Switch শুধু port 3 মুছল।

Querier ছাড়া snooping বিপজ্জনক: যে VLAN-এ কোনো multicast router নেই (যেমন শুধু একটি imaging সার্ভার আর ল্যাবের কম্পিউটার), সেখানে কেউ Query পাঠায় না। Host-রা শুরুতে একবার Report দিয়ে চুপ থাকে, কিছুক্ষণ পর switch-এর টেবিল মেয়াদোত্তীর্ণ হয়, আর stream হঠাৎ থেমে যায় বা আবার সব port-এ ছড়ায় — vendor-ভেদে আচরণ আলাদা। তাই এমন VLAN-এ switch-এ “IGMP snooping querier” চালু রাখা হয়।

নিজের যন্ত্র কোন দলে আছে, Linux-এ দেখায় ip maddr show আর /proc/net/igmp (উল্টো byte ক্রমের hex, পর্ব ০৬)। একটি সাধারণ Linux ল্যাপটপে এমন — সংখ্যা যন্ত্রভেদে আলাদা:

$ ip maddr show dev eth0
2:	eth0
	link  33:33:00:00:00:01
	link  01:00:5e:00:00:01
	link  01:00:5e:00:00:fb
	inet  224.0.0.251
	inet  224.0.0.1
	inet6 ff02::1
$ cat /proc/net/igmp
Idx	Device    : Count Querier	Group    Users Timer	Reporter
2	eth0      :     2      V3
				FB0000E0     1 0:00000000		0
				010000E0     1 0:00000000		0

FB0000E0 উল্টে পড়ুন: E0.00.00.FB = 224.0.0.251 (mDNS); আর V3 মানে interface-টি IGMPv3 মোডে আছে (পুরোনো সংস্করণের কোনো querier শোনা যায়নি)। Windows-এ একই তথ্য দেখায় netsh interface ipv4 show joins.

৪ · Multicast routing — গাছ, RPF check আর PIM

IGMP শুধু শেষ LAN-টুকুর খবর দেয়। বাকি প্রশ্ন router-দের: উৎস থেকে সব সদস্য-LAN পর্যন্ত কোন কোন link দিয়ে কপি যাবে? উত্তর একটি গাছ (tree) — উৎস বা একটি কেন্দ্র থেকে শাখা মেলে সব সদস্যের দিকে, কোনো চক্র (loop) ছাড়া। চক্র থাকলে multicast packet ঘুরতে ঘুরতে অসংখ্য কপি হতো, যেমন পর্ব ১২-এর broadcast storm.

Source tree — (S,G)

প্রতিটি উৎস S-এর জন্য আলাদা গাছ, উৎস থেকে প্রতিটি প্রাপক পর্যন্ত সবচেয়ে ছোট পথ দিয়ে — তাই একে shortest-path tree (SPT)-ও বলে। Delay সবচেয়ে কম। দাম: প্রতিটি (উৎস, দল) জোড়ার জন্য router-এ আলাদা state.

কম delay · বেশি state

Shared tree — (*,G)

দলের সব উৎসের জন্য একটিই গাছ, যার মূল একটি নির্দিষ্ট router — rendezvous point (RP). উৎস আগে RP-তে পাঠায়, RP গাছ বেয়ে সবাইকে। State কম, কিন্তু পথ ঘুরপথ হতে পারে আর RP-র ওপর চাপ।

কম state · ঘুরপথ সম্ভব

RPF check — উল্টো পথ দিয়ে যাচাই

Unicast-এ router দেখে গন্তব্য. Multicast-এ গন্তব্য একটি দল — সবাই। তাই multicast router দেখে উৎস, আর একটি সরল নিয়ম মানে — Reverse Path Forwarding (RPF) check:

RPF নিয়ম

উৎস S-এর একটি multicast packet interface I দিয়ে এলো। আমার unicast routing table অনুযায়ী S-এ পৌঁছাতে আমি যদি I দিয়েই পাঠাতাম, তবে গ্রহণ করি আর বাকি (দরকারি) interface-এ কপি পাঠাই। অন্য কোনো interface দিয়ে এলে ফেলে দিই.

যুক্তি: S থেকে আমার কাছে সবচেয়ে ছোট পথের কপিটি আসবে S-এর দিকের interface দিয়েই। অন্য দিক দিয়ে আসা কপি হয় ঘুরপথের duplicate, নয়তো চক্রের ফল। কুমিল্লার শাখা জানে, “ঢাকার সার্কুলার আসে মহাসড়কের দিক থেকে” — নোয়াখালী ঘুরে আসা কপি সে ফেলে দেয়। লক্ষ করুন, RPF-এর জন্য আলাদা কোনো multicast routing table লাগে না — unicast table-ই যথেষ্ট (OSPF, BGP বা static যা দিয়েই বানানো)। এ কারণেই নাম Protocol Independent Multicast.

নিচের নেটওয়ার্কে উৎস S বসে router A-র পেছনে। প্রতিটি link-এর খরচ দেওয়া; প্রাপক আছে শুধু D আর F-এর LAN-এ (IGMP থেকে জানা)। প্রথমে দেখি প্রতিটি router S-এর দিকে কোন প্রতিবেশী দিয়ে যায় (RPF neighbour), তারপর flood-and-prune.

             S  (উৎস)
             │
             A
        (1) ╱ ╲ (3)
           B ─(1)─ C ─(1)─ G
           │       │       │
          (2)     (1)      │
           │       │       │
           D ─(1)─ E       │    D-তে প্রাপক
           │ │     │       │
           │ │    (1)      │
           │ │     │       │
           │ └(3)─ F ← প্রাপক
           └──────(2)──────┘   (D–G link)

ছবিটি সরল করে আঁকা; সব link একসাথে: A–B ১, A–C ৩, B–C ১, B–D ২, C–E ১, D–E ১, D–F ৩, E–F ১, C–G ১, D–G ২.

প্রতিটি router: S-এর দিকের প্রতিবেশী (RPF) আর কার কপি এলো
B (RPF = A)
C (RPF = B)
D (RPF = B)
E (RPF = C)
F (RPF = E)
G (RPF = C)
RPF-এ বাতিল কপি (মোট)
  1. RPF neighbour ঠিক করা। প্রতিটি router unicast table দেখে: S-এ যেতে কোন প্রতিবেশী দিয়ে যাই? C-র সরাসরি A–C খরচ ৩, কিন্তু B দিয়ে ১ + ১ = ২ — তাই RPF B. E-র RPF C (৩; D দিয়ে ৪), F-এর E (৪; D দিয়ে ৬)।
  2. A ছড়াল। A কপি পাঠাল B আর C-তে। B-র RPF A — গ্রহণ। C বাতিল করল: সরাসরি link থাকলেও S-এর দিকে C-র পছন্দের পথ B দিয়ে।
  3. B থেকে C আর D. B যে link দিয়ে পেয়েছে তা বাদে সবখানে পাঠাল। C আর D দুজনের RPF B — দুজনেই গ্রহণ করল।
  4. দ্বিতীয় ঢেউ। C পাঠাল E, G-তে; D পাঠাল E, F, G-তে। E আর G C-র কপি নিল, D-র কপি বাতিল; F-ও D-র কপি বাতিল করল। মোট বাতিল ৪.
  5. তৃতীয় ঢেউ। E পাঠাল D, F-এ — F গ্রহণ করল, D বাতিল। G আর F-এর কপিও D বাতিল করল। মোট ৭টি বাতিল; প্রতিটি router ঠিক একবার গ্রহণ করেছে, কোনো loop নেই।
  6. Prune. G-র LAN-এ কেউ নেই, আর G কারো RPF neighbour নয় — তাই G C-কে prune পাঠায়। থাকল গাছ A→B, B→C, B→D, C→E, E→F — S থেকে shortest-path tree.

এই হিসাব কোডে — Dijkstra দিয়ে S-এর দিকে সবচেয়ে ছোট পথ (পর্ব ২৪-এর algorithm; আরও বিস্তারিত DSA-র Dijkstra পর্বে), তারপর flooding-এ প্রতিটি router-এ কোন কপি এলো আর RPF-এ টিকল কি না, শেষে prune:

// Routers and link costs. The multicast source S is attached to router A.
const links = [["A","B",1], ["A","C",3], ["B","C",1], ["B","D",2], ["C","E",1],
               ["D","E",1], ["D","F",3], ["E","F",1], ["C","G",1], ["D","G",2]];
const receivers = new Set(["D", "F"]);          // routers that heard IGMP Reports
const nb = {};
for (const [u, v, c] of links) { (nb[u] ??= []).push([v, c]); (nb[v] ??= []).push([u, c]); }
// Unicast shortest paths towards S (Dijkstra from A) give each router its RPF neighbour.
const dist = { A: 0 }, rpf = {}, done = new Set();
while (done.size < Object.keys(nb).length) {
  const u = Object.keys(dist).filter(x => !done.has(x)).sort((x, y) => dist[x] - dist[y])[0];
  done.add(u);
  for (const [v, c] of nb[u])
    if (!(v in dist) || dist[u] + c < dist[v]) { dist[v] = dist[u] + c; rpf[v] = u; }
}
// Flooding: every router forwards one copy on every link except the one towards S.
let dropped = 0;
console.log("router  dist  RPF-nbr  copies arriving from neighbours");
for (const r of Object.keys(nb).sort()) {
  if (r === "A") { console.log("A       0     (S)      source router: sends to B, C"); continue; }
  const from = nb[r].map(([n]) => n).filter(n => rpf[n] !== r).sort();
  dropped += from.length - 1;
  const txt = from.map(n => n + (n === rpf[r] ? ":ACCEPT" : ":drop")).join("  ");
  console.log(r.padEnd(8) + String(dist[r]).padEnd(6) + rpf[r].padEnd(9) + txt);
}
console.log("copies dropped by the RPF check:", dropped);
// Prune: keep a branch only if the router has receivers or a child on the tree needs it.
const needed = r => receivers.has(r) || Object.keys(rpf).some(c => rpf[c] === r && needed(c));
const all = Object.keys(rpf).sort();
console.log("tree after pruning:", all.filter(needed).map(c => rpf[c] + "->" + c).join("  "));
console.log("pruned routers:", all.filter(r => !needed(r)).join(" ") || "none");

আউটপুট:

router  dist  RPF-nbr  copies arriving from neighbours
A       0     (S)      source router: sends to B, C
B       1     A        A:ACCEPT
C       2     B        A:drop  B:ACCEPT
D       3     B        B:ACCEPT  E:drop  F:drop  G:drop
E       3     C        C:ACCEPT  D:drop
F       4     E        D:drop  E:ACCEPT
G       3     C        C:ACCEPT  D:drop
copies dropped by the RPF check: 7
tree after pruning: A->B  B->C  B->D  C->E  E->F
pruned routers: G

প্রতিটি সারিতে ঠিক একটি ACCEPT — প্রতিটি router প্রতিটি packet একবারই গ্রহণ করে। C A-র সরাসরি কপি বাতিল করেছে, কারণ তার দূরত্ব ২ আসে B দিয়ে। D-তে চারটির তিনটি বাতিল। মোট ৭টি কপি অযথা link খেয়েছে, অথচ ১০টি link-এর মধ্যে গাছে লাগে ৫টি — flood-and-prune-এর দাম, আর prune-এর মেয়াদ শেষ হলে (PIM-DM-এ সাধারণত প্রায় ৩ মিনিট; RFC 3973-এর ডিফল্ট ২১০ সেকেন্ড) আবার flood. নিজে চেষ্টা করুন: receivers-এ "G" যোগ করুন — prune-এর তালিকা কী হবে? আর A–C-র খরচ ৩ থেকে ১ করলে C-র RPF neighbour কে হবে?

দুই ঘরানা — flood-and-prune বনাম explicit join

বিষয়Flood-and-prune (dense mode)Explicit join (sparse mode)
ধারণাসবাই চায় ধরে নিয়ে প্রথমে সবখানে পাঠানো, যারা চায় না তারা prune পাঠায়কেউ চায় না ধরে নিয়ে শুরু; যার প্রাপক আছে সে Join পাঠায়, সেই পথেই গাছ
ProtocolDVMRP (RFC 1075, ১৯৮৮), PIM-DM (RFC 3973)PIM-SM (বর্তমান মান RFC 7761, ২০১৬), SSM
মানানসই যখনপ্রাপক প্রায় সবখানে, নেটওয়ার্ক ছোটপ্রাপক ছড়ানো-ছিটানো, নেটওয়ার্ক বড় — আজকের প্রায় সব ব্যবহার
দুর্বলতানিয়মিত flood-এ অপচয়; যেখানে কেউ নেই সেখানেও prune-এর stateRP-র জায়গা ঠিক করা আর তাকে সব router-কে জানানো লাগে; RP নষ্ট হলে নতুন উৎস খুঁজে পাওয়া যায় না

Flood-and-prune সহজ, কিন্তু পুরো ইন্টারনেট ধরে flood অসম্ভব। PIM-SM-এ সদস্যের LAN-এর router (last-hop) RP-র দিকে RPF পথ বেয়ে hop ধরে ধরে (*,G) Join পাঠায়; পথের প্রতিটি router মনে রাখে কোন interface-এ পাঠাতে হবে — এভাবে shared tree. উৎসের কাছের router (first-hop) প্রথম packet-গুলো Register বার্তায় মুড়িয়ে RP-তে পাঠায়, RP উৎসের দিকে (S,G) Join পাঠায়। এরপর last-hop router চাইলে নিজেই (S,G) Join পাঠিয়ে shortest-path tree-তে সরে যায়। RP তাই মূলত পরিচয় করিয়ে দেওয়ার জায়গা — ঘটকের মতো।

SSM আরও সরল: প্রাপক আগে থেকেই উৎস জানলে IGMPv3-এ বলে “(S, G) চাই”, আর router সোজা S-এর দিকে Join পাঠায় — RP, Register, shared tree কিছুই নেই (232.0.0.0/8). অন্য কেউ একই দলে পাঠালেও পৌঁছায় না, কারণ গাছটি শুধু S-এর।

ইন্টারনেট-জুড়ে multicast কেন জমল না

Steve Deering-এর কাজ থেকে IP multicast-এর নকশা আসে (RFC 1112, ১৯৮৯), আর ১৯৯২ সালে IETF-এর একটি সভার অডিও multicast-এ সম্প্রচার দিয়ে শুরু হয় পরীক্ষামূলক MBone. তবু ইন্টারনেট-জুড়ে multicast জমেনি। প্রচলিত ব্যাখ্যা: পথের প্রতিটি ISP-কে multicast চালু রাখতে আর RP-র খবর ভাগ করতে হতো, অথচ খরচ কে বহন করবে তার মডেল ছিল না; প্রতিটি দলের state প্রতিটি router-এ; যে কেউ দলে পাঠাতে পারত বলে অপব্যবহারের ঝুঁকি; আর মানুষ “যখন খুশি” দেখতে শুরু করল, যেখানে multicast কাজে আসে না (বিস্তারিত ভাবনার প্রশ্ন ১-এ)।

তাই multicast টিকে আছে এক মালিকের নেটওয়ার্কে — প্রতিষ্ঠানের LAN আর WAN, ISP-র নিজস্ব IPTV, আর্থিক নেটওয়ার্ক, কিছু data center-এর overlay আর link-local নিয়ন্ত্রণ-বার্তায়। ইন্টারনেট-জুড়ে কাজটি নিয়েছে application-layer multicast: CDN-এর সার্ভার বা ব্যবহারকারীরা নিজেরাই কপি বানিয়ে পাঠায় (পর্ব ৩৮)। চালু করা সহজ, কিন্তু একই link-এ কয়েকটি কপি যেতে পারে।

৫ · QoS কেন — best effort যেখানে যথেষ্ট নয়

পর্ব ১৫-এ দেখেছেন, ইন্টারনেট best effort: ভিড়ে delay বাড়ে, buffer ভরলে packet হারায় (tail drop). ফাইল ডাউনলোডে ক্ষতি সামান্য — TCP আবার পাঠাবে। ভয়েস কল আলাদা জিনিস।

TrafficDelayJitterLossBandwidth
VoIP ভয়েস কলখুব সংবেদনশীলখুব সংবেদনশীলসংবেদনশীল (কিছুটা লুকানো যায়)কম, স্থির
ভিডিও কলখুব সংবেদনশীলসংবেদনশীলসংবেদনশীলমাঝারি থেকে বেশি, ঝাপটায়
চাহিদামতো ভিডিও (stream)কম (আগে buffer করে)কমকম (TCP বা QUIC সামলায়)বেশি
ফাইল, ইমেইল, backupপ্রায় নেইনেইনেই (আবার পাঠায়)যত পায়

ভয়েসের বাজেট — কত দেরি সহ্য হয়

কথা বলার সময় একদিকের delay বেশি হলে দুজন একসাথে বলে ফেলেন, তারপর দুজনেই থামেন — কথোপকথন জট পাকায়। ITU-T-র G.114 সুপারিশে সাধারণভাবে বলা হয়, একদিকের delay প্রায় ১৫০ ms-এর মধ্যে থাকলে বেশিরভাগ ব্যবহারকারী সন্তুষ্ট থাকেন, আর এর বেশি হলে মান ক্রমে খারাপ হয় (এটি নির্দেশনা, কঠোর সীমা নয়)। Jitter আর loss-এর জন্যও vendor-দের নকশা-নির্দেশিকায় প্রচলিত লক্ষ্য দেখা যায় — যেমন jitter কয়েক দশ ms-এর মধ্যে আর loss এক শতাংশের কম — তবে এগুলো codec আর ব্যবস্থাভেদে বদলায়।

একটি সাধারণ বাজেট, হিসাব করে দেখি (সংখ্যাগুলো উদাহরণ):

অংশসময়কোথা থেকে
Codec আর packet ভরা২০ ms + কয়েক msপ্রতি packet-এ ২০ ms-এর কণ্ঠ জমিয়ে তবে পাঠানো
প্রচার (propagation)যেমন ৩০ msদূরত্ব ÷ আলোর গতি (fiber-এ মোটামুটি ২ × ১০৮ m/s, পর্ব ০৫)
Queuing আর transmission০ থেকে শত msপথের ভিড় — QoS এই অংশটি নিয়ন্ত্রণ করে
Jitter bufferযেমন ৪০ msপ্রাপক আগে-পরে আসা packet সাজিয়ে সমান তালে বাজায়
মোট (queuing ছাড়া)প্রায় ৯৫ ms১৫০ ms-এর বাজেটে queuing-এর জন্য বাকি মাত্র ~৫৫ ms

পর্ব ১৫-এর bufferbloat মনে করুন: ১০ Mbps upload-এ ১ MB ভরা buffer মানে ৮০০ ms queuing — বাজেটের পাঁচ গুণ। দরকার অগ্রাধিকার: ভয়েসকে আলাদা লাইনে আগে পাঠানো, আর তার পরিমাণ সীমায় রাখা।

Bandwidth-এর হিসাব: G.711 codec প্রতি ২০ ms-এ ১৬০ byte কণ্ঠ; সাথে RTP (১২), UDP (৮) আর IPv4 (২০) header — ২০০ byte, সেকেন্ডে ৫০টি: ৫০ × ২০০ × ৮ = ৮০ kbps (IP স্তরে)। সামান্য, কিন্তু ভিড়ের মুহূর্তে এটুকুকেই আগে যেতে দিতে হবে।

মূল ধারণা

QoS bandwidth বানায় না — ভিড়ের সময় কার ভাগে কী পড়বে, তা ঠিক করে। ভিড় না থাকলে QoS-এর কোনো কাজ নেই; ভিড় থাকলে সে ঠিক করে কে আগে যাবে (scheduling), কে কতটা পাবে (ভাগ আর সীমা), আর কে আগে বাদ পড়বে (drop). কাউকে আগে পাঠানো মানেই অন্য কাউকে পরে।

৬ · শ্রেণি ঠিক করা আর চিহ্ন দেওয়া — DSCP, 802.1p আর trust boundary

প্রতিটি router প্রতিটি packet গভীরে দেখে “ভয়েস না ফাইল” বুঝতে গেলে ধীর হবে। তাই কাজটি দুই ভাগে:

  • Classification (প্রান্তে, একবার): নেটওয়ার্কে ঢোকার মুখে packet দেখে শ্রেণি ঠিক করা — port নম্বর, ঠিকানা, কোন VLAN (যেমন voice VLAN, পর্ব ১৩), বা যন্ত্রটি নিজে কী বলছে।
  • Marking: শ্রেণিটি header-এ লিখে দেওয়া, যাতে পরের প্রতিটি যন্ত্র শুধু চিহ্নটুকু দেখেই কাজ করতে পারে। IP-তে DSCP (IPv4-এর পুরোনো TOS byte বা IPv6-এর traffic class-এর প্রথম ৬ bit; ঘরগুলো পর্ব ১৬ আর ২১-এ), Ethernet-এ VLAN tag-এর ৩ bit PCP বা 802.1p (পর্ব ১৩)।

ঠিক যেমন হাসপাতালের জরুরি বিভাগের রিসেপশনে একবার রোগী দেখে কার্ডে লাল, হলুদ বা সবুজ দাগ দেওয়া হয় — এরপর প্রতিটি ডেস্ক শুধু কার্ডের রং দেখে।

 পুরোনো IPv4 TOS byte (৮ bit)
 ┌───┬───┬───┬───┬───┬───┬───┬───┐
 │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │
 ├───┴───┴───┴───┴───┴───┼───┴───┤
 │      DSCP (৬ bit)     │  ECN  │
 └───────────────────────┴───────┘
 TOS byte = DSCP × 4 + ECN     যেমন EF: 46 × 4 = 184 = 0xB8

প্রচলিত DSCP শ্রেণি

নামDSCP (দশমিক / বাইনারি)আচরণ (PHB)প্রচলিত ব্যবহার
Default (CS0)0 / 000000Best effortসাধারণ সব traffic
EF46 / 101110কম delay, কম jitter, কম loss — সাধারণত priority queue (RFC 3246)ভয়েস
AFxy8x + 2y; যেমন AF11 = 10, AF21 = 18, AF31 = 26, AF41 = 34৪টি শ্রেণি (x = ১–৪), প্রতিটিতে ন্যূনতম bandwidth; y = ১–৩ হলো drop precedence (RFC 2597)AF4x ভিডিও কল, AF3x streaming, AF2x জরুরি ডেটা
CSn8 × n; যেমন CS1 = 8, CS6 = 48পুরোনো IP Precedence-এর সাথে মিল রাখাCS6 routing protocol, CS1 প্রায়ই “কম অগ্রাধিকার” (scavenger)

কোন অ্যাপ কোন শ্রেণি পাবে, তার একটি বহুল ব্যবহৃত নির্দেশিকা RFC 4594 — তবে এটি পরামর্শ; প্রতিটি প্রতিষ্ঠান নিজের নীতি ঠিক করে। DSCP-র মানে বাধ্যতামূলক নয়; প্রতিটি নেটওয়ার্ক (প্রতিটি DiffServ domain) নিজে ঠিক করে কোন চিহ্নে কী আচরণ — একে বলে per-hop behaviour (PHB).

Trust boundary — কার কথা বিশ্বাস করবেন

DSCP যে কেউ বসাতে পারে। সবাই নিজেকে “ভয়েস” বললে priority queue ভরে যায়, আর আসল ভয়েসেরই ক্ষতি। তাই একটি trust boundary টানা হয়, যতটা সম্ভব প্রান্তে (access switch-এর port-এ): ভেতরের চেনা যন্ত্রের (যেমন প্রতিষ্ঠানের IP phone) চিহ্ন বিশ্বাস, বাইরের চিহ্ন মুছে ০ বা নিজের নিয়মে নতুন করে। অনেক ISP-ও অন্য নেটওয়ার্কের DSCP মুছে বা বদলে দেয়।

নিচের simulator কয়েকটি TOS byte decode করে, তারপর একটি access switch-এর trust boundary চালায় — port 1-এ IP phone (trusted), port 2-এ সাধারণ PC (untrusted). লক্ষ করুন re-marking-এর সময় শেষের ২টি ECN bit রাখতে হয় — ECN আলাদা কাজের জিনিস (অংশ ৮)।

// The old IPv4 TOS byte = DSCP (6 bits) + ECN (2 bits).  tos = dscp << 2 | ecn
const ECN = ["Not-ECT", "ECT(1)", "ECT(0)", "CE"];
function dscpName(d) {
  if (d === 46) return "EF";
  if (d === 0) return "default (BE)";
  const x = d >> 3, y = (d >> 1) & 3;
  if (x >= 1 && x <= 4 && y >= 1 && (d & 1) === 0) return `AF${x}${y}`;  // AFxy = 8x + 2y
  if (d % 8 === 0) return `CS${d / 8}`;
  return "unknown/local";
}
function decode(tos) {
  const d = tos >> 2, e = tos & 3;
  return `0x${tos.toString(16).padStart(2, "0")}  dscp=${String(d).padStart(2)}` +
    ` (${d.toString(2).padStart(6, "0")}) ${dscpName(d).padEnd(12)} ecn=${ECN[e]}`;
}
console.log("TOS   DSCP decimal/binary  class        ECN");
for (const tos of [0x00, 0xb8, 0x88, 0x28, 0x4a, 0xc0, 0x20, 0xba, 0x03]) console.log(decode(tos));

// Trust boundary on an access switch: only the IP-phone port is trusted.
// Re-marking clears the DSCP of untrusted traffic but must keep the 2 ECN bits.
const ports = { 1: "IP phone (trusted)", 2: "PC (untrusted)" };
const arrivals = [[1, 0xb8], [2, 0xb8], [2, 0x2a], [2, 0x03]];
console.log("\nport  in-TOS  out-TOS  meaning");
for (const [p, tos] of arrivals) {
  const out = p === 1 ? tos : tos & 0x03;
  console.log(`${p}     0x${tos.toString(16).padStart(2, "0")}    0x${out.toString(16).padStart(2, "0")}` +
    `     ${ports[p]}: ${dscpName(tos >> 2)} -> ${dscpName(out >> 2)}, ecn ${ECN[out & 3]}`);
}

আউটপুট:

TOS   DSCP decimal/binary  class        ECN
0x00  dscp= 0 (000000) default (BE) ecn=Not-ECT
0xb8  dscp=46 (101110) EF           ecn=Not-ECT
0x88  dscp=34 (100010) AF41         ecn=Not-ECT
0x28  dscp=10 (001010) AF11         ecn=Not-ECT
0x4a  dscp=18 (010010) AF21         ecn=ECT(0)
0xc0  dscp=48 (110000) CS6          ecn=Not-ECT
0x20  dscp= 8 (001000) CS1          ecn=Not-ECT
0xba  dscp=46 (101110) EF           ecn=ECT(0)
0x03  dscp= 0 (000000) default (BE) ecn=CE

port  in-TOS  out-TOS  meaning
1     0xb8    0xb8     IP phone (trusted): EF -> EF, ecn Not-ECT
2     0xb8    0x00     PC (untrusted): EF -> default (BE), ecn Not-ECT
2     0x2a    0x02     PC (untrusted): AF11 -> default (BE), ecn ECT(0)
2     0x03    0x03     PC (untrusted): default (BE) -> default (BE), ecn CE

Decode: 0xb8 = বাইনারি 101110|00 → DSCP ৪৬, EF. 0x88 → ৩৪ = ৮ × ৪ + ২ × ১ → AF41. 0x28 → ১০ → AF11. 0x4a = 010010|10 → AF21, আর শেষ দুই bit 10 = ECT(0), অর্থাৎ প্রেরক ECN বোঝে। 0xc0 → ৪৮ = CS6, 0x20 → ৮ = CS1. 0xba হলো EF আর ECT(0) একসাথে। আর 0x03: DSCP ০, কিন্তু ECN = CE — পথের কোনো router packet না ফেলে “ভিড় আছে” দাগ দিয়েছে।

Trust boundary: phone-এর EF অক্ষত রইল। PC-র নিজে বসানো EF মুছে 0x00. 0x2a (AF11 + ECT(0)) হলো 0x02 — শ্রেণি মুছল, ECT(0) রইল; 0x03-এর CE দাগও রইল। পুরো byte শূন্য করলে ECN-এর খবর হারাত — re-marking-এর প্রচলিত ভুল। নিজে চেষ্টা করুন: 0x68 আর 0xa0 decode করার আগে খাতায় হিসাব করুন।

Layer 2-তে একই কাজ 802.1p-এর (০–৭); অনেক switch DSCP আর PCP-র মধ্যে রূপান্তরের টেবিল রাখে। Tag থাকে শুধু trunk বা voice VLAN-এ (পর্ব ১৩)।

৭ · Policing, shaping আর token bucket — হার মাপার যন্ত্র

অগ্রাধিকার দিলেই হবে না, পরিমাণও সীমায় রাখতে হয়। ISP আপনার সাথে চুক্তি করেছে ২০ Mbps; ভয়েসের priority queue-কে বলা হয়েছে ১ Mbps পর্যন্ত। কেউ বেশি পাঠালে কী হবে? দুটি উত্তর:

Policing — সীমা ছাড়ালেই শাস্তি

সীমার বাইরের packet সাথে সাথে ফেলে দেওয়া (drop), বা নিচের শ্রেণিতে নামিয়ে চিহ্ন বদলানো (re-mark). কোনো buffer নেই, কোনো অপেক্ষা নেই। সাধারণত ঢোকার মুখে (ingress) — যেমন ISP গ্রাহকের দিক থেকে আসা traffic-এ। ফল: ঝাপটার সময় loss, তাই TCP-র গতি করাতের দাঁতের মতো ওঠানামা করে।

loss বাড়ে · delay বাড়ে না

Shaping — সীমা ছাড়ালে লাইনে দাঁড়ান

সীমার বাইরের packet buffer-এ রেখে পরে পাঠানো, যাতে বের হওয়া traffic মসৃণ আর সীমার মধ্যে থাকে। সাধারণত বের হওয়ার মুখে (egress) — যেমন অফিসের router ISP-র policer-এ ধরা পড়ার আগেই নিজের traffic মসৃণ করে। ফল: loss কম, কিন্তু delay বাড়ে; buffer ভরে গেলে তবেই drop.

delay বাড়ে · loss কমে

ঢাকার ফ্লাইওভারের মুখে দুই ট্রাফিক পুলিশ: একজন বাড়তি গাড়ি ফিরিয়ে দেন (policing), অন্যজন পাশে দাঁড় করিয়ে একটি একটি করে ছাড়েন (shaping).

Token bucket — হার r, বালতি b

দুজনেরই একটি মাপার যন্ত্র লাগে — “এই packet সীমার মধ্যে কি না”. সবচেয়ে প্রচলিতটি token bucket:

  • একটি বালতিতে প্রতি সেকেন্ডে rটি token জমে (এখানে ১ token = ১ byte). বালতিতে সর্বোচ্চ bটি token ধরে; ভরা থাকলে নতুন token উপচে নষ্ট হয়।
  • L byte-এর packet এলে বালতিতে কমপক্ষে L token থাকলে সে conform — L token তুলে নিয়ে পাঠানো। না থাকলে exceed — policer হলে ফেলে দেয় (token নেয় না), shaper হলে token জমা পর্যন্ত অপেক্ষা করায়।

r হলো দীর্ঘমেয়াদি গড় হার (চুক্তির হার, অনেক সময় CIR বলা হয়), আর b হলো সর্বোচ্চ ঝাপটা — কিছুক্ষণ চুপ থাকলে জমানো token দিয়ে একবারে কতটা পাঠানো যায়।

প্রমাণ: যেকোনো t সময়ে সর্বোচ্চ b + rt

যেকোনো একটি সময়-ব্যবধান [s, s + t] নিন। শুরুর মুহূর্তে বালতিতে সর্বোচ্চ b token থাকতে পারে। এই t সময়ে নতুন token জমে সর্বোচ্চ rt. প্রতিটি পাঠানো byte একটি token খরচ করে, আর token ছাড়া কিছু যায় না। তাই এই সময়ে বের হওয়া মোট byte ≤ শুরুর token + নতুন token ≤ b + rt. এটিই token bucket-এর মূল নিশ্চয়তা — একে বলে (r, b) arrival curve, আর এর ওপর ভিত্তি করে router-এর queue-তে সর্বোচ্চ কত জমবে আর সর্বোচ্চ delay কত হবে, তা হিসাব করা যায় (network calculus).

যেকোনো t সময়ে সর্বোচ্চ ডেটা = b + r·t

সর্বোচ্চ ঝাপটার দৈর্ঘ্য: link-এর নিজের গতি R (R > r) হলে, পূর্ণ বালতি নিয়ে প্রেরক R গতিতে কতক্ষণ পাঠাতে পারে? T সময় পরে পাঠানো R·T, আর বালতি অনুমতি দেয় b + r·T. R·T = b + r·T থেকে T = b ÷ (R − r). উদাহরণ: r = ২ Mbps, b = ১০০ KB = ৮০০,০০০ bit, R = ১০ Mbps → T = ৮০০,০০০ ÷ (৮ × ১০৬) = ০.১ সেকেন্ড; এই সময়ে যায় ১০ Mbps × ০.১ s = ১ Mbit = ১২৫,০০০ byte. যাচাই: b + rT = ৮০০,০০০ + ২০০,০০০ = ১০,০০,০০০ bit — মিলেছে।

Leaky bucket — নিচে ছিদ্রওয়ালা বালতি

Leaky bucket-এ packet জমে একটি বালতিতে (queue), আর ছিদ্র দিয়ে বের হয় স্থির হারে — যত ঝাপটাই আসুক; বালতি ভরলে নতুন packet ফেলা হয়। Token bucket b পর্যন্ত ঝাপটা অনুমতি দেয়, leaky bucket (queue হিসেবে) দেয় না। (“মাপার নিয়ম” হিসেবে দুটি একই সীমা দেয় — ATM-এর GCRA তেমন একটি; বইভেদে নামের ব্যবহার আলাদা।)

এবার একটি policer-কে একটি ঝাপটার ওপর চালাই। r = ১০০ byte/ms (= ০.৮ Mbps), b = ৩,০০০ byte, শুরুতে বালতি ভরা। ০, ১, ২, ৩ ms-এ চারটি ১,৫০০ byte-এর packet একসাথে, তারপর ২০, ২১ আর ৪০ ms-এ আরও তিনটি।

প্রতিটি packet আসার মুহূর্তে বালতির অবস্থা
সময় · packet
আগের পর থেকে নতুন token
Packet আসার সময় token
সিদ্ধান্ত
পরে token
এ পর্যন্ত গেল / ফেলা হলো
  1. t = 0: পূর্ণ বালতি। ৩,০০০ token, packet ১,৫০০ — conform; বাকি ১,৫০০. চুপ থাকার “সঞ্চয়” ঝাপটায় কাজে লাগছে।
  2. t = 1: ঝাপটা চলছে। ১ ms-এ মাত্র ১০০ token জমেছে: ১,৬০০ — আবার conform, বাকি ১০০. দুই ms-এ ৩,০০০ byte গেল, কারণ b ঝাপটা অনুমতি দেয়।
  3. t = 2: বালতি প্রায় খালি। ২০০ token, দরকার ১,৫০০ — exceed. Policer packet ফেলল, token নিল না। (Shaper হলে ১৩ ms অপেক্ষা করাত।)
  4. t = 3: আবার exceed. ৩০০ token — এবারও ফেলা হলো। TCP হলে প্রেরক এই loss দেখে গতি কমাত (পর্ব ৩২)।
  5. t = 20: বিরতির পর। ১৭ ms-এ ১,৭০০ token যোগ হয়ে ২,০০০ — conform, বাকি ৫০০. সঞ্চয় কখনো b-এর বেশি নয়।
  6. t = 21: ছোট packet-ও বাদ। ৬০০ token, packet ১,০০০ byte — exceed. Token bucket packet-এর আকার দেখে।
  7. t = 40: সারসংক্ষেপ। ২,৫০০ token — conform, বাকি ১,০০০. ৪০ ms-এ গেছে ৬,০০০ byte ≤ b + r·t = ৩,০০০ + ১০০ × ৪০ = ৭,০০০. ৭টির ৩টি বাদ।

একই আগমনে policer আর shaper পাশাপাশি — shaper কোনো packet ফেলে না (buffer যথেষ্ট বড় ধরে), বরং প্রতিটি packet কখন বের হলো আর কত অপেক্ষা করল, তা দেখায়:

// Token bucket: r = 100 bytes/ms (0.8 Mbps), bucket size b = 3000 bytes, starts full.
const r = 100, b = 3000;
const pkts = [[0, 1500], [1, 1500], [2, 1500], [3, 1500], [20, 1500], [21, 1000], [40, 1500]];

console.log("POLICER  t(ms) size  tokens-before  decision  tokens-after");
let tok = b, last = 0;
for (const [t, size] of pkts) {
  tok = Math.min(b, tok + r * (t - last)); last = t;      // refill since last arrival
  const before = tok, ok = tok >= size;
  if (ok) tok -= size;                                      // exceed: drop, take no tokens
  console.log(`         ${String(t).padStart(5)} ${String(size).padStart(5)}` +
    `  ${String(before).padStart(13)}  ${(ok ? "conform" : "EXCEED").padEnd(8)}  ${tok}`);
}

console.log("\nSHAPER   t(ms) size  leaves-at(ms)  delay(ms)");
tok = b; last = 0;
let free = 0;                         // FIFO: a packet cannot leave before the one ahead
for (const [t, size] of pkts) {
  let go = Math.max(t, free);
  tok = Math.min(b, tok + r * (go - last)); last = go;
  if (tok < size) { const wait = (size - tok) / r; go += wait; tok = size; last = go; }
  tok -= size; free = go;
  console.log(`         ${String(t).padStart(5)} ${String(size).padStart(5)}` +
    `  ${String(go).padStart(13)}  ${go - t}`);
}
const T = 50;
console.log(`\nbound: in any ${T} ms at most b + r*T = ${b + r * T} bytes leave`);

আউটপুট:

POLICER  t(ms) size  tokens-before  decision  tokens-after
             0  1500           3000  conform   1500
             1  1500           1600  conform   100
             2  1500            200  EXCEED    200
             3  1500            300  EXCEED    300
            20  1500           2000  conform   500
            21  1000            600  EXCEED    600
            40  1500           2500  conform   1000

SHAPER   t(ms) size  leaves-at(ms)  delay(ms)
             0  1500              0  0
             1  1500              1  0
             2  1500             15  13
             3  1500             30  27
            20  1500             45  25
            21  1000             55  34
            40  1500             70  30

bound: in any 50 ms at most b + r*T = 8000 bytes leave

Policer-এর টেবিল stepper-এর সাথে হুবহু মেলে: ৭টির মধ্যে ৩টি EXCEED, কারো কোনো delay নেই। Shaper-এ কেউ হারায়নি, কিন্তু দেখুন delay কীভাবে জমে: ২ ms-এর packet বালতি খালি পায়, ১,৩০০ token জমতে ১৩ ms অপেক্ষা করে ১৫ ms-এ বের হয়; তারপর বালতি শূন্য, তাই প্রতিটি ১,৫০০ byte-এর packet-এর জন্য পুরো ১৫ ms লাগে (৩০, ৪৫), আর ১,০০০ byte-এর জন্য ১০ ms (৫৫)। ২১ ms-এর packet অপেক্ষা করে ৩৪ ms. ১৫ ms-এর পর আউটপুট ঠিক r = ১০০ byte/ms — মসৃণ। শেষ লাইন প্রমাণের সূত্র: ০–৫০ ms-এ বের হয়েছে ৫টি packet = ৭,৫০০ byte ≤ ৮,০০০. নিজে চেষ্টা করুন: b = 4500 করলে policer কয়টি packet ফেলবে? (উত্তর অনুশীলনে।)

Linux-এ একই যন্ত্র আছে, tc দিয়ে (root লাগে, তাই এখানে চালানো নয়)। tbf (token bucket filter) একটি shaper; আর অনেক বাসার router-এর firmware-এ থাকা CAKE বা fq_codel একসাথে shaping, শ্রেণি আর AQM করে:

$ sudo tc qdisc add dev eth0 root tbf rate 8mbit burst 32kbit latency 50ms
#   rate = r, burst = b; latency = buffer-এ সর্বোচ্চ কতক্ষণ অপেক্ষা, তার বেশি হলে drop
$ sudo tc qdisc replace dev eth0 root cake bandwidth 18mbit diffserv4
#   upload-এর আসল গতির একটু নিচে shaping, DSCP দেখে ৪টি শ্রেণি, ভেতরে AQM
$ tc -s qdisc show dev eth0      # কত byte গেল, কত drop — পরিসংখ্যান

৮ · সব একসাথে — LLQ, IntServ বনাম DiffServ, ECN আর বাসার Wi-Fi

Scheduling-এর প্রয়োগ — LLQ

পর্ব ১৫-এ priority আর WFQ দেখেছেন, আর কঠোর priority-র বিপদ — নিম্ন শ্রেণি না খেয়ে থাকে। বাস্তবের QoS দুটিকে মেলায়: LLQ (Low Latency Queuing). ভয়েসের জন্য কঠোর priority queue, সাথে একটি policer (অংশ ৭-এর token bucket) যাতে ভয়েস নির্ধারিত হারের বেশি না নেয়; বাকি শ্রেণি WFQ-র মতো ভাগ পায়, আর best effort-এ AQM.

class-map match-any VOICE
 match dscp ef
class-map match-any VIDEO
 match dscp af41
policy-map WAN-EDGE
 class VOICE
  priority 512              ! কঠোর priority, ভিড়ের সময় 512 kbps-এর বেশি হলে police
 class VIDEO
  bandwidth percent 30      ! ভিড়ের সময় ন্যূনতম ৩০%
 class class-default
  fair-queue                ! বাকি সব: flow-ভিত্তিক ন্যায্য ভাগ
interface GigabitEthernet0/1
 service-policy output WAN-EDGE

এখানে কাজের ক্রমটি লক্ষ করুন: classification (DSCP দেখে class-map) → প্রতিটি শ্রেণির জন্য নীতি (policy-map) → interface-এর বের হওয়ার দিকে প্রয়োগ। QoS কাজ করে শুধু যেখানে ভিড় হয় — সাধারণত দ্রুত LAN থেকে ধীর WAN-এ নামার মুখে। ১০ Gbps-এর ফাঁকা LAN link-এ এই নীতির প্রায় কোনো প্রভাব নেই।

IntServ বনাম DiffServ — প্রতিটি flow, না কয়েকটি শ্রেণি?

১৯৯০-এর দশকে IETF ইন্টারনেটে টেলিফোনের মতো নিশ্চয়তা আনার দুটি পথ চেষ্টা করেছিল।

বিষয়IntServ (RFC 1633, ১৯৯৪)DiffServ (RFC 2474, 2475, ১৯৯৮)
মূল এককপ্রতিটি flow (একটি কল, একটি ভিডিও)কয়েকটি শ্রেণি (aggregate) — DSCP দিয়ে চেনা
সংকেতRSVP (RFC 2205): পথের প্রতিটি router-এ সংরক্ষণ চাওয়া, admission control — জায়গা না থাকলে “না”কোনো সংকেত নেই; প্রান্তে চিহ্ন বসানো, ভেতরে চিহ্ন দেখে আচরণ
Router-এ stateপ্রতিটি flow-এর জন্য, নিয়মিত refresh (soft state)শুধু শ্রেণির নিয়ম — flow-এর সংখ্যা যত হোক
নিশ্চয়তাকঠোর — যেমন guaranteed service-এ সর্বোচ্চ delay-এর সীমা (RFC 2212)আপেক্ষিক — “এই শ্রেণি ওই শ্রেণির চেয়ে ভালো আচরণ পাবে”; পুরো পথে নিশ্চয়তা নয়
বড় নেটওয়ার্কেBackbone-এ লক্ষ লক্ষ flow-এর state আর বার্তা — মানায়নিমানায়: ভেতরের router-এর কাজ সরল — আজকের বাস্তব QoS

IntServ টেকেনি মূলত scale-এর জন্য (কারণ বিস্তারিত ভাবনার প্রশ্ন ৩-এ)। DiffServ-এ জটিলতা প্রান্তে, মাঝখান সরল — তবে সেটিও সাধারণত এক প্রতিষ্ঠান বা এক ISP-র ভেতরে কাজ করে; সীমা পেরোলে চিহ্ন সাধারণত মানা হয় না, তাই ইন্টারনেট মোটের ওপর best effort-ই থেকে গেছে।

MPLS-TE (সংক্ষেপে): ISP-র ভেতরে RSVP-TE (RFC 3209) দিয়ে নির্দিষ্ট bandwidth-সহ MPLS-এর পথ বানানো হয় — flow প্রতি নয়, বড় traffic-গুচ্ছ প্রতি। এতে traffic সবচেয়ে ছোট পথের বাইরেও পরিকল্পনামতো ছড়ানো যায়, আর link নষ্ট হলে আগে বানানো বিকল্প পথে দ্রুত সরানো যায়। কিছু নেটওয়ার্ক segment routing-এর মতো নতুন পদ্ধতিও ব্যবহার করে।

ECN আর AQM — packet না ফেলে সতর্ক করা

পর্ব ১৫-এ AQM (RED, CoDel) দেখেছেন — buffer ভরার আগেই কিছু packet ফেলে প্রেরককে ভিড়ের সংকেত দেওয়া। ECN (RFC 3168) একই সংকেত দেয় কোনো packet না হারিয়ে: প্রেরক IP header-এর দুই bit-এ ECT বসায় (“আমি ECN বুঝি”), ভিড়ের router ফেলার বদলে সেখানে CE (Congestion Experienced) লেখে, প্রাপক TCP-তে খবরটি প্রেরককে ফেরত পাঠায়, আর প্রেরক যেন packet হারিয়েছে এমনভাবে গতি কমায় (পর্ব ৩২)। ভয়েস আর ভিডিওর জন্য একটি দাগ একটি হারানো packet-এর চেয়ে অনেক কম ক্ষতিকর। ঘরগুলো পর্ব ১৬-এ।

Net neutrality আর QoS — সংক্ষেপে

অফিস নিজের নেটওয়ার্কে ভয়েসকে আগে রাখলে কারো আপত্তি নেই। কিন্তু ISP টাকার বিনিময়ে বা নিজের স্বার্থে কোনো সাইট বা অ্যাপকে দ্রুত বা ধীর করলে ওঠে net neutrality-র প্রশ্ন। সাধারণত traffic-এর ধরন অনুযায়ী স্বচ্ছ ব্যবস্থাপনা অনেক জায়গায় গ্রহণযোগ্য, আর কে পাঠাচ্ছে বা কে টাকা দিয়েছে অনুযায়ী অগ্রাধিকার বিতর্কিত; দেশভেদে আইন আলাদা (আলোচনা পর্ব ১৫-এর ভাবনার প্রশ্নে)।

বাসার router আর Wi-Fi-তে QoS

বাসায় সবচেয়ে সাধারণ ভিড়ের জায়গা দুটি: ISP-র দিকের upload link আর Wi-Fi-র বাতাস।

  • Upload link: অনেক router-এ “QoS”, “SQM” বা “Smart Queue” সেটিং থাকে। সাধারণত গতি ISP-র আসল গতির একটু নিচে বেঁধে দেওয়া হয় (shaping), যাতে queue জমে router-এর fq_codel বা CAKE-এ, মডেমের বড় buffer-এ নয় (পর্ব ১৫)।
  • Wi-Fi-তে WMM: সবাই একই বাতাস ভাগ করে (পর্ব ১৪)। 802.11e-র ভিত্তিতে Wi-Fi Alliance-এর WMM চারটি access category রাখে — ভয়েস, ভিডিও, best effort, background — আর ভয়েসকে বাতাসে কম অপেক্ষার সুযোগ দেয় (ছোট contention window). 802.11n আর পরের উচ্চ গতির জন্য WMM সাধারণত চালু রাখতেই হয়।

আরও গভীরে: Token bucket-এর বাস্তব রূপ প্রায়ই তিন রঙের: RFC 2697-এর single-rate three-color marker দুটি বালতি (CBS আর EBS) দিয়ে packet-কে সবুজ, হলুদ বা লাল করে, আর RFC 2698-এর two-rate রূপ চুক্তির হার আর সর্বোচ্চ হার আলাদা মাপে — AF-এর তিনটি drop precedence ঠিক এই তিন রঙের সাথে মেলে। Wi-Fi-তে DSCP থেকে WMM-এর শ্রেণিতে রূপান্তর একটি সূক্ষ্ম জায়গা: পুরোনো সরল নিয়মে DSCP-র প্রথম ৩ bit নিলে EF (৪৬ → ৫) ভিডিও শ্রেণিতে পড়ে, তাই RFC 8325 (২০১৮) EF-কে ভয়েসের user priority ৬-এ পাঠানোর সুপারিশ করে। আর গবেষণার সামনের দিকে আছে L4S (RFC 9330–9332, ২০২৩), যা ECN-এর দাগ আরও সূক্ষ্মভাবে ব্যবহার করে queue-কে প্রায় শূন্য রেখে বেশি throughput পাওয়ার চেষ্টা করে।

পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:

  • 239.1.1.1-এর multicast MAC কী, আর কেন একাধিক দল একই MAC পায়? — 01:00:5e:01:01:01; MAC-এ যায় দলের শুধু শেষ ২৩ bit, ৫ bit হারায়, তাই ৩২টি দল একই MAC.
  • IGMP snooping না থাকলে কী হয়? — Switch multicast MAC কখনো শেখে না, তাই stream VLAN-এর সব port-এ ছড়ায়; snooping শুধু সদস্যদের port-এ পাঠায়।
  • RPF check কী? — উৎস S-এর packet শুধু সেই interface দিয়ে এলে গ্রহণ, যেটি দিয়ে router S-এ unicast পাঠাত; বাকি কপি ফেলে loop আর duplicate ঠেকানো।
  • Policing আর shaping-এর পার্থক্য? — Policing সীমার বাইরের packet ফেলে বা re-mark করে (delay নেই, loss আছে); shaping buffer-এ রেখে দেরিতে পাঠায় (loss কম, delay বেশি)।
  • IntServ কেন টেকেনি? — প্রতিটি flow-এর জন্য প্রতিটি router-এ RSVP state আর সংকেত বড় নেটওয়ার্কে মানায় না; DiffServ কয়েকটি শ্রেণি আর প্রতি hop-এর আচরণে সরল।

৯ · AI-এর যুগে multicast আর QoS

“IPTV-র জন্য multicast সেটআপ” বা “ভিডিও কলের QoS কনফিগ” চাইলে AI লম্বা, আত্মবিশ্বাসী উত্তর দেয় — কিন্তু কয়েকটি ভুল খুব প্রচলিত:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
Multicast MAC হিসাবে দলের শেষ ২৪ bit নেওয়া (যেমন 239.129.1.1 → 01:00:5e:81:01:01)নিয়ম শেষ ২৩ bit; দ্বিতীয় byte-এর প্রথম bit বাদ — ঠিক উত্তর 01:00:5e:01:01:01অংশ ২-এর simulator বা হাতে বাইনারি করে মেলান
“239.x.x.x দিয়ে ইন্টারনেটে সম্প্রচার করুন”239/8 administratively scoped — প্রতিষ্ঠানের ভেতরের জন্য; ইন্টারনেটে multicast সাধারণত চলেই নাRFC 2365 আর ISP-র কাছে জিজ্ঞেস
DSCP আর TOS byte গুলিয়ে ফেলা (“EF = 0x2E বসান” বা “DSCP 184”)EF-এর DSCP ৪৬ = 0x2E, কিন্তু TOS byte-এ তা 0xB8 (৪৬ × ৪); কোন টুল কোনটা চায়, আলাদাটুলের man page দেখুন; packet capture-এ ঘরটি মিলিয়ে দেখুন
“সব traffic-কে EF দিন, সব দ্রুত হবে”সবাই priority হলে কেউই priority নয়; priority queue policer ছাড়া বাকিদের না খাইয়ে রাখেভয়েসের হিসাব (প্রতি কল ~৮০ kbps) করে সীমা বসান
“QoS চালু করলে ইন্টারনেট দ্রুত হবে”QoS bandwidth বাড়ায় না, শুধু ভিড়ের সময় ভাগ ঠিক করেলোডের সময় আর লোড ছাড়া ping ও throughput মেপে তুলনা
Cisco-র কমান্ডকে সর্বজনীন বলা, বা পুরোনো কমান্ডপ্রতিটি vendor আর OS-এর কমান্ড আলাদা; Linux-এ tc, ip maddrনিজের যন্ত্রের ডকুমেন্টেশন; আগে ল্যাব বা VM-এ চালানো
বানানো RFC নম্বর (“IGMP snooping RFC 2236”)RFC 2236 হলো IGMPv2; snooping-এর নির্দেশিকা RFC 4541rfc-editor.org-এ নম্বর খুলে শিরোনাম মেলান

AI-কে multicast বা QoS-এর প্রশ্ন দিলে নিজের নেটওয়ার্কের তথ্য আর যাচাইয়ের শর্তসহ দিন:

আমার অফিসে একটি VLAN-এ ৪০টি কম্পিউটার আর একটি সার্ভার, সার্ভার 239.10.20.30 দলে ভিডিও পাঠাবে। VLAN-এ কোনো multicast router নেই। switch-এর মডেল: [মডেল লেখো]। ১. 239.10.20.30-এর multicast MAC বাইনারি ধরে ধাপে ধাপে হিসাব করে দেখাও, আর বলো এই MAC আর কোন কোন দল ভাগ করে (অন্তত দুটি উদাহরণ)। ২. IGMP snooping চালু করলে querier লাগবে কি না, না থাকলে কী হতে পারে — নিশ্চিত না হলে স্পষ্ট বলো। ৩. ভয়েসের জন্য DSCP-র মান দশমিকে আর TOS byte-এ আলাদা করে লেখো। ৪. কোনো কনফিগারেশন দিলে বলো কোন vendor-এর ভাষা, আর প্রতিটি দাবির পাশে কোন RFC বা ডকুমেন্টেশন দেখে আমি যাচাই করব। ৫. বানানো RFC নম্বর দেবে না; না জানলে “জানি না” বলো।

AI-এর উত্তর মানার আগে — চেকলিস্ট

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

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

প্র ০১IP multicast প্রযুক্তিগতভাবে এত দক্ষ, তবু ইন্টারনেট-জুড়ে রেডিও-টিভির মাধ্যম হয়ে উঠল না কেন? CDN কীভাবে সেই জায়গা নিল?

১৯৮০-এর দশকের শেষে Stanford-এ Steve Deering-এর গবেষণা থেকে IP multicast-এর নকশা আসে (RFC 1112, ১৯৮৯)। ১৯৯২ সালে IETF-এর একটি সভার অডিও multicast-এ সম্প্রচার হয়, শুরু হয় MBone — unicast router-এর ওপর tunnel দিয়ে জোড়া multicast-এর দ্বীপ। অনেকের ধারণা ছিল, একদিন সব টিভি এভাবেই চলবে।

প্রথম বাধা বহু মালিকানা। ইন্টারনেট হাজার হাজার স্বাধীন নেটওয়ার্কের জোড়া (পর্ব ২৫)। Stream পৌঁছাতে পথের প্রতিটি ISP-কে multicast routing চালু রাখতে হয়, RP-র খবর বিনিময় করতে হয় (MSDP-র মতো বাড়তি protocol). অথচ লাভ কার? কপি হয় প্রাপকের ISP-তে, কিন্তু উৎসের কাছ থেকে টাকা নেওয়ার সহজ মডেল ছিল না। দ্বিতীয় বাধা প্রযুক্তিগত: প্রতিটি দলের state প্রতিটি router-এ, ASM-এ যে কেউ পাঠাতে পারে বলে অপব্যবহারের ঝুঁকি, আর NAT ও firewall প্রায়ই multicast আটকায়।

তৃতীয় আর সম্ভবত বড় কারণ: দেখার অভ্যাস বদলাল। Multicast-এর লাভ তখনই, যখন অনেকে একই মুহূর্তে একই জিনিস চায়; মানুষ ক্রমে “যখন খুশি” দেখতে শুরু করল। CDN হাজার জায়গায় কপি রেখে কাছের সার্ভার থেকে unicast-এ পাঠায় — router-এর কাছে কিছু চাইতে হয় না, আর টাকার হিসাব পরিষ্কার। লাইভ খেলাতেও আজ সাধারণত CDN-এর edge সার্ভার, একধরনের application-layer multicast, কাজ চালায়। Multicast সরে গেছে এক মালিকের নেটওয়ার্কে — ISP-র IPTV, শেয়ারবাজার, প্রতিষ্ঠানের LAN আর link-local বার্তায়।

মূল উপলব্ধি: একটি প্রযুক্তি দক্ষ হলেই টেকে না — কে খরচ বহন করবে, কে লাভ পাবে, আর ব্যবহারকারী আসলে কী চান, এই তিন প্রশ্নের উত্তরও লাগে। ইন্টারনেট-জুড়ে multicast প্রথম প্রশ্নে আটকেছিল, আর তৃতীয়টিতে প্রাসঙ্গিকতা হারিয়েছিল।

প্র ০২IPv4 multicast-এর MAC-এ কেন মাত্র ২৩ bit — এই সিদ্ধান্তের দাম কে, কীভাবে দেয়? IPv6-এ কী বদলেছে?

IPv4 দলের ঠিকানায় চলমান bit ২৮টি, অথচ Ethernet MAC-এ দলের জন্য জায়গা মাত্র ২৩ bit. এর পেছনের গল্পটি নেটওয়ার্কিং মহলে প্রচলিত: multicast-এর জন্য একটি OUI-র (MAC-এর প্রথম ৩ byte, পর্ব ১২) পুরো ২৪ bit বা একাধিক OUI কেনার কথা হয়েছিল, কিন্তু খরচের কারণে শেষে একটি OUI-র (01:00:5e) অর্ধেক ব্যবহার হয় — বাকি অর্ধেক অন্য কাজে রাখা হয়েছিল। গল্পের খুঁটিনাটি সূত্রভেদে একটু আলাদা, কিন্তু ফলটি নিশ্চিত: ৫টি bit হারায়, আর প্রতিটি multicast MAC ৩২টি দল ভাগ করে।

এই সিদ্ধান্তের দাম দেয় প্রাপকের যন্ত্র আর switch. একটি host 239.1.1.1-এ যোগ দিলে তার network card-এর hardware filter 01:00:5e:01:01:01-এর সব frame নেয় — 224.1.1.1-এর ভিডিও stream-ও। Kernel IP header দেখে বাড়তি packet ফেলে দেয়, কিন্তু ততক্ষণে CPU আর memory-র কাজ হয়ে গেছে। ব্যস্ত নেটওয়ার্কে এটি সত্যিকারের বোঝা। Switch-এর দিকে আরও সূক্ষ্ম সমস্যা: যে switch snooping-এর টেবিল IP দিয়ে নয়, MAC দিয়ে রাখে, সে এই দুই দলকে আলাদা করতে পারে না — একজনের জন্য stream অন্যজনের port-এ চলে যায়। আরও বিপদ link-local দলের সাথে: 224.0.0.x আর 225.0.0.x বা 239.128.0.x একই MAC পায়, আর অনেক switch 224.0.0.x-এর MAC-কে নিয়ন্ত্রণ-traffic ধরে সব port-এ পাঠায়। তাই 239.0.0.x বা 239.128.0.x-এর মতো দল বাছলে snooping কার্যত অকেজো হয়ে যেতে পারে — নকশার নির্দেশিকাগুলো এ নিয়ে সতর্ক করে।

IPv6 নকশার সময় এই অভিজ্ঞতা ছিল। IPv6 multicast MAC = 33:33 আর দলের ঠিকানার শেষ ৩২ bit (RFC 2464). দলের ঠিকানা ১২৮ bit, তাই এখানেও bit হারায় — তত্ত্বে আরও বেশি দল একই MAC পায় — কিন্তু বাস্তবে দলগুলোর আলাদা অংশ সাধারণত শেষ ৩২ bit-এ থাকে, যেমন solicited-node দল ff02::1:ffXX:XXXX-এর শেষ ২৪ bit unicast ঠিকানা থেকে আসে (পর্ব ২১)। ফলে সংঘর্ষ অনেক কম।

মূল উপলব্ধি: নিম্নস্তরে নেওয়া একটি সস্তা সিদ্ধান্ত বহু দশক ধরে ওপরের স্তরে বাড়তি কাজ চাপিয়ে দিতে পারে। ঠিকানার পরিকল্পনার সময় এই সীমাবদ্ধতাগুলো জানা থাকলে সমস্যাটি এড়ানো যায় — যেমন দলগুলোকে শেষ ২৩ bit-এ আলাদা রাখা।

প্র ০৩IntServ কঠোর নিশ্চয়তা দিত, DiffServ দেয় শুধু আপেক্ষিক অগ্রাধিকার — তবু বাস্তবে DiffServ জিতল কেন? এখানে end-to-end principle-এর ভূমিকা কী?

১৯৯০-এর দশকের শুরুতে ইন্টারনেটে অডিও-ভিডিও আসছিল, আর টেলিফোন কোম্পানিগুলোর ATM নেটওয়ার্ক bandwidth আর delay-এর নিশ্চয়তা দেখাচ্ছিল। IETF-এর উত্তর ছিল Integrated Services (RFC 1633, ১৯৯৪): প্রতিটি অ্যাপ্লিকেশন-flow তার চাহিদা জানাবে (token bucket-এর r আর b দিয়ে — এই পর্বের সেই একই যন্ত্র), RSVP (RFC 2205, ১৯৯৭) সেই চাহিদা পথের প্রতিটি router-এ নিয়ে যাবে, আর প্রতিটি router দেখবে জায়গা আছে কি না (admission control). জায়গা থাকলে সংরক্ষণ, না থাকলে “না”. Guaranteed service-এ গাণিতিকভাবে প্রমাণযোগ্য সর্বোচ্চ delay পর্যন্ত পাওয়া যেত।

সমস্যা ছিল scale. Backbone router-এর ভেতর দিয়ে একসাথে লক্ষ লক্ষ flow যায় — প্রতিটির state, নিয়মিত RSVP refresh আর আলাদা scheduling-এর খরচ বিশাল; RSVP-র প্রয়োগ-নির্দেশিকা (RFC 2208)-ও এ নিয়ে সাবধান করেছিল। তার ওপর পথটি কয়েকটি ISP-র, সবার সাথে সংরক্ষণের চুক্তি কার্যত অসম্ভব।

DiffServ (RFC 2474 আর 2475, ১৯৯৮) প্রশ্নটি উল্টে দিল: flow-এর বদলে কয়েকটি শ্রেণি। Classification, marking, policing হয় প্রান্তে, যেখানে flow কম; ভেতরের router শুধু ৬ bit দেখে queue বাছে — কোনো সংকেত, কোনো flow-state নেই। এটি end-to-end principle-এর মনোভাবের কাছাকাছি (পর্ব ০৩)। দাম: নিশ্চয়তা আপেক্ষিক, তাই প্রান্তের policing আর যথেষ্ট পরিকল্পনা অপরিহার্য, আর ISP-র সীমা পেরোলে চিহ্ন সাধারণত মানা হয় না। RSVP-ও পুরো হারায়নি — RSVP-TE হয়ে MPLS-এ বড় traffic-গুচ্ছের পথ বানায়, যেখানে flow কম।

মূল উপলব্ধি: নিখুঁত নিশ্চয়তার চেয়ে “যথেষ্ট ভালো আর বড় আকারে চালানো যায়” বেশিরভাগ সময় জেতে। প্রতিটি flow-এর state মাঝখানে রাখা যত সুন্দরই হোক, scale আর বহু মালিকানার সামনে টেকে না — একই শিক্ষা ATM বনাম IP-তেও দেখেছেন (পর্ব ১৫)।

প্র ০৪PIM-SM-এ rendezvous point কেন লাগে, আর SSM কীভাবে তাকে বাদ দেয়? কোন পরিস্থিতিতে কোনটি বাছবেন?

Explicit join-এর একটি মৌলিক সমস্যা আছে: প্রাপকের router Join পাঠাবে কোথায়? Source tree বানাতে উৎসের ঠিকানা জানা চাই, কিন্তু প্রথাগত multicast-এ (Any-Source Multicast, ASM) প্রাপক শুধু দলের নাম জানে — “239.1.1.1 চাই”, কে পাঠাচ্ছে জানে না। উৎসও জানে না প্রাপক কারা। দুই পক্ষের দেখা হওয়ার জন্য একটি পূর্বনির্ধারিত জায়গা লাগে — rendezvous point. প্রাপকেরা RP-র দিকে (*,G) Join পাঠায়, উৎসের router RP-কে Register বার্তায় ডেটা পাঠায়, আর RP দুই পক্ষকে মিলিয়ে দেয়। ঘটকের মতো: বর আর কনের পরিবার একে অপরকে চেনে না, কিন্তু দুজনেই ঘটককে চেনে।

দামও স্পষ্ট। প্রতিটি router-কে জানতে হয় কোন দলের RP কে (static, বা BSR-এর মতো স্বয়ংক্রিয় ব্যবস্থা); RP নষ্ট হলে নতুন উৎস খুঁজে পাওয়া যায় না, তাই Anycast RP-র মতো কৌশল লাগে। Shared tree ঘুরপথ হতে পারে, তাই অনেক নেটওয়ার্কে last-hop router প্রথম packet পেয়েই source tree-তে সরে যায়। আর বিভিন্ন ISP-র RP-কে উৎসের খবর দিতে MSDP লাগত — আন্তঃ-ISP multicast-এর জটিলতার বড় অংশ এখান থেকেই।

SSM একটি সরল অনুমানে পুরো সমস্যা এড়ায়: প্রাপক আগে থেকেই উৎস জানে — IPTV-র চ্যানেল তালিকায় (উৎস, দল) লেখা থাকে। Host IGMPv3-এ বলে “(S, G) চাই”, router সরাসরি S-এর দিকে Join পাঠায়; RP, Register, MSDP কিছুই নেই। দুই প্রতিষ্ঠান একই 232.x ঠিকানা নিলেও সংঘর্ষ নেই, আর অনাকাঙ্ক্ষিত উৎস গাছে ঢুকতে পারে না। তাই উৎস জানা আর নির্দিষ্ট হলে (IPTV, শেয়ারবাজারের feed) SSM; উৎস অনেক আর বদলায়, বা পুরোনো অ্যাপ IGMPv3 বোঝে না — PIM-SM-এর ASM.

মূল উপলব্ধি: RP হলো “অজানা উৎস” সমস্যার সমাধান, আর SSM সেই সমস্যাটিকেই বাদ দেয়। নেটওয়ার্ক নকশায় প্রায়ই সবচেয়ে ভালো সমাধান হলো সমস্যার একটি অনুমান বদলে দেওয়া।

প্র ০৫Bandwidth যখন সস্তা আর প্রচুর, তখন QoS-এর দরকার আছে কি? “আরও bandwidth কিনুন” আর “QoS করুন” — এই দুই দর্শনের মধ্যে কোনটি কোথায় ঠিক?

নেটওয়ার্ক প্রকৌশলে একটি পুরোনো বিতর্ক আছে: over-provisioning বনাম QoS. প্রথম দর্শন বলে, link এত বড় রাখুন যে প্রায় কখনো ভিড় না হয় — তাহলে queue ছোট, delay কম, আর জটিল QoS-এর নিয়ম লিখে ভুল করার ঝুঁকিও নেই। অনেক বড় backbone আর data center মূলত এভাবেই চলে: link-এর গড় ব্যবহার কম রাখা হয়, আর ভিড় বাড়লে নতুন link যোগ হয়। DiffServ থাকলেও সেখানে তার কাজ খুব কম সময়েই চোখে পড়ে।

কিন্তু “ভিড় না হওয়া” সব জায়গায় সম্ভব নয়। শেষ মাইল: বাসা বা ছোট অফিসের upload link সবচেয়ে ধীর, একটি cloud backup মুহূর্তেই তা ভরে দেয়, আর bufferbloat-এ (পর্ব ১৫) ভিডিও কলের delay শত শত ms. Wi-Fi: দেয়াল, দূরত্ব বা প্রতিবেশীর নেটওয়ার্কে কার্যকর গতি হঠাৎ কমে। দামি link: দূরের শাখা, স্যাটেলাইট বা মোবাইল backhaul. আর ব্যর্থতার মুহূর্ত: একটি link নষ্ট হলে বাকিটিতে হঠাৎ দ্বিগুণ traffic — কাকে বাঁচাবেন, সেই নীতি আগে লেখা থাকা ভালো।

আধুনিক দৃষ্টিভঙ্গি তাই মিশ্রণ: মূল নেটওয়ার্কে যথেষ্ট bandwidth; ভিড়ের জায়গায় (প্রান্ত, WAN, Wi-Fi) কয়েকটি সরল শ্রেণি, আর সবার নিচে AQM. fq_codel বা CAKE প্রতিটি flow-কে আলাদা ছোট লাইনে রেখে প্রায় কোনো DSCP ছাড়াই ছোট, delay-সংবেদনশীল flow-কে বাঁচায় — “চিহ্ন ছাড়া QoS”; গবেষণায় L4S একই লক্ষ্যে ECN ব্যবহার করছে।

মূল উপলব্ধি: যেখানে bandwidth বাড়ানো সস্তা, সেখানে bandwidth-ই সবচেয়ে ভালো QoS. যেখানে ভিড় অনিবার্য — শেষ মাইল, Wi-Fi, দামি WAN, ব্যর্থতার মুহূর্ত — সেখানে কয়েকটি সরল শ্রেণি আর AQM অনেক বড় পার্থক্য তৈরি করে।

অনুশীলন

খাতা-কলম নিন — bit ভেঙে, ms ধরে ধরে হিসাব করুন।

  1. হাতে হিসাব (MAC আর token bucket): (ক) 232.10.200.5 দলের Ethernet MAC কী? 239.138.200.5-এর MAC কি একই হবে? (খ) একটি policer-এ r = ২ Mbps, b = ১০০ KB (১ KB = ১,০০০ byte), আর link-এর গতি R = ১০ Mbps. পূর্ণ বালতি নিয়ে প্রেরক সর্বোচ্চ কতক্ষণ পূর্ণ গতিতে পাঠাতে পারবে, আর সেই সময়ে কত byte যাবে? যেকোনো ২ সেকেন্ডে সর্বোচ্চ কত byte যেতে পারে?

    (ক) দ্বিতীয় byte ১০ = 00001010, প্রথম bit ০, শেষ ৭ bit = ১০ = 0x0a; তৃতীয় ২০০ = 0xc8; চতুর্থ ৫ = 0x05. MAC = 01:00:5e:0a:c8:05. 239.138.200.5: ১৩৮ = 10001010 — প্রথম bit ১ বাদ গেলে শেষ ৭ bit = 0001010 = ১০. তাই একই MAC — প্রথম byte (২৩২ বনাম ২৩৯) আর দ্বিতীয় byte-এর প্রথম bit দুটোই হারানো ৫ bit-এর মধ্যে।

    (খ) b = ১০০,০০০ byte = ৮,০০,০০০ bit. T = b ÷ (R − r) = ৮,০০,০০০ ÷ (৮ × ১০৬) = ০.১ সেকেন্ড; পাঠানো R × T = ১০ Mbps × ০.১ = ১ Mbit = ১,২৫,০০০ byte (যাচাই: b + rT = ১,০০,০০০ + ২৫,০০০ byte). যেকোনো ২ সেকেন্ডে সর্বোচ্চ b + rt = ১,০০,০০০ + (২,৫০,০০০ × ২) = ৬,০০,০০০ byte (r = ২ Mbps = ২,৫০,০০০ byte/s).

  2. আউটপুট অনুমান করুন: অংশ ৭-এর token_bucket.js-এ শুধু b = 3000 বদলে b = 4500 করা হলো (শুরুতেও বালতি ভরা, অর্থাৎ ৪,৫০০)। Policer কোন কোন packet ফেলবে? Shaper-এ শেষ packet (৪০ ms-এ আসা) কখন বের হবে? চালানোর আগে হিসাব করুন।

    Policer: t = ০-এ ৪,৫০০ → ৩,০০০; t = ১-এ ৩,১০০ → ১,৬০০; t = ২-এ ১,৭০০ → conform, ২০০; t = ৩-এ ৩০০ → exceed; t = ২০-এ ২,০০০ → ৫০০; t = ২১-এ ৬০০, দরকার ১,০০০ → exceed; t = ৪০-এ ২,৫০০ → conform. ফেলা হলো দুটি — ৩ ms আর ২১ ms-এর packet. বড় বালতি ঝাপটার আরও একটি packet বাঁচাল।

    SHAPER   t(ms) size  leaves-at(ms)  delay(ms)
                 0  1500              0  0
                 1  1500              1  0
                 2  1500              2  0
                 3  1500             15  12
                20  1500             30  10
                21  1000             40  19
                40  1500             55  15

    Shaper-এ প্রথম তিনটি সাথে সাথে যায়, তারপর বালতি ২০০-তে; ৩ ms-এর packet ১,৩০০ token-এর জন্য ১২ ms অপেক্ষা করে ১৫-তে বের হয়। এরপর প্রতি ১,৫০০ byte-এ ১৫ ms আর ১,০০০ byte-এ ১০ ms — শেষ packet বের হয় ৫৫ ms-এ (আগে ছিল ৭০)। শিক্ষা: b বাড়ালে ঝাপটা বেশি অনুমতি পায়, loss আর delay দুটোই কমে — কিন্তু পরের router-এ ঝাপটাও বড় পৌঁছায়।

  3. কমান্ড লিখুন (Linux): (ক) নিজের কম্পিউটার কোন কোন multicast দলে আছে, দেখার দুটি উপায়। (খ) UDP port 5004-এ পাঠানো নিজের সব packet-এ DSCP EF বসানোর একটি iptables নিয়ম। (গ) eth0-এর বের হওয়া traffic ৮ Mbps-এ shape করা, ৩২ kbit burst-সহ। (ঘ) EF বসানো হলো কি না, কীভাবে যাচাই করবেন?
    ip maddr show                       # (ক) প্রতিটি interface-এর multicast MAC আর দল
    cat /proc/net/igmp                  # (ক) kernel-এর IGMP অবস্থা (hex, উল্টো byte ক্রম)
    sudo iptables -t mangle -A OUTPUT -p udp --dport 5004 -j DSCP --set-dscp-class EF   # (খ)
    sudo tc qdisc add dev eth0 root tbf rate 8mbit burst 32kbit latency 50ms           # (গ)
    sudo tcpdump -lni eth0 -v udp port 5004 | grep -m3 tos                              # (ঘ)

    (ঘ)-তে tcpdump -v দেখাবে tos 0xb8 — ৪৬ × ৪ = ১৮৪ (ECN থাকলে 0xb9 বা 0xba). iptables নেয় DSCP, tcpdump দেখায় পুরো TOS byte — গুলিয়ে ফেলাই প্রচলিত ভুল। nftables-এ ip dscp set ef; Windows-এ সাধারণত Group Policy-র QoS নীতি। শুধু নিজের যন্ত্রে বা ল্যাবে চালান।

  4. নকশা আর trace: একটি শাখা অফিসের WAN link ১০ Mbps. সেখানে একসাথে সর্বোচ্চ ১২টি G.711 কল (প্রতিটি IP স্তরে ৮০ kbps) হতে পারে, আর ভিডিও কনফারেন্সের জন্য ভিড়ের সময় অন্তত ৩ Mbps চাই। (ক) LLQ-র priority অংশ কত kbps দেবেন, আর কেন সীমা লাগবে? (খ) একটি কলের একদিকের delay: codec ২৫ ms, প্রচার ৩৫ ms, jitter buffer ৪০ ms. G.114-এর ~১৫০ ms নির্দেশনায় queuing-এর জন্য কত বাকি? (গ) কেউ PC থেকে সব packet-এ EF বসিয়ে পাঠাচ্ছে — কোথায় আর কীভাবে ঠেকাবেন?

    (ক) ১২ × ৮০ = ৯৬০ kbps; link-layer header ধরে একটু বেশি, যেমন ১,০০০–১,১০০ kbps. সীমা (policer) না থাকলে ভুল চিহ্নের traffic বা অপ্রত্যাশিত বেশি কল priority queue দিয়ে পুরো link দখল করে বাকি শ্রেণিকে না খাইয়ে রাখত। বাকি প্রায় ৯ Mbps থেকে ভিডিও-শ্রেণিকে bandwidth দিয়ে ৩ Mbps-এর ন্যূনতম ভাগ, বাকিটা default-এ fair queue.

    (খ) ২৫ + ৩৫ + ৪০ = ১০০ ms; queuing আর transmission-এর জন্য বাকি প্রায় ৫০ ms. ১০ Mbps-এ একটি ১,৫০০ byte-এর packet-এর transmission delay ১.২ ms, তাই ভয়েসের সামনে কয়েকটি বড় packet থাকলেও সমস্যা নেই — কিন্তু FIFO-তে ১ MB-এর ভরা buffer (৮০০ ms) পুরো বাজেট ধ্বংস করত।

    (গ) Trust boundary access switch-এ: PC-র port untrusted — সেখান থেকে আসা DSCP ০ করে দেওয়া (ECN bit রেখে), শুধু IP phone-এর port বা voice VLAN trusted. সাথে WAN router-এর priority অংশের policer দ্বিতীয় নিরাপত্তা দেয়।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি অফিসের QoS-যুক্ত নেটওয়ার্কে একটি ভয়েস packet — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. IP phone packet-এর DSCP ঘরে ৪৬ (EF) বসায়
  2. Access switch-এর trust boundary দেখে port-টি trusted, তাই চিহ্ন রাখে
  3. WAN router-এর classifier DSCP দেখে packet-কে voice শ্রেণিতে ফেলে
  4. Voice শ্রেণির policer দেখে packet নির্ধারিত হারের মধ্যে আছে কি না
  5. Output-এর priority queue থেকে packet অন্য শ্রেণির আগে WAN link-এ যায়
  6. পরের router নিজের PHB অনুযায়ী একই DSCP দেখে আবার আগে পাঠায়

IPv4 multicast দল 239.1.1.1-এর Ethernet MAC 01:00:5e:01:01:01. নিচের কোন দলটিও ঠিক একই MAC পায়?

  • 239.1.1.2
  • 239.1.2.1
  • 224.129.1.1
  • 239.2.1.1

একটি multicast router-এর unicast table অনুযায়ী উৎস 198.51.100.7-এ পৌঁছানোর পথ interface eth1 দিয়ে। ওই উৎসের একটি multicast packet eth2 দিয়ে এলো। RPF check-এ কী হবে?

  • Packet গ্রহণ করে সব interface-এ পাঠানো হবে
  • RPF check ব্যর্থ — packet ফেলে দেওয়া হবে
  • Router নতুন multicast routing table বানিয়ে আবার পরীক্ষা করবে
  • Packet উৎসের কাছে ফেরত পাঠানো হবে

একটি token bucket-এর হার r = ১ Mbps আর বালতির আকার b = ৫০,০০০ byte. যেকোনো ২ সেকেন্ডে সর্বোচ্চ কত byte পাঠানো যায়?

  • ২,৫০,০০০ byte
  • ৫০,০০০ byte
  • ২০,৫০,০০০ byte
  • ৩,০০,০০০ byte

একটি IPv4 packet-এর TOS byte 0x88. এর DSCP আর শ্রেণি কী?

  • DSCP ৩৪, AF41
  • DSCP ১৩৬, EF
  • DSCP ৪৬, EF
  • DSCP ৩২, CS4

একটি ISP গ্রাহকের ২০ Mbps চুক্তির বেশি traffic সাথে সাথে ফেলে দেয়, আর গ্রাহকের router নিজের বের হওয়া traffic আগেই ১৯ Mbps-এ মসৃণ করে buffer-এ রেখে পাঠায়। দুটি কাজের নাম যথাক্রমে কী?

  • Shaping, তারপর policing
  • Marking, তারপর classification
  • Policing, তারপর shaping
  • Admission control, তারপর scheduling

IntServ (RSVP-সহ) বড় ISP backbone-এ ব্যাপকভাবে চালু হয়নি — এর প্রধান কারণ কোনটি?

  • এটি কোনো delay-এর নিশ্চয়তা দিতে পারত না
  • প্রতিটি flow-এর জন্য প্রতিটি router-এ state আর সংকেত রাখতে হয়
  • এটি IP header-এ কোনো জায়গা পায়নি
  • RSVP শুধু TCP-র সাথে কাজ করত

একটি switch-এ IGMP snooping বন্ধ। একটি port-এর কম্পিউটার 239.5.5.5 দলে যোগ দিয়ে ১০ Mbps-এর stream নিচ্ছে। একই VLAN-এর অন্য port-গুলোর কী হবে?

  • Switch MAC শিখে শুধু সদস্যের port-এ পাঠাবে
  • Stream কোনো port-এই যাবে না
  • শুধু অন্য VLAN-এর port-গুলো stream পাবে
  • একই VLAN-এর সব port-এ stream ছড়াবে (flooding)

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Multicast = একবার পাঠানো, পথ ভাগ হলে কপি: IPv4 দল 224.0.0.0/4 (224.0.0.0/24 link-local, 232/8 SSM, 239/8 প্রতিষ্ঠানের ভেতরে); MAC = 01:00:5e + শেষ ২৩ bit, তাই ৩২:১ সংঘর্ষ।
  2. IGMP host-এর সদস্যপদ জানায় (v2: Report, Leave, Query; v3: উৎস বাছাই); IGMP snooping switch-কে শুধু সদস্য-port-এ পাঠাতে শেখায় — querier লাগে। IPv6-এ MLD.
  3. Multicast routing = গাছ: source tree (S,G) বনাম shared tree (*,G) RP-সহ; RPF check উৎসের দিকের interface ছাড়া সব কপি ফেলে; flood-and-prune (DVMRP, PIM-DM) বনাম explicit join (PIM-SM), আর SSM-এ RP নেই।
  4. QoS = ভিড়ের সময় ভাগ: প্রান্তে classification আর DSCP marking (EF ৪৬, AFxy = 8x + 2y, CSn = 8n), trust boundary; policing ফেলে, shaping দেরি করায়; token bucket-এ যেকোনো t-তে ≤ b + rt, সর্বোচ্চ ঝাপটা b ÷ (R − r).
  5. বাস্তবের নকশা: LLQ (policer-সহ priority + WFQ), DiffServ (শ্রেণি আর PHB) — IntServ-এর per-flow RSVP মানায়নি; MPLS-TE ভেতরে পথ বানায়; ECN-এর দাগ আর AQM queue ছোট রাখে; বাসায় SQM আর Wi-Fi-তে WMM.

পরের পর্বে: Network layer আর routing-এর মডিউল শেষ — packet এখন সঠিক host-এ পৌঁছায়। কিন্তু host-এর ভেতরে কোন প্রোগ্রাম সেটি পাবে? মডিউল ৫ শুরু হচ্ছে transport layer দিয়ে: port, socket আর multiplexing.

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

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান