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

Numerical সমস্যা — subnetting, delay, CRC, sliding window আর routing

Computer Networks Numericals — Fully Worked Problems on Delay, Signals, Error Control, ARQ, MAC, Subnetting, Fragmentation, Routing, TCP, HTTP, Caching, P2P, VoIP and Cellular Reuse

Taught in Bangla, this page collects fully worked computer networks numericals: delay, throughput, BDP and traffic intensity, decibels, Nyquist and Shannon, parity, checksum, CRC and Hamming codes, bit stuffing, ARQ efficiency, ALOHA and CSMA/CD, subnetting, VLSM, summarisation and fragmentation, longest prefix match, Dijkstra and distance vector, TCP sequence numbers, RTO and cwnd, and HTTP, caching, P2P, VoIP and cellular reuse, with answer-layout tips.

এই পর্বে যা পাবেন

  • নেটওয়ার্কের প্রতিটি numerical-এর সূত্র, নিয়ম (convention) আর সাধারণ ফাঁদ — এক জায়গায়
  • CRC-র long division, Dijkstra-র N′ টেবিল, VLSM-এর বরাদ্দ টেবিল আর cwnd-এর round টেবিল এমনভাবে লেখার অভ্যাস, যাতে পরীক্ষক প্রতিটি ধাপ মেলাতে পারেন
  • উল্টো দিকের প্রশ্ন সামলানো: “ন্যূনতম SNR কত?”, “কত bit-এর sequence নম্বর লাগবে?”, “সর্বোচ্চ কত দূরত্ব?”, “কোন N দরকার?”
  • ছোট ক্যালকুলেটর দিয়ে নিজের উত্তর মেলানো, আর AI-এর দেওয়া subnet বা CRC-র হিসাব সন্দেহের চোখে দেখা

১ · পাতার মানচিত্র, নিয়ম আর খাতায় উত্তর সাজানোর কৌশল

মডিউল ১০-এ স্বাগতম। প্রথম ৫৭টি পর্বে আপনি নেটওয়ার্ক শিখেছেন — তামার তার আর সংকেত থেকে শুরু করে TCP, DNS আর মোবাইল নেটওয়ার্ক পর্যন্ত। এই পাঁচটি পর্বে সেই জ্ঞান পরীক্ষার খাতায়, MCQ-এর ঘড়ির সামনে আর ইন্টারভিউর টেবিলে কাজে লাগানোর অনুশীলন। শুরু করছি numerical দিয়ে, কারণ বিশ্ববিদ্যালয়ের Computer Networks বা Data Communication কোর্সের লিখিত পরীক্ষা থেকে IT অফিসার বা নেটওয়ার্ক ইঞ্জিনিয়ারের লিখিত পরীক্ষা পর্যন্ত — এ ধরনের প্রশ্ন প্রায়ই আসে। আর এখানে নম্বর পুরোপুরি পাওয়া যায়, যদি পদ্ধতি পরিষ্কার থাকে।

নেটওয়ার্কের অঙ্কে ভুল সাধারণত সূত্রে হয় না, হয় একক আর নিয়মে। “১০০০ byte”-কে bit-এ না বদলালে transmission delay আট গুণ ছোট আসে; “৩০ dB”-কে অনুপাতে না বদলে Shannon-এ বসালে উত্তর অর্ধেকেরও কম; RTT দেওয়া থাকলে আবার দুই দিয়ে গুণ করলে stop-and-wait-এর efficiency ভুল। তাই এই পাতার প্রতিটি প্রশ্নে একক আর নিয়ম লেখা আছে, আর আপনার খাতাতেও উত্তরের প্রথম লাইনে সেগুলো থাকা উচিত।

কোন ভাগে কী, কোন পর্ব ঝালাবেন

ভাগকী আছেমূল পর্ব
২Transmission ও propagation delay, store-and-forward, bottleneck, La/R, BDP আর window০৫, ৩১, ৫৬
৩dB ও dBm, Nyquist, Shannon, baud, line coding, FDM ও TDM০৭, ০৮
৪Parity, Internet checksum, CRC-র long division, Hamming(7,4), dmin০৯
৫Bit stuffing, stop-and-wait / GBN / SR-এর efficiency আর sequence bit, ALOHA, CSMA/CD১০, ১১
৬Network ও broadcast, FLSM, VLSM, summarisation, wildcard, fragmentation — সবচেয়ে বড় ভাগ১৬, ১৭
৭Longest prefix match, Dijkstra-র টেবিল, distance vector-এর round, OSPF cost২২–২৪
৮Seq/ack নম্বর, RTO, rwnd ও window scaling, Reno/Tahoe-র cwnd, AIMD ও Mathis২৯–৩২
৯HTTP-র সময়, প্রতিষ্ঠানের cache, P2P বিতরণ, DNS বার্তা, VoIP bandwidth, playout, cell reuse৩৪–৩৮, ৪০, ৫১

এই পাতার নিয়ম (convention) — প্রশ্নে অন্য কিছু না বললে

বিষয়নিয়ম
এককData rate দশমিকে: 1 Mbps = 106 bit/s, 1 KB = 1000 byte; TCP window-এর 65535 byte আর buffer-এর KiB আলাদা করে লেখা। 1 byte = 8 bit
সংকেতের গতিতামা ও fiber-এ s = 2 × 108 m/s
ARQa = Tprop/Ttrans; ACK-এর transmission ও processing নগণ্য; ACK হারায় না (পর্ব ১০-এর মডেল)
CRC ও Hammingডেটার শেষে r টি শূন্য জুড়ে modulo-2 ভাগ; Hamming-এ parity অবস্থান ১, ২, ৪, even parity, ডেটা ৩, ৫, ৬, ৭-এ (পর্ব ০৯)
Subnetপ্রতিটি subnet-এ network আর broadcast বাদ (2h − 2); VLSM-এ বড় block আগে, প্রতিটি block নিজের মাপের গুণিতকে
DijkstraD সমান হলে বর্ণক্রমে আগের node; নতুন cost কঠোরভাবে ছোট হলেই p(v) বদলায় (পর্ব ২৪)
Distance vectorSynchronous round: প্রতি round-এ সবাই আগের round-এর vector দেখে Bellman-Ford চালায় (পর্ব ২৩)
TCPRTO-তে α = 1/8, β = 1/4, আগে RTTVAR (পুরোনো SRTT দিয়ে); cwnd MSS-এ, slow start ssthresh-এ থামে; loss-এ ssthresh = max(⌊cwnd/2⌋, 2); Reno-তে ৩ dup ACK-এর পর cwnd = ssthresh, timeout-এ ১ (পর্ব ৩০, ৩২)
পরীক্ষার কৌশল — খাতায় উত্তর সাজানোর ছয় নিয়ম

১. দেওয়া তথ্য আর একক এক লাইনে। “L = 1500 byte = 12000 bit, R = 10 Mbps = 107 bit/s” — এই রূপান্তর এক লাইনে দেখালে byte-bit-এর ভুল সেখানেই ধরা পড়ে।

২. নিয়ম ঘোষণা করুন। “ধরে নিলাম ACK নগণ্য, s = 2 × 108 m/s, fast recovery-র পর cwnd = ssthresh.” প্রশ্নে না থাকলে এটাই আপনার রক্ষাকবচ।

৩. সূত্র আগে, মান পরে। “U = W/(1 + 2a)” লিখে তারপর সংখ্যা বসান। গণনায় ভুল হলেও সূত্রের নম্বর থাকে।

৪. টেবিলে উত্তর দিন। VLSM, Dijkstra, distance vector, fragmentation আর cwnd — সবই টেবিলের অঙ্ক। কলামের নাম আগে লিখুন, তারপর সারি ধরে ভরুন।

৫. একটি চেক দিন। Checksum-সহ যোগফল 0xFFFF; CRC-সহ frame-এর ভাগশেষ শূন্য; VLSM-এর মোট ≤ মূল block; fragment-এর ডেটার যোগফল = মূল ডেটা; Dijkstra-র পথের cost-এর যোগ = D(v).

৬. শেষ উত্তর আলাদা করুন, এক লাইনের মন্তব্যসহ। “U ≈ ২১%; প্রেরক চক্রের প্রায় ৭৯% সময় বসে থাকে” — তুলনার প্রশ্নে এই এক লাইনেই পূর্ণ নম্বর অনেক সময় আসে।

২ · Delay, throughput, BDP আর traffic intensity

সূত্রের কার্ড

Transmission delay: dtrans = L/R — packet-এর সব bit তারে ঠেলে দিতে সময়। Propagation delay: dprop = d/s — একটি bit-এর ওপারে পৌঁছাতে সময়।

Store-and-forward: N টি link-এ (N − 1 টি router) একটি packet: N·L/R (propagation, queue বাদে); P টি packet পরপর: (N + P − 1)·L/R.

Throughput: min(Rs, Rc, R/n) — পথের সবচেয়ে সরু অংশ, অর্থাৎ bottleneck link; ভাগ করা link-এ ন্যায্য ভাগ R/n.

Traffic intensity: ρ = La/R (a = প্রতি সেকেন্ডে আসা packet). ρ > 1 হলে queue অসীমভাবে বাড়ে; ρ ১-এর কাছে গেলে queuing delay লাফিয়ে বাড়ে। একসাথে আসা N টি packet-এর গড় অপেক্ষা (N − 1)L/(2R).

BDP: R × RTT — পথে একসাথে কত bit থাকতে পারে। Window-সীমিত throughput ≤ W/RTT; পুরো link ভরাতে W ≥ BDP.

উদাহরণ ২.১ (সহজ) — একটি link-এ মোট delay

প্রশ্ন: ১৫০০ byte-এর একটি packet ১০ Mbps-এর ২০০০ km লম্বা fiber link দিয়ে যাবে। Processing আর queuing নগণ্য। প্রথম bit পাঠানো থেকে শেষ bit পৌঁছানো পর্যন্ত কত সময়?

L = 1500 x 8 = 12000 bit      R = 10^7 bit/s      d = 2 x 10^6 m      s = 2 x 10^8 m/s
d_trans = 12000 / 10^7      = 1.2 ms
d_prop  = 2 x 10^6 / 2 x 10^8 = 10 ms
total   = 1.2 + 10          = 11.2 ms

এখানে propagation transmission-এর আট গুণের বেশি — দূরপাল্লার link-এ এমনই হয়। উত্তর ১১.২ ms. ফাঁদ: ১৫০০-কে bit ধরলে dtrans আসে ০.১৫ ms — আট গুণ ভুল।

উদাহরণ ২.২ (মাঝারি) — store-and-forward আর pipelining

প্রশ্ন: উৎস আর গন্তব্যের মাঝে দুটি router, অর্থাৎ ৩টি link, প্রতিটি ১০ Mbps. Packet ১৫০০ byte. Propagation, processing আর queuing বাদ। (ক) একটি packet পৌঁছাতে কত সময়? (খ) পরপর ১০টি packet-এর শেষটি কখন পৌঁছায়?

L/R = 1.2 ms (from 2.1)
(a) N = 3 links:        N x L/R          = 3 x 1.2        = 3.6 ms
(b) P = 10 packets:     (N + P - 1) L/R  = 12 x 1.2       = 14.4 ms

(খ)-এর যুক্তি: প্রথম packet ৩.৬ ms-এ পৌঁছায়, আর তারপর প্রতি ১.২ ms-এ একটি করে বাকি ৯টি — ৩.৬ + ৯ × ১.২ = ১৪.৪. সাধারণ ভুল: ১০ × ৩.৬ = ৩৬ ms লেখা — যেন একটি packet পৌঁছানোর আগে পরেরটি রওনাই হয় না। Router যখন প্রথম packet পরের link-এ পাঠাচ্ছে, তখনই উৎস দ্বিতীয়টি পাঠাচ্ছে — এটাই pipelining.

উদাহরণ ২.৩ (মাঝারি) — bottleneck আর ভাগ করা link

প্রশ্ন: সার্ভারের access link Rs = ২ Mbps, client-এর Rc = ১ Mbps, আর মাঝের ৫ Mbps-এর একটি core link একসাথে ১০টি প্রবাহ সমানভাবে ভাগ করে। একটি প্রবাহের throughput কত? ৪ MB-এর একটি ফাইল নামাতে কত সময়?

throughput = min(2, 1, 5/10) = min(2, 1, 0.5) = 0.5 Mbps
file = 4 MB = 4 x 8 x 10^6 = 32 Mbit
time = 32 / 0.5 = 64 s

Bottleneck এখানে client-এর নিজের link নয়, ভিড়ের core link. উত্তর ০.৫ Mbps, ৬৪ সেকেন্ড। ভাগ করা link-এর R/n ভুলে গেলে উত্তর আসত ১ Mbps আর ৩২ সেকেন্ড।

উদাহরণ ২.৪ (মাঝারি) — traffic intensity আর উল্টো প্রশ্ন

প্রশ্ন: একটি router-এর বহির্গামী link ১০ Mbps, প্রতিটি packet ১৫০০ byte. (ক) গড়ে প্রতি সেকেন্ডে ৬০০ আর ৯০০ packet এলে La/R কত, আর কী ঘটবে? (খ) La/R ≤ ০.৮ রাখতে সর্বোচ্চ কত packet/s?

L = 12000 bit
(a) a = 600 : La/R = 12000 x 600 / 10^7 = 0.72   -> queue stays finite
    a = 900 : La/R = 1.08 > 1                    -> queue grows without limit, loss
(b) 12000 a / 10^7 <= 0.8  =>  a <= 666.67      -> at most 666 packets/s

(খ)-তে ৬৬৬.৬৭ পূর্ণসংখ্যা নয়; packet ভগ্নাংশে আসে না, আর সীমা “≤”, তাই নিচের দিকে ৬৬৬. ρ = ০.৭২-এ queuing delay কত, তা আগমনের ধরনের ওপর নির্ভর করে — শুধু La/R থেকে বলা যায় না; প্রশ্নে মডেল দেওয়া থাকলে তবেই সংখ্যা বের হয় (পর্ব ০৫, ৩৮)।

উদাহরণ ২.৫ (কঠিন) — BDP, window আর window scale

প্রশ্ন: ১০০ Mbps link, RTT ৬০ ms. (ক) BDP কত? (খ) Window scaling ছাড়া TCP-র সর্বোচ্চ window ৬৫,৫৩৫ byte হলে সর্বোচ্চ throughput কত? (গ) পুরো link ভরাতে window scale-এর ন্যূনতম shift কত?

(a) BDP = 10^8 x 0.060 = 6 x 10^6 bit = 750,000 byte
(b) throughput <= W / RTT = 65535 x 8 / 0.060 = 8.738 Mbps   (about 8.7% of the link)
(c) 65535 x 2^shift >= 750,000
    shift 3 : 524,280   (too small)
    shift 4 : 1,048,560 -> minimum shift = 4

পুরোনো ৬৪ KB window দিয়ে ১০০ Mbps-এর link-এর এক-দশমাংশও ব্যবহার হয় না — লম্বা, মোটা পথে (long fat network) window scaling কেন লাগে, তার সরাসরি প্রমাণ। উত্তর: ৭,৫০,০০০ byte; ৮.৭৪ Mbps; shift ৪.

উদাহরণ ২.৬ (মাঝারি) — শেষ bit বেরোনোর মুহূর্তে প্রথম bit কোথায়?

প্রশ্ন: L = ১০০০ bit, R = ১ Mbps, s = 2 × 108 m/s. Link কত লম্বা হলে dprop = dtrans? Link ২০০০ km হলে শেষ bit বেরোনোর মুহূর্তে প্রথম bit কোথায়?

d_trans = 1000 / 10^6 = 1 ms
d_prop = d_trans  =>  d = s x L/R = 2 x 10^8 x 10^-3 = 200 km
d = 2000 km: at t = 1 ms the first bit has travelled 200 km -> still on the wire

উত্তর ২০০ km; ২০০০ km-এর link-এ প্রথম bit তখন উৎস থেকে ২০০ km দূরে, তারের ওপর। d < s·L/R হলে উল্টোটা: শেষ bit বেরোনোর আগেই প্রথম bit ওপারে পৌঁছে যায় (যেমন LAN-এ)।

উদাহরণ ২.৭ (মাঝারি) — একসাথে আসা packet-এর queuing delay

প্রশ্ন: একটি খালি queue-তে একই মুহূর্তে ৫টি packet এল (প্রতিটি ১৫০০ byte, link ১০ Mbps). প্রতিটির queuing delay আর গড় কত?

L/R = 1.2 ms;  packet k waits (k - 1) L/R
waits = 0, 1.2, 2.4, 3.6, 4.8 ms
average = (N - 1) L / (2R) = 4 x 1.2 / 2 = 2.4 ms

শেষ packet ৪.৮ ms অপেক্ষা করে, অথচ link-এর গড় load খুব কম হতেও পারে — ভিড় আসে একসাথে আসা (bursty) packet থেকে। গড় ২.৪ ms.

সাতটি উদাহরণের প্রতিটি সংখ্যা নিচের ক্যালকুলেটরে একবারে মিলিয়ে নিতে পারবেন। নিজের প্রশ্নের জন্য ওপরের ধ্রুবকগুলো বদলে Run চাপুন:

// Delay, throughput and BDP checker. Units: bits, bit/s, metres, seconds. Edit and Run.
const ms = x => (x * 1e3).toFixed(3) + " ms";
const s = 2e8;                                     // signal speed in fibre or copper, m/s
const L = 1500 * 8, R = 10e6, d = 2000e3;          // 1500-byte packet, 10 Mbps, 2000 km
console.log("2.1 dtrans=" + ms(L / R) + "  dprop=" + ms(d / s) + "  total=" + ms(L / R + d / s));
const N = 3, P = 10;                               // store-and-forward: N links, P packets
console.log("2.2 1 packet, " + N + " links: " + ms(N * L / R) + "   " + P + " packets: " + ms((N + P - 1) * L / R));
const thr = Math.min(2e6, 1e6, 5e6 / 10);          // Rs, Rc, fair share of a shared core link
console.log("2.3 throughput=" + thr / 1e6 + " Mbps, 4 MB file: " + 4 * 8e6 / thr + " s");
for (const a of [600, 900]) console.log("2.4 a=" + a + " pkt/s  La/R=" + (12000 * a / 10e6).toFixed(2));
console.log("2.4 largest a with La/R <= 0.8: " + Math.floor(0.8 * 10e6 / 12000) + " pkt/s");
const bdp = 100e6 * 0.060;                         // 100 Mbps x 60 ms RTT
console.log("2.5 BDP=" + bdp / 1e6 + " Mbit = " + bdp / 8 + " bytes; 65535-byte window -> " +
  (65535 * 8 / 0.060 / 1e6).toFixed(3) + " Mbps");
let shift = 0;
while (65535 * 2 ** shift < bdp / 8) shift++;
console.log("2.5 window-scale shift=" + shift + " (max window " + 65535 * 2 ** shift + " bytes)");
console.log("2.6 distance where dprop = dtrans (L=1000 bit, R=1 Mbps): " + s * 1000 / 1e6 / 1e3 + " km");
const n = 5, t = L / R;                            // 5 packets reach an empty queue together
console.log("2.7 waits: " + [...Array(n).keys()].map(k => (k * t * 1e3).toFixed(1)).join(", ") +
  " ms   average=" + ms((n - 1) * t / 2));

আউটপুট:

2.1 dtrans=1.200 ms  dprop=10.000 ms  total=11.200 ms
2.2 1 packet, 3 links: 3.600 ms   10 packets: 14.400 ms
2.3 throughput=0.5 Mbps, 4 MB file: 64 s
2.4 a=600 pkt/s  La/R=0.72
2.4 a=900 pkt/s  La/R=1.08
2.4 largest a with La/R <= 0.8: 666 pkt/s
2.5 BDP=6 Mbit = 750000 bytes; 65535-byte window -> 8.738 Mbps
2.5 window-scale shift=4 (max window 1048560 bytes)
2.6 distance where dprop = dtrans (L=1000 bit, R=1 Mbps): 200 km
2.7 waits: 0.0, 1.2, 2.4, 3.6, 4.8 ms   average=2.400 ms

প্রতিটি লাইন একটি উদাহরণের উত্তর: ১১.২ ms, ৩.৬ আর ১৪.৪ ms, ০.৫ Mbps-এ ৬৪ সেকেন্ড, La/R = ০.৭২ আর ১.০৮, সর্বোচ্চ ৬৬৬ packet/s, BDP ৭,৫০,০০০ byte, shift ৪, ২০০ km আর গড় অপেক্ষা ২.৪ ms. while লুপটি window scale-এর shift এক এক করে বাড়ায় যতক্ষণ না 65535 × 2shift BDP ছাড়ায় — উদাহরণ ২.৫-এর (গ)-এর হুবহু পদ্ধতি।

নিজে করুন — ভাগ ২

নি ২.১(সহজ) ৩০০০ km দূরের একটি সার্ভারের সাথে শুধু propagation ধরে ন্যূনতম RTT কত (s = 2 × 108 m/s)?

একমুখী 3 × 106 ÷ 2 × 108 = ১৫ ms, তাই RTT ≥ ৩০ ms. বাস্তবে তার সোজা পথে যায় না আর পথে queue আছে, তাই ping-এ এর চেয়ে বেশি দেখবেন।

নি ২.২(মাঝারি) ১২৫০ byte-এর packet ৪টি link পার হবে, প্রতিটি ১০০ Mbps, প্রতিটির propagation ১ ms; store-and-forward, queue আর processing নেই। মোট delay?

L/R = 10000 ÷ 108 = ০.১ ms. প্রতি link-এ ০.১ + ১ = ১.১ ms; মোট ৪ × ১.১ = ৪.৪ ms.

নি ২.৩(সহজ) পথের তিনটি link ২০, ৫ আর ৫০ Mbps; অন্য কোনো প্রবাহ নেই। ১০ MB-এর ফাইল নামাতে কত সময়?

Bottleneck ৫ Mbps; ১০ MB = ৮০ Mbit; ৮০ ÷ ৫ = ১৬ সেকেন্ড. MB-কে Mbit না বানালে আসে ২ সেকেন্ড — আট গুণ ভুল।

নি ২.৪(কঠিন) ১ Gbps link, RTT ৩০ ms. BDP কত byte? প্রাপকের window ২৬২,১৪৪ byte হলে সর্বোচ্চ throughput আর link-এর কত শতাংশ?

BDP = 109 × ০.০৩ = 3 × 107 bit = ৩৭,৫০,০০০ byte. Throughput ≤ 262144 × 8 ÷ 0.03 ≈ ৬৯.৯ Mbps — link-এর প্রায় ৭%. পুরো link ভরাতে window অন্তত BDP-র সমান লাগবে।

৩ · Physical layer — dB, Nyquist, Shannon, baud আর line coding

সূত্রের কার্ড

dB: 10 log10(P2/P1); পথের অংশগুলোর dB সরাসরি যোগ হয়। dBm = 10 log10(P / 1 mW). ৩ dB ≈ দ্বিগুণ, ১০ dB = দশ গুণ।

SNR: সূত্রে বসান অনুপাত, dB নয়: SNR = 10dB/10.

Nyquist (noise নেই): bit rate = 2B log2 L. Shannon: C = B log2(1 + SNR). বাস্তব নকশায় আগে Shannon দিয়ে সীমা, তারপর Nyquist দিয়ে স্তরের সংখ্যা।

Bit rate আর baud: bit rate = baud × log2 L. Manchester-এ প্রতি bit-এ দুই অর্ধেক, তাই সংকেতের হার bit rate-এর দ্বিগুণ।

Multiplexing: FDM-এ মোট bandwidth = Σ চ্যানেল + guard band; synchronous TDM-এ frame = সব slot + framing bit.

উদাহরণ ৩.১ (সহজ) — dB-এর শিকল

প্রশ্ন: ১০ mW-এর সংকেত একটি তারে −১২ dB হারায়, তারপর +২০ dB-এর amplifier, তারপর আবার −৫ dB-এর তার। শেষে শক্তি কত mW আর কত dBm?

net = -12 + 20 - 5 = +3 dB
P_out = 10 mW x 10^(3/10) = 10 x 1.995 = 19.95 mW
in dBm: 10 log10(10) = 10 dBm  ->  10 + 3 = 13 dBm

প্রায় ২০ mW, অর্থাৎ ১৩ dBm. প্রতিটি অংশের জন্য আলাদা গুণ-ভাগ না করে dB যোগ করাই লগারিদমের সুবিধা। ফাঁদ: dB আর dBm যোগ করা যায় (dBm + dB = dBm), কিন্তু দুটি dBm যোগ করা যায় না।

উদাহরণ ৩.২ (সহজ) — Nyquist

প্রশ্ন: ৪ kHz bandwidth-এর noise-হীন চ্যানেলে ৮টি স্তরের সংকেতে সর্বোচ্চ bit rate কত?

R = 2 x B x log2 L = 2 x 4000 x log2 8 = 2 x 4000 x 3 = 24,000 bps

উত্তর ২৪ kbps. সাধারণ ভুল: log2 ৮-এর বদলে ৮ বসানো (৬৪ kbps).

উদাহরণ ৩.৩ (মাঝারি) — Shannon, তারপর Nyquist

প্রশ্ন: B = ১ MHz, SNR = ৩০ dB. (ক) Shannon capacity কত? (খ) ৮ Mbps পাঠাতে চাইলে Nyquist অনুযায়ী কতটি স্তর লাগবে?

(a) SNR = 10^(30/10) = 1000
    C = 10^6 x log2(1001) = 10^6 x 9.967 = 9.967 Mbps
(b) 8 x 10^6 = 2 x 10^6 x log2 L  =>  log2 L = 4  =>  L = 16

৮ Mbps সীমার (প্রায় ৯.৯৭) নিচে, তাই সম্ভব; লাগবে ১৬ স্তর (যেমন 16-QAM). SNR-এর জায়গায় সরাসরি ৩০ বসালে C আসত মাত্র ১০৬ × log2 ৩১ ≈ ৪.৯৫ Mbps — পরীক্ষায় সবচেয়ে বেশি নম্বর কাটা যায় এই ভুলে।

উদাহরণ ৩.৪ (মাঝারি) — উল্টো Shannon: ন্যূনতম SNR

প্রশ্ন: ৪ MHz-এর চ্যানেলে ২০ Mbps পাঠাতে ন্যূনতম SNR কত (অনুপাত আর dB)?

20 x 10^6 = 4 x 10^6 x log2(1 + SNR)  =>  log2(1 + SNR) = 5
1 + SNR = 32  =>  SNR = 31  =>  10 log10 31 = 14.91 dB

SNR ≥ ৩১, প্রায় ১৪.৯ dB. লক্ষ করুন, bit rate এক bit/s/Hz বাড়াতে SNR প্রায় দ্বিগুণ করতে হয় — bandwidth বাড়ানো সাধারণত সস্তা।

উদাহরণ ৩.৫ (সহজ) — baud আর bit rate

প্রশ্ন: (ক) 16-QAM, ২৪০০ baud — bit rate? (খ) 64-QAM-এ ৩০ Mbps পাঠাতে কত baud?

(a) 2400 x log2 16 = 2400 x 4 = 9600 bps
(b) 30 x 10^6 / log2 64 = 30 x 10^6 / 6 = 5 x 10^6 baud = 5 Mbaud

৯৬০০ bps; ৫ Mbaud. Baud হলো প্রতি সেকেন্ডে symbol, bit নয় — দুই স্তরের সংকেতেই কেবল দুটি সমান।

উদাহরণ ৩.৬ (মাঝারি) — line coding-এ transition গোনা

প্রশ্ন: Bit-সারি 10110010. শুরুর আগে লাইন low. NRZ-L (১ = high), NRZ-I (১ এলে bit-এর শুরুতে স্তর উল্টায়) আর Manchester (IEEE 802.3: ০ = high→low, ১ = low→high)-এ মোট কতটি transition?

half-bit levels (1 = high), two per bit:
bits        1  0  1  1  0  0  1  0
NRZ-L      11 00 11 11 00 00 11 00   edges 6
NRZ-I      11 11 00 11 11 11 00 00   edges 4
Manchester 01 10 01 01 10 10 01 10   edges 10

৬, ৪ আর ১০টি। প্রথম bit-এর শুরুর transition-ও গোনা হয়েছে (low থেকে high). Manchester-এ প্রতি bit-এর মাঝে একটি transition থাকবেই, আর একই মানের দুটি bit পাশাপাশি এলে (যেমন bit ৩–৪ বা ৫–৬) সীমানাতেও একটি — তাই সবচেয়ে বেশি। একই কারণে ১০ Mbps Manchester সংকেতে প্রতি সেকেন্ডে ২০ মিলিয়ন অর্ধ-bit (signal element).

উদাহরণ ৩.৭ (মাঝারি) — FDM, T1 আর E1

প্রশ্ন: (ক) ১০০ kHz-এর ৫টি চ্যানেল FDM-এ, পাশাপাশি দুই চ্যানেলের মাঝে ১০ kHz guard band — মোট bandwidth? (খ) T1 frame-এ ২৪টি ৮-bit slot আর ১টি framing bit, প্রতি সেকেন্ডে ৮০০০ frame — rate? (গ) E1-এ ৩২টি ৬৪ kbps slot — rate?

(a) 5 x 100 + 4 x 10 = 540 kHz        (4 gaps between 5 channels, not 5)
(b) (24 x 8 + 1) x 8000 = 193 x 8000 = 1,544,000 bps = 1.544 Mbps
(c) 32 x 64,000 = 2,048,000 bps = 2.048 Mbps

৫৪০ kHz, ১.৫৪৪ Mbps, ২.০৪৮ Mbps. T1-এর ৮ kbps (১ bit × ৮০০০) framing-এর খরচ, তাই ২৪ × ৬৪ = ১.৫৩৬-এর চেয়ে বেশি।

// Physical-layer checker: dB, Nyquist, Shannon, baud, line-code edges, FDM/TDM.
const dB = r => 10 * Math.log10(r), ratio = db => 10 ** (db / 10);
const net = -12 + 20 - 5;                          // dB values along a path simply add
console.log("3.1 net " + net + " dB: 10 mW -> " + (10 * ratio(net)).toFixed(2) + " mW = " +
  (dB(10) + net).toFixed(1) + " dBm");
const nyq = (B, L) => 2 * B * Math.log2(L);        // noiseless channel, L levels
console.log("3.2 B=4 kHz, L=8 -> " + nyq(4000, 8) / 1e3 + " kbps");
const shannon = (B, snrDb) => B * Math.log2(1 + ratio(snrDb));
console.log("3.3 B=1 MHz, 30 dB -> C=" + (shannon(1e6, 30) / 1e6).toFixed(3) +
  " Mbps; levels for 8 Mbps: L=" + 2 ** (8e6 / (2 * 1e6)));
const sn = 2 ** (20e6 / 4e6) - 1;                  // reverse Shannon: SNR for 20 Mbps on 4 MHz
console.log("3.4 SNR needed=" + sn + " = " + dB(sn).toFixed(2) + " dB");
console.log("3.5 16-QAM, 2400 baud=" + 2400 * Math.log2(16) + " bps; 64-QAM, 30 Mbps=" +
  30e6 / Math.log2(64) / 1e6 + " Mbaud");
function wave(bits, scheme) {                      // two half-bit levels per bit, line low at start
  let lvl = 0, prev = 0, e = 0;
  const h = [];
  for (const b of bits) {
    if (scheme === "NRZ-L") h.push(+b, +b);
    if (scheme === "NRZ-I") { if (b === "1") lvl ^= 1; h.push(lvl, lvl); }
    if (scheme === "Manchester") h.push(b === "1" ? 0 : 1, b === "1" ? 1 : 0);
  }
  for (const v of h) { if (v !== prev) e++; prev = v; }
  return h.join("") + "  edges=" + e;
}
for (const sc of ["NRZ-L", "NRZ-I", "Manchester"]) console.log("3.6 " + sc.padEnd(10) + " " + wave("10110010", sc));
console.log("3.7 FDM " + (5 * 100 + 4 * 10) + " kHz; T1 " + (24 * 8 + 1) * 8000 + " bps; E1 " + 32 * 64000 + " bps");

আউটপুট:

3.1 net 3 dB: 10 mW -> 19.95 mW = 13.0 dBm
3.2 B=4 kHz, L=8 -> 24 kbps
3.3 B=1 MHz, 30 dB -> C=9.967 Mbps; levels for 8 Mbps: L=16
3.4 SNR needed=31 = 14.91 dB
3.5 16-QAM, 2400 baud=9600 bps; 64-QAM, 30 Mbps=5 Mbaud
3.6 NRZ-L      1100111100001100  edges=6
3.6 NRZ-I      1111001111110000  edges=4
3.6 Manchester 0110010110100110  edges=10
3.7 FDM 540 kHz; T1 1544000 bps; E1 2048000 bps

৩.১ থেকে ৩.৭ — সব লাইন ওপরের উত্তরের সাথে মেলে। ratio() ফাংশনটিই dB থেকে অনুপাত বানায়; Shannon-এ সরাসরি dB না বসানোর নিয়মটি কোডেই গাঁথা। Line coding-এর লাইনে ১৬টি অর্ধ-bit স্তর ছাপা হয়েছে — খাতার টেবিলের সাথে অক্ষরে অক্ষরে মিলিয়ে নিন।

নিজে করুন — ভাগ ৩

নি ৩.১(সহজ) শক্তির অনুপাত ১০০০ হলে কত dB? আর −৬ dB মানে শক্তি মোটামুটি কত ভাগ?

10 log10 1000 = ৩০ dB. −৬ dB = 10−0.6 ≈ ০.২৫১ — প্রায় এক-চতুর্থাংশ (−৩ dB দুবার, প্রতিবার অর্ধেক)।

নি ৩.২(মাঝারি) ৩ kHz-এর noise-হীন লাইনে ৩৬ kbps পাঠাতে কতটি স্তর লাগবে?

36000 = 2 × 3000 × log2 L ⟹ log2 L = ৬ ⟹ L = ৬৪.

নি ৩.৩(মাঝারি) B = ২০ MHz, SNR = ২৫ dB — Shannon capacity কত?

SNR = 102.5 ≈ ৩১৬.২৩; C = 20 × 106 × log2 317.23 ≈ ১৬৬.২ Mbps.

নি ৩.৪(সহজ) ৪ kHz পর্যন্ত কণ্ঠকে PCM-এ Nyquist হারে sampling করে প্রতি নমুনা ৮ bit-এ রাখলে bit rate কত? কতটি quantization স্তর?

Sampling 2 × 4000 = ৮০০০/s; ৮০০০ × ৮ = ৬৪ kbps (টেলিফোনের সেই চেনা DS0); স্তর 28 = ২৫৬.

৪ · Error detection আর correction — parity, checksum, CRC আর Hamming

সূত্রের কার্ড

Parity: even parity-তে ১-এর মোট সংখ্যা জোড় রাখতে একটি bit; যেকোনো বিজোড় সংখ্যক ভুল ধরে, জোড় সংখ্যক ভুল ধরে না।

Internet checksum: ১৬-bit word-গুলোর one's complement যোগ — ১৬ bit ছাড়ালে carry কেটে নিচে যোগ (end-around carry) — তারপর সব bit উল্টে checksum. প্রাপকের যোগফল (checksum-সহ) 0xFFFF হলে ঠিক।

CRC: generator G-এর degree r (bit সংখ্যা r + 1). ডেটার শেষে r টি ০ জুড়ে modulo-2 ভাগ (প্রতিটি “বিয়োগ” = XOR); ভাগশেষের r bit-ই CRC. প্রাপক পুরো frame ভাগ করে ভাগশেষ ০ পেলে মেনে নেয়।

Hamming: m ডেটা-bit-এ r parity-bit, যেখানে 2r ≥ m + r + 1. Syndrome = যেসব অবস্থানে ১ আছে তাদের নম্বরের XOR; ০ হলে ভুল নেই, নইলে সেটিই ভুলের অবস্থান।

dmin: dmin − 1টি পর্যন্ত ভুল ধরা যায়, ⌊(dmin − 1)/2⌋টি পর্যন্ত সারানো যায়।

উদাহরণ ৪.১ (সহজ) — parity কী ধরে, কী ধরে না

প্রশ্ন: ৭-bit ডেটা 1011001-এর শেষে even parity bit কত? পথে দুটি bit উল্টালে প্রাপক কী বুঝবে?

ones in 1011001 = 4 (even)  -> parity bit 0  -> sent 10110010
2 bits flipped              -> ones still even -> receiver says "OK" (error missed)

Parity bit ০; দুটি ভুলে পরীক্ষা পাস করে যায় — এক-bit parity-র মূল দুর্বলতা। Odd parity হলে উত্তর হতো ১.

উদাহরণ ৪.২ (মাঝারি) — Internet checksum

প্রশ্ন: চারটি ১৬-bit word 0x8F2A, 0x7C15, 0x0FF0, 0xA001-এর Internet checksum কত? প্রাপক কীভাবে যাচাই করবে?

  0x8F2A
+ 0x7C15 = 0x10B3F   (17 bits: carry out)  -> 0x0B3F + 1 = 0x0B40
+ 0x0FF0 = 0x1B30
+ 0xA001 = 0xBB31    (no carry)
checksum = ~0xBB31 = 0x44CE
receiver: 0xBB31 + 0x44CE = 0xFFFF  ->  complement 0x0000  OK

Checksum 0x44CE. প্রথম যোগেই ১৭তম bit-এ carry — সেটি ফেলে দিলে (0x0B3F) শেষ উত্তর এক বেশি আসে (0x44CF). যাচাই হিসেবে দেখুন: যোগফল আর checksum-এর প্রতিটি hex অঙ্কের যোগ F (B + 4, B + 4, 3 + C, 1 + E).

উদাহরণ ৪.৩ (মাঝারি) — CRC-র long division

প্রশ্ন: ডেটা 1101101, generator 1011 (x3 + x + 1). CRC কত, কোন frame যাবে? নিচের stepper-এ প্রতিটি XOR ধাপ।

হিসাবের খাতা (r = 3)
এই ধাপ
কাজের সারি
যে ৪ bit-এ XOR
ভাগফল
  1. প্রস্তুতি। Generator 1011-এ ৪টি bit, তাই r = ৩ — CRC হবে ৩ bit-এর। ডেটার শেষে ৩টি ০ জুড়ে ভাজ্য দাঁড়াল ১০ bit-এর 1101101000. ভাগের ধাপ হবে ডেটার bit-সংখ্যার সমান — ৭টি।
  2. ধাপ ১। সামনের bit ১, তাই ভাগফলে ১ আর প্রথম চার bit 1101-এর সাথে 1011-এর XOR = 0110. সাধারণ ভাগের মতো “বড় না ছোট” তুলনা নেই — সামনের bit ১ হলেই XOR.
  3. ধাপ ২। এবার দ্বিতীয় অবস্থান থেকে চার bit: 1101 আবার — XOR করে 0110. সারি 0011001000, ভাগফল 11.
  4. ধাপ ৩। তৃতীয় অবস্থান থেকে 1100 ⊕ 1011 = 0111. সারি 0001111000.
  5. ধাপ ৪। চতুর্থ অবস্থান থেকে 1111 ⊕ 1011 = 0100. সারি 0000100000.
  6. ধাপ ৫। পঞ্চম অবস্থান থেকে 1000 ⊕ 1011 = 0011. সারি 0000001100, ভাগফল 11111.
  7. ধাপ ৬। ষষ্ঠ অবস্থানের bit ০ — তাই ভাগফলে ০ আর 0000 দিয়ে XOR, অর্থাৎ কিছুই বদলায় না, শুধু পরের bit নামানো। এই ধাপ বাদ দিলে ভাগফলের দৈর্ঘ্য ভুল হয়।
  8. ধাপ ৭ — ভাগশেষ। সপ্তম অবস্থান থেকে 1100 ⊕ 1011 = 0111. ডেটার সব bit শেষ; শেষ তিন bit 111 = CRC, ভাগফল 1111101.
  9. পাঠানো আর যাচাই। শূন্যের জায়গায় CRC বসিয়ে frame 1101101111. প্রাপক পুরো ১০ bit-কে 1011 দিয়ে ভাগ করে ভাগশেষ 000 পায় — গ্রহণ। পথে তৃতীয় bit উল্টালে (1111101111) ভাগশেষ 001 — বাতিল।
উদাহরণ ৪.৪ (মাঝারি) — Hamming(7,4): encode আর সারানো

প্রশ্ন: ডেটা 0110 (d3 d5 d6 d7 ক্রমে) — codeword কত? প্রাপক 1100010 পেলে কী করবে? আর 1000010 পেলে?

positions   1  2  3  4  5  6  7
role       p1 p2 d3 p4 d5 d6 d7
data              0     1  1  0
p1 = d3^d5^d7 = 0^1^0 = 1
p2 = d3^d6^d7 = 0^1^0 = 1
p4 = d5^d6^d7 = 1^1^0 = 0      -> codeword 1100110

received 1100010: ones at 1, 2, 6  -> 1^2^6 = 5 (101) -> flip bit 5 -> 1100110, data 0110
received 1000010: ones at 1, 6     -> 1^6   = 7 (111) -> flip bit 7 -> 1000011, data 0011 (WRONG)

প্রথমটিতে একটি ভুল (অবস্থান ৫), syndrome ঠিক সেটিই দেখায়। দ্বিতীয়টিতে আসলে দুটি ভুল (অবস্থান ২ আর ৫); syndrome ২ ⊕ ৫ = ৭ নির্দোষ bit ৭ উল্টে ভুল ডেটা দেয়। Codeword 1100110; প্রথমটি সারানো যায়, দ্বিতীয়টি ভুলভাবে “সারানো” হয় — dmin = ৩-এর code একসাথে এক ভুল সারানো আর দুই ভুল ধরা পারে না।

উদাহরণ ৪.৫ (মাঝারি → কঠিন) — কতটি parity bit, আর dmin

প্রশ্ন: (ক) ১৬, ২৬ আর ৫৭টি ডেটা-bit-এ একটি ভুল সারাতে ন্যূনতম কতটি parity bit? (খ) Code {00000, 01011, 10101, 11110}-এর dmin কত, কতটি ভুল ধরা আর সারানো যায়?

(a) 2^r >= m + r + 1
    m = 16: r = 5 (32 >= 22)   -> (21,16)
    m = 26: r = 5 (32 >= 32)   -> (31,26)  exactly equal: a "perfect" code
    m = 57: r = 6 (64 >= 64)   -> (63,57)
(b) distances: 01011/10101 = 4, 00000/01011 = 3, 00000/10101 = 3,
    00000/11110 = 4, 01011/11110 = 3, 10101/11110 = 3     -> dmin = 3
    detect up to 2, correct 1

r = ৫, ৫, ৬; dmin = ৩ — দুটি ভুল ধরা, একটি সারানো। ফাঁদ: ২r ≥ m + r + 1-এ “+ r” ভুলে গেলে m = ২৬-এ r = ৫-ই আসে ঠিকই, কিন্তু m = ২৮-এ ভুল উত্তর (৫) আসবে, ঠিক উত্তর ৬.

// Internet checksum (one's complement, end-around carry) and CRC by modulo-2 division.
function onesSum(words, show) {
  let sum = 0;
  for (const w of words) {
    sum += w;
    if (sum > 0xffff) sum = (sum & 0xffff) + 1;     // carry out of bit 16 is added back
    if (show) console.log("   + " + w.toString(16).padStart(4, "0") + " -> " + sum.toString(16).padStart(4, "0"));
  }
  return sum;
}
const words = [0x8f2a, 0x7c15, 0x0ff0, 0xa001], ck = ~onesSum(words, true) & 0xffff;
console.log("4.2 checksum = 0x" + ck.toString(16).padStart(4, "0") +
  "; receiver sum with checksum = 0x" + onesSum([...words, ck], false).toString(16));
function divide(bits, gen, show) {                 // returns the last (gen.length - 1) bits
  const b = bits.split(""), r = gen.length - 1;
  let q = "";
  for (let i = 0; i + r < b.length; i++) {
    q += b[i];
    if (b[i] === "1") for (let j = 0; j <= r; j++) b[i + j] = b[i + j] === gen[j] ? "0" : "1";
    if (show) console.log("   step " + (i + 1) + ": " + b.join(""));
  }
  return { q, rem: b.slice(-r).join("") };
}
const data = "1101101", gen = "1011";              // G(x) = x^3 + x + 1
const { q, rem } = divide(data + "000", gen, true);
const frame = data + rem;
console.log("4.3 quotient " + q + ", CRC " + rem + ", frame " + frame +
  ", receiver remainder " + divide(frame, gen).rem);
const bad = "1111101111";                          // bit 3 of the frame flipped on the way
console.log("4.3 received " + bad + " -> remainder " + divide(bad, gen).rem);

আউটপুট:

   + 8f2a -> 8f2a
   + 7c15 -> 0b40
   + 0ff0 -> 1b30
   + a001 -> bb31
4.2 checksum = 0x44ce; receiver sum with checksum = 0xffff
   step 1: 0110101000
   step 2: 0011001000
   step 3: 0001111000
   step 4: 0000100000
   step 5: 0000001100
   step 6: 0000001100
   step 7: 0000000111
4.3 quotient 1111101, CRC 111, frame 1101101111, receiver remainder 000
4.3 received 1111101111 -> remainder 001

Checksum অংশে দ্বিতীয় লাইনে 0b40 — carry নিচে যোগ হওয়ার পরের মান; শেষে 0x44ce আর প্রাপকের যোগফল 0xffff. CRC অংশের সাতটি “step” লাইন stepper-এর সাতটি সারির হুবহু; ভাগফল 1111101, CRC 111. divide() একই ফাংশন প্রেরক (ডেটা + 000) আর প্রাপক (পুরো frame) দুই দিকেই চলে — শুধু ইনপুট আলাদা। data আর gen বদলে নিজের বইয়ের CRC মিলিয়ে নিন।

// Hamming(7,4) with parity at positions 1, 2, 4 (even parity); data bits go to 3, 5, 6, 7.
function encode(d) {
  const c = [0, 0, 0, +d[0], 0, +d[1], +d[2], +d[3]];
  for (const p of [1, 2, 4]) {
    let x = 0;
    for (let k = 1; k <= 7; k++) if (k & p && k !== p) x ^= c[k];
    c[p] = x;
  }
  return c.slice(1).join("");
}
const syndrome = w => [...w].reduce((s, bit, i) => (bit === "1" ? s ^ (i + 1) : s), 0);
const flip = (w, k) => w.slice(0, k - 1) + (w[k - 1] === "1" ? "0" : "1") + w.slice(k);
const cw = encode("0110");
console.log("4.4 data 0110 -> codeword " + cw + ", syndrome " + syndrome(cw));
for (const r of ["1100010", "1000110", "1000010"]) {
  const s = syndrome(r), fixed = s ? flip(r, s) : r;
  console.log("    received " + r + " syndrome " + s.toString(2).padStart(3, "0") + " (" + s +
    ") -> " + fixed + ", data " + fixed[2] + fixed[4] + fixed[5] + fixed[6]);
}
for (const m of [16, 26, 57]) {                    // smallest r with 2^r >= m + r + 1
  let r = 1;
  while (2 ** r < m + r + 1) r++;
  console.log("4.5 m=" + m + " -> r=" + r + ", (" + (m + r) + "," + m + ") code");
}
const code = ["00000", "01011", "10101", "11110"];
let dmin = 99;
for (let i = 0; i < code.length; i++) for (let j = i + 1; j < code.length; j++)
  dmin = Math.min(dmin, [...code[i]].filter((b, k) => b !== code[j][k]).length);
console.log("4.5 dmin=" + dmin + ": detects " + (dmin - 1) + ", corrects " + Math.floor((dmin - 1) / 2));

আউটপুট:

4.4 data 0110 -> codeword 1100110, syndrome 0
    received 1100010 syndrome 101 (5) -> 1100110, data 0110
    received 1000110 syndrome 010 (2) -> 1100110, data 0110
    received 1000010 syndrome 111 (7) -> 1000011, data 0011
4.5 m=16 -> r=5, (21,16) code
4.5 m=26 -> r=5, (31,26) code
4.5 m=57 -> r=6, (63,57) code
4.5 dmin=3: detects 2, corrects 1

প্রথম লাইন: codeword 1100110 আর তার syndrome ০ — বৈধ। পরের তিন লাইন: অবস্থান ৫ আর ২-এর এক-একটি ভুল ঠিকমতো সারে; তৃতীয়টিতে (দুই ভুল) syndrome ৭ ভুল সারায় আর ডেটা হয় 0011. syndrome এক লাইনের reduce — “যেখানে ১, তার অবস্থানের XOR” নিয়মটিই। শেষ অংশ উদাহরণ ৪.৫-এর r আর dmin.

নিজে করুন — ভাগ ৪

নি ৪.১(মাঝারি) দুটি word 0xABCD আর 0x6789-এর Internet checksum কত?

0xABCD + 0x6789 = 0x11356 → carry নিচে: 0x1356 + 1 = 0x1357 → উল্টে 0xECA8. যাচাই: 0x1357 + 0xECA8 = 0xFFFF.

নি ৪.২(মাঝারি) ডেটা 100100, generator 1101 — CRC আর পাঠানো frame?

r = ৩; 100100000 ÷ 1101-এর ভাগশেষ 001; frame 100100001. ক্যালকুলেটরে data = "100100", gen = "1101" দিয়ে মিলিয়ে নিন।

নি ৪.৩(কঠিন) Hamming(7,4) (এই পাতার নিয়মে) প্রাপক পেল 1011011. Syndrome, ঠিক codeword আর ডেটা কত (একটির বেশি ভুল নেই ধরে)?

১ আছে অবস্থান ১, ৩, ৪, ৬, ৭-এ: 1 ⊕ 3 ⊕ 4 ⊕ 6 ⊕ 7 = ৭ (111). Bit ৭ উল্টে 1011010; ডেটা (৩, ৫, ৬, ৭) = 1010. যাচাই: 1 ⊕ 3 ⊕ 4 ⊕ 6 = ০.

নি ৪.৪(সহজ) একটি code-এর dmin = ৫. সর্বোচ্চ কতটি ভুল নিশ্চিতভাবে ধরা যায়, কতটি সারানো যায়?

ধরা ৪টি, সারানো ⌊৪/২⌋ = ২টি.

৫ · Data link — bit stuffing, ARQ-এর efficiency, ALOHA আর CSMA/CD

সূত্রের কার্ড

Bit stuffing (HDLC, flag 01111110): পরপর পাঁচটি ১-এর পরে একটি ০ ঢোকানো; প্রাপক পাঁচ ১-এর পরের ০ সরিয়ে ফেলে।

Stop-and-wait: a = Tprop/Ttrans, U = 1/(1 + 2a); frame নষ্টের সম্ভাবনা p হলে U = (1 − p)/(1 + 2a). Throughput = U × R.

Sliding window: ত্রুটিহীন U = min(1, W/(1 + 2a)); পুরো ব্যবহারে W ≥ 1 + 2a. m-bit sequence নম্বর-এ Go-Back-N-এর W ≤ 2m − 1, Selective Repeat-এর W ≤ 2m−1.

ALOHA: G = প্রতি frame-সময়ে চেষ্টা। Pure: S = G e−2G, সর্বোচ্চ ১/(২e) ≈ ০.১৮৪ (G = ০.৫); slotted: S = G e−G, সর্বোচ্চ ১/e ≈ ০.৩৬৮ (G = ১)। Vulnerable period pure-এ ২T, slotted-এ T.

CSMA/CD: ন্যূনতম frame Lmin = 2 · R · Tprop; আসন্ন efficiency ≈ 1/(1 + 5a); backoff-এ n-তম collision-এর পর K ∈ {0, …, 2min(n,10) − 1}, অপেক্ষা K × slot time (১০ Mbps-এ ৫১.২ µs).

উদাহরণ ৫.১ (সহজ) — bit stuffing

প্রশ্ন: HDLC frame-এর ডেটা অংশ 0111111011111100. Stuffing-এর পর তারে কী যাবে?

0 11111 [0] 1 0 11111 [0] 1 0 0
=> 011111010111110100     (16 bits became 18)

দুই জায়গায় পাঁচটি ১ পূর্ণ হয়েছে, তাই দুটি বাড়তি ০. গোনা আবার শুরু হয় ঢোকানো ০-এর পরে। উত্তর 011111010111110100. ফাঁদ: “ছয়টি ১ পেলে ০” ভাবা — নিয়ম পাঁচটির পরেই, যাতে ডেটায় কখনো 01111110 (flag) তৈরি না হয়।

উদাহরণ ৫.২ (মাঝারি) — stop-and-wait-এর efficiency

প্রশ্ন: ১০০০ byte-এর frame, ২ Mbps link, দৈর্ঘ্য ১৫০০ km (s = 2 × 108 m/s). Stop-and-wait-এ U আর throughput কত? Frame নষ্টের সম্ভাবনা ০.১ হলে?

T_trans = 8000 / (2 x 10^6) = 4 ms
T_prop  = 1.5 x 10^6 / 2 x 10^8 = 7.5 ms       a = 7.5 / 4 = 1.875
U = 1 / (1 + 2a) = 1 / 4.75 = 0.2105 -> 21.05%   throughput = 0.2105 x 2 Mbps = 421 kbps
p = 0.1: U = 0.9 / 4.75 = 0.1895 -> 18.95%

প্রতি ১৯ ms-এর চক্রে link মাত্র ৪ ms কাজ করে। U ≈ ২১.০৫%, প্রায় ৪২১ kbps; ত্রুটিসহ ১৮.৯৫%. ফাঁদ: a-কে উল্টে Ttrans/Tprop ধরা, বা ২-এর গুণ বাদ দেওয়া (ACK-কেও ফিরতে হয়)।

উদাহরণ ৫.৩ (মাঝারি) — window আর sequence-এর bit

প্রশ্ন: উদাহরণ ৫.২-এর link পুরো ব্যবহার করতে ন্যূনতম window কত? GBN আর SR-এ কত bit-এর sequence নম্বর লাগবে? ২ bit-এর নম্বরে GBN চালালে U কত?

W >= 1 + 2a = 4.75  ->  W = 5
GBN: 2^m - 1 >= 5  -> m = 3 (W up to 7)
SR : 2^(m-1) >= 5  -> m = 4 (W up to 8)
m = 2, GBN: W = 3  -> U = 3 / 4.75 = 63.16%

W = ৫; GBN-এ ৩ bit, SR-এ ৪ bit; m = ২-এ U ≈ ৬৩.২%. SR-এর সীমা অর্ধেক কেন: প্রাপকের window-ও W, তাই পুরোনো আর নতুন frame-এর নম্বর যেন একই window-এ না পড়ে।

উদাহরণ ৫.৪ (কঠিন) — উপগ্রহ link

প্রশ্ন: ১ Mbps-এর geostationary উপগ্রহ link, একমুখী propagation ২৭০ ms, frame ১০০০ byte. Stop-and-wait-এর U, আর পুরো ব্যবহারের জন্য GBN ও SR-এর sequence bit?

T_trans = 8000 / 10^6 = 8 ms     a = 270 / 8 = 33.75     1 + 2a = 68.5
stop-and-wait: U = 1 / 68.5 = 1.46%
W >= 68.5 -> W = 69:  GBN m = 7 (127 >= 69)    SR m = 8 (128 >= 69)

U ≈ ১.৪৬%; GBN-এ ৭ bit, SR-এ ৮ bit. একারণেই HDLC-তে ৩ bit-এর পাশাপাশি ৭ bit-এর “extended” নম্বর রাখা হয়েছিল (পর্ব ১০)।

উদাহরণ ৫.৫ (মাঝারি) — GBN বনাম SR-এ কতটি frame আবার যায়

প্রশ্ন: Window ৪, প্রেরক frame 0, 1, 2, 3 পরপর পাঠাল; frame 1 পথে হারাল, বাকিগুলো পৌঁছাল, কোনো ACK হারায়নি। Timeout-এর পর GBN আর SR কোন কোন frame আবার পাঠায়?

GBN receiver: accepts 0, discards 2 and 3 (out of order), keeps ACKing "expect 1"
GBN sender  : timeout on 1 -> resends 1, 2, 3    (3 frames)
SR receiver : accepts 0, buffers 2 and 3, ACKs them individually
SR sender   : timeout on 1 -> resends 1 only     (1 frame)

GBN-এ ৩টি, SR-এ ১টি। লম্বা link আর বড় window-এ এই পার্থক্য অনেক বড় হয় — প্রতিটি ত্রুটিতে GBN প্রায় পুরো এক round trip-এর frame আবার পাঠায়।

উদাহরণ ৫.৬ (মাঝারি) — ALOHA-র throughput

প্রশ্ন: ১০০ kbps-এর ভাগ করা চ্যানেল, প্রতিটি frame ৫০০ bit. সব station মিলে প্রতি সেকেন্ডে (ক) ১০০টি, (খ) ২০০টি frame পাঠানোর চেষ্টা করে। Pure আর slotted ALOHA-তে প্রতি সেকেন্ডে কতটি frame সফল?

T = 500 / 10^5 = 5 ms  -> channel can carry 200 frames/s
(a) G = 100 x 0.005 = 0.5   pure   S = 0.5 e^-1   = 0.1839 -> 0.1839 x 200 = 36.8 frames/s
                            slotted S = 0.5 e^-0.5 = 0.3033 -> 60.7 frames/s
(b) G = 1                   pure   S = e^-2 = 0.1353       -> 27.1 frames/s
                            slotted S = e^-1 = 0.3679       -> 73.6 frames/s
vulnerable period: pure 2T = 10 ms, slotted T = 5 ms

লক্ষ করুন: (খ)-তে চেষ্টা দ্বিগুণ করেও pure ALOHA-র সফল frame কমে গেল (৩৬.৮ → ২৭.১) — চূড়া G = ০.৫ পেরিয়ে গেছে। Slotted ঠিক তার চূড়ায় (G = ১)। ফাঁদ: S-কে সরাসরি “frame/s” ধরা — S প্রতি frame-সময়ের হিসাব, তাই ২০০ দিয়ে গুণ করতে হয়।

উদাহরণ ৫.৭ (মাঝারি → কঠিন) — CSMA/CD-র ন্যূনতম frame, দূরত্ব আর efficiency

প্রশ্ন: (ক) ১০০ Mbps, দুই প্রান্তের দূরত্ব ১০০০ m — ন্যূনতম frame? (খ) ১ Gbps-এ ৬৪ byte (৫১২ bit) রাখলে তারের হিসাবে সর্বোচ্চ দূরত্ব? (গ) ১০ Mbps, ১০০০ m, ১৫০০ byte-এর frame-এ আসন্ন efficiency? (ঘ) তৃতীয় collision-এর পর সর্বোচ্চ অপেক্ষা (১০ Mbps)?

(a) T_prop = 1000 / 2 x 10^8 = 5 us;  L_min = 2 x 10^8 x 5 x 10^-6 = 1000 bit = 125 byte
(b) 2 T_prop <= 512 / 10^9 = 512 ns  ->  T_prop <= 256 ns  ->  d <= 256 ns x 2 x 10^8 = 51.2 m
(c) a = 5 us / 1.2 ms = 0.004167;  efficiency = 1 / (1 + 5a) = 97.96%
(d) after collision 3: K in {0..7};  longest wait 7 x 51.2 us = 358.4 us

১২৫ byte; ৫১.২ m; ≈ ৯৮%; ৩৫৮.৪ µs. (খ) দেখায় কেন gigabit-এ half-duplex CSMA/CD প্রায় অর্থহীন — repeater-এর delay ধরলে বাস্তব সীমা আরও ছোট। (গ)-তে “আসন্ন” শব্দটি লিখবেন; সূত্রটি একটি সরল মডেলের ফল।

// Data-link checker: bit stuffing, ARQ utilisation and sequence bits, ALOHA, CSMA/CD.
console.log("5.1 stuffed: " + "0111111011111100".replace(/11111/g, "111110"));
function arq(Lbits, R, Tp, p = 0) {                // Tp = one-way propagation delay (s)
  const Tt = Lbits / R, a = Tp / Tt, W = Math.ceil(1 + 2 * a);
  let g = 1, s = 1;
  while (2 ** g - 1 < W) g++;                      // Go-Back-N: W <= 2^m - 1
  while (2 ** (s - 1) < W) s++;                    // Selective Repeat: W <= 2^(m-1)
  console.log("    Tt=" + Tt * 1e3 + " ms a=" + a + " S&W U=" + (100 * (1 - p) / (1 + 2 * a)).toFixed(2) +
    "% | W for 100%=" + W + ", GBN m=" + g + ", SR m=" + s);
  return a;
}
console.log("5.2/5.3 1000 B, 2 Mbps, 1500 km:");
const a = arq(8000, 2e6, 1500e3 / 2e8);
console.log("    GBN with m=2 (W=3): U=" + (100 * Math.min(1, 3 / (1 + 2 * a))).toFixed(2) + "%");
console.log("5.4 1000 B, 1 Mbps, satellite 270 ms:");
arq(8000, 1e6, 0.270);
console.log("5.2 same link with p=0.1:");
arq(8000, 2e6, 1500e3 / 2e8, 0.1);
const T = 500 / 100e3;                             // ALOHA: 500-bit frames on 100 kbps
for (const perSec of [100, 200]) {
  const G = perSec * T;
  console.log("5.6 " + perSec + " frames/s: G=" + G + " pure " + (G * Math.exp(-2 * G) / T).toFixed(1) +
    " ok/s, slotted " + (G * Math.exp(-G) / T).toFixed(1) + " ok/s");
}
console.log("5.7 Lmin=" + Math.round(2 * 100e6 * (1000 / 2e8)) + " bits; 512 bits at 1 Gbps covers " +
  512 / 1e9 / 2 * 2e8 + " m; eff=" + (100 / (1 + 5 * (1000 / 2e8) / (12000 / 10e6))).toFixed(2) + "%");
console.log("5.7 3rd collision: K in 0.." + (2 ** 3 - 1) + ", longest wait " + (7 * 51.2).toFixed(1) + " us");

আউটপুট:

5.1 stuffed: 011111010111110100
5.2/5.3 1000 B, 2 Mbps, 1500 km:
    Tt=4 ms a=1.875 S&W U=21.05% | W for 100%=5, GBN m=3, SR m=4
    GBN with m=2 (W=3): U=63.16%
5.4 1000 B, 1 Mbps, satellite 270 ms:
    Tt=8 ms a=33.75 S&W U=1.46% | W for 100%=69, GBN m=7, SR m=8
5.2 same link with p=0.1:
    Tt=4 ms a=1.875 S&W U=18.95% | W for 100%=5, GBN m=3, SR m=4
5.6 100 frames/s: G=0.5 pure 36.8 ok/s, slotted 60.7 ok/s
5.6 200 frames/s: G=1 pure 27.1 ok/s, slotted 73.6 ok/s
5.7 Lmin=1000 bits; 512 bits at 1 Gbps covers 51.2 m; eff=97.96%
5.7 3rd collision: K in 0..7, longest wait 358.4 us

arq() একটি link-এর জন্য a, stop-and-wait-এর U, পুরো ব্যবহারের window আর দুই protocol-এর sequence bit একসাথে দেয় — ৫.২, ৫.৩ আর ৫.৪-এর সব সংখ্যা এখানে। Bit stuffing এক লাইনের replace: “১১১১১” পেলেই পেছনে একটি ০ — regex-এর মিল একটির পর একটি, না জড়িয়ে খোঁজা হয়, তাই ঢোকানো ০-এর পরে গোনা আপনা থেকেই নতুন করে শুরু হয়। ALOHA-র লাইনে ৩৬.৮/৬০.৭ আর ২৭.১/৭৩.৬, CSMA/CD-তে ১০০০ bit, ৫১.২ m আর ৯৭.৯৬%.

নিজে করুন — ভাগ ৫

নি ৫.১(সহজ) HDLC প্রাপক ডেটা অংশে পেল 01111101111100. Destuffing-এর পর আসল ডেটা কী?

দুবার পাঁচটি ১-এর পরের ০ সরে যায়: 011111111110 (১৪ bit থেকে ১২ bit).

নি ৫.২(মাঝারি) a = ৫, ৩ bit-এর sequence নম্বর। GBN আর SR-এর সর্বোচ্চ window-এ ত্রুটিহীন U কত?

1 + 2a = ১১. GBN: W = ৭ → ৭/১১ ≈ ৬৩.৬%; SR: W = ৪ → ৪/১১ ≈ ৩৬.৪%. একই bit-সংখ্যায় SR-এর window ছোট — এটাই তার দাম।

নি ৫.৩(মাঝারি) Slotted ALOHA, ৫টি station, প্রত্যেকে প্রতি slot-এ ০.২ সম্ভাবনায় পাঠায়। একটি slot সফল হওয়ার সম্ভাবনা কত?

ঠিক একজন পাঠাবে: S = Np(1 − p)N−1 = 5 × 0.2 × 0.84 = ০.৪০৯৬. এখানে p = ১/N, তাই এটাই ৫ station-এর সর্বোচ্চ — ১/e (০.৩৬৮)-এর চেয়ে বেশি, কারণ N ছোট।

নি ৫.৪(কঠিন) ১ Gbps half-duplex-এ ন্যূনতম frame ৫১২ byte ধরা হলে (gigabit-এর carrier extension) তারের হিসাবে সর্বোচ্চ দূরত্ব কত?

৫১২ byte = ৪০৯৬ bit → ৪.০৯৬ µs ≥ 2Tprop → Tprop ≤ ২.০৪৮ µs → d ≤ ২.০৪৮ µs × 2 × 108 = ৪০৯.৬ m. ৬৪ byte রাখলে মাত্র ৫১.২ m হতো — তাই frame বাড়ানোর কৌশল।

৬ · IPv4 — subnetting, VLSM, summarisation আর fragmentation

সূত্রের কার্ড — block size পদ্ধতি

১. Prefix থেকে mask; যে octet-এ prefix শেষ হয় (২৫৫ বা ০ নয়), সেটিই “আগ্রহের octet”. ২. Block size = ২৫৬ − সেই octet-এর mask-মান। ৩. Host-এর মানের ঠিক নিচের block-গুণিতক = network; পরের গুণিতক − ১ = broadcast. ৪. ব্যবহারযোগ্য host = 2h − 2.

FLSM: s bit ধার → 2s subnet. VLSM: প্রতিটি চাহিদার ছোট্টতম block, বড় থেকে ছোট সাজিয়ে, প্রতিটি নিজের মাপের গুণিতকে। Summarisation: সব নেটওয়ার্কের সাধারণ prefix; summary-র মাপ তালিকার মোটের চেয়ে বড় হলে বাড়তি জায়গাও ঢেকে যায়। Wildcard = 255.255.255.255 − mask.

Fragmentation: প্রতি টুকরোর ডেটা P = ⌊(MTU − H)/8⌋ × 8; টুকরো = ⌈D/P⌉; offset ৮ byte-এর এককে; শেষটি ছাড়া সবার MF = ১.

উদাহরণ ৬.১ (সহজ) — দ্বিতীয় ধাপের octet-এ /20

প্রশ্ন: 172.16.45.200/20 — network, broadcast, প্রথম ও শেষ ব্যবহারযোগ্য ঠিকানা আর host-সংখ্যা।

/20 = 8 + 8 + 4  -> third octet, mask 255.255.240.0,  block = 256 - 240 = 16
ladder 0, 16, 32, 48 ...   45 lies in 32..47
network   172.16.32.0         broadcast 172.16.47.255
usable    172.16.32.1 - 172.16.47.254        hosts 2^12 - 2 = 4094

ফাঁদ: তৃতীয় octet-এ হিসাব হলেও broadcast-এর চতুর্থ octet ২৫৫ (host অংশের সব bit ১), আর network-এর চতুর্থ octet ০. উত্তর 172.16.32.0, 172.16.47.255, .32.1–.47.254, ৪০৯৪টি।

উদাহরণ ৬.২ (সহজ) — চতুর্থ octet-এ /27

প্রশ্ন: 10.20.30.77/27-এর network আর broadcast?

mask 255.255.255.224, block 32: 0, 32, 64, 96 ...  77 in 64..95
network 10.20.30.64    broadcast 10.20.30.95    usable .65 - .94 (30 hosts)

10.20.30.64 আর 10.20.30.95. Binary AND দিয়ে যাচাই: 77 = 01001101, 224 = 11100000, AND = 01000000 = ৬৪ — মিলেছে।

উদাহরণ ৬.৩ (মাঝারি) — FLSM: সমান মাপের subnet

প্রশ্ন: 198.51.100.0/24-কে অন্তত ৫টি সমান subnet-এ ভাগ করতে হবে, যতটা সম্ভব বেশি host রেখে। নতুন prefix, subnet-প্রতি host, আর ষষ্ঠ subnet-এর পরিসর কত?

2^s >= 5  -> s = 3  -> /27, 8 subnets, 32 addresses, 30 hosts each
subnets: .0, .32, .64, .96, .128, .160, .192, .224
6th (index 5): 5 x 32 = 160 -> 198.51.100.160/27, usable .161 - .190, broadcast .191

/27, ৩০ host, ষষ্ঠটি 198.51.100.160/27. ফাঁদ: “ষষ্ঠ” মানে index ৫ — প্রথম subnet-এর index ০.

উদাহরণ ৬.৪ (মাঝারি) — host থেকে prefix, তারপর subnet-সংখ্যা

প্রশ্ন: 172.16.0.0/16 থেকে এমন subnet চাই, যার প্রতিটিতে অন্তত ৫০টি host. প্রতিটির prefix কত, আর মোট কতটি subnet হয়?

2^h - 2 >= 50  -> h = 6 (62 hosts)  -> prefix 32 - 6 = /26
borrowed bits = 26 - 16 = 10  -> 2^10 = 1024 subnets

/26, ১০২৪টি subnet. h = ৫ নিলে ৩০টি host — চাহিদার কম; “− ২” ভুলে গেলে ২৫ = ৩২ দেখে ভুল করে /27 বেছে ফেলতে পারেন।

উদাহরণ ৬.৫ (সহজ) — একই subnet কি না

প্রশ্ন: 192.168.5.130/25 আর 192.168.5.120/25 কি সরাসরি (router ছাড়া) কথা বলতে পারে?

/25 -> block 128:  0..127 and 128..255
130 -> network 192.168.5.128      120 -> network 192.168.5.0      different

না — দুটি আলাদা subnet; packet default gateway হয়ে যাবে। “একই /24-এ দেখাচ্ছে” ভেবে হ্যাঁ বলা সাধারণ ভুল।

উদাহরণ ৬.৬ (কঠিন) — VLSM: একটি /22-এ পুরো অফিস

প্রশ্ন: ঠিকানার block 10.10.0.0/22. চাহিদা: A ৩০০ host, B ২০০, C ১০০, D ৫০, E ২৫, আর তিনটি point-to-point WAN link (প্রতিটিতে ২টি host). VLSM দিয়ে বরাদ্দ করুন, শেষে কতটি ঠিকানা খালি থাকে।

বরাদ্দের খাতা (মূল block 10.10.0.0 – 10.10.3.255, ১০২৪টি ঠিকানা)
এই ধাপ
Block
বরাদ্দ
পরের খালি ঠিকানা
  1. মাপ ঠিক করা। প্রতিটি চাহিদার জন্য 2h − 2 ≥ host: ৩০০ → ৫১০ (/23), ২০০ → ২৫৪ (/24), ১০০ → ১২৬ (/25), ৫০ → ৬২ (/26), ২৫ → ৩০ (/27), প্রতিটি WAN → ২ (/30). মোট ১০০৪ ≤ ১০২৪ — কাগজে আঁটে।
  2. A — সবচেয়ে বড়টি আগে। শুরু 10.10.0.0, মাপ ৫১২ — দুটি পূর্ণ /24 জুড়ে: 10.10.0.0/23, শেষ ঠিকানা 10.10.1.255. লক্ষ করুন 10.10.0.255 বা 10.10.1.0 এখানে সাধারণ host ঠিকানা।
  3. B. পরের খালি 10.10.2.0, যা ২৫৬-এর গুণিতক — সরাসরি বসে: 10.10.2.0/24.
  4. C. 10.10.3.0/25 — ১২৮-এর গুণিতক। Broadcast 10.10.3.127.
  5. D. 10.10.3.128/26 — ৬৪-এর গুণিতক (১২৮)। Host .129–.190.
  6. E. 10.10.3.192/27 — ৩২-এর গুণিতক (১৯২)। Host .193–.222.
  7. তিনটি WAN. .224/30, .228/30, .232/30 — প্রতিটিতে দুটি ব্যবহারযোগ্য ঠিকানা, দুই router-এর দুই প্রান্ত। Point-to-point link-এ /31 ব্যবহার করলে (RFC 3021) আরও ৬টি ঠিকানা বাঁচত।
  8. যাচাই। ব্যবহার ১০০৪, খালি 10.10.3.236 থেকে .255 — ২০টি ঠিকানা. বড় থেকে ছোট সাজানোয় কোনো block-কে সীমানায় আনতে ফাঁক রাখতে হয়নি। ছোটটি আগে বসালে (যেমন E আগে 10.10.0.0/27) A আর 10.10.0.0-তে বসতে পারত না, আর ফাঁক তৈরি হতো।
উদাহরণ ৬.৭ (মাঝারি → কঠিন) — summarisation, নিখুঁত আর বাড়তি

প্রশ্ন: (ক) 192.168.96.0/24 থেকে 192.168.103.0/24 — আটটি নেটওয়ার্কের summary? (খ) 10.4.20.0/24, 10.4.21.0/24, 10.4.22.0/24 আর 10.4.24.0/24-এর সবচেয়ে ছোট এক-লাইনের summary কী, আর তাতে সমস্যা কী?

(a) third octet: 96 = 01100 000 ... 103 = 01100 111   common 5 bits -> 16 + 5 = /21
    192.168.96.0/21 covers 96..103 = exactly the 8 networks
(b) 20 = 0001 0100   21 = 0001 0101   22 = 0001 0110   24 = 0001 1000
    common bits: 0001 (4)  -> /20 -> 10.4.16.0/20 covers 16..31 (16 networks, 4 listed)

(ক) 192.168.96.0/21 — নিখুঁত। (খ) 10.4.16.0/20 — তালিকার চারটির সাথে আরও বারোটি /24 (যেমন 10.4.16–19, 23, 25–31) ঢেকে যায়। সেই ঠিকানা অন্য কোথাও থাকলে ট্রাফিক ভুল দিকে যেতে পারে। নিখুঁত রাখতে চাইলে তিনটি লাইন লাগে: 10.4.20.0/23 (২০–২১), 10.4.22.0/24 আর 10.4.24.0/24.

উদাহরণ ৬.৮ (মাঝারি) — fragmentation

প্রশ্ন: ২৪০০ byte-এর একটি IPv4 datagram (header ২০ byte, option নেই, DF = ০) MTU ৬২০-এর link-এ যাবে। প্রতিটি টুকরোর Total Length, ডেটা, offset আর MF?

D = 2400 - 20 = 2380      P = floor((620 - 20) / 8) x 8 = 600      pieces = ceil(2380/600) = 4
#   total   data   offset (x8)   offset (bytes)   MF
1    620     600        0              0          1
2    620     600       75            600          1
3    620     600      150           1200          1
4    600     580      225           1800          0
check: 600 + 600 + 600 + 580 = 2380

Offset ৮-byte এককে, তাই ৬০০ ÷ ৮ = ৭৫. চারটি টুকরো, offset ০, ৭৫, ১৫০, ২২৫. ফাঁদ: ৬২০ − ২০ = ৬০০ এখানে ৮-এর গুণিতক বলে সমস্যা হয়নি; MTU ৬২৫ হলেও P = ৬০০ — ৬০৫ নয়।

উদাহরণ ৬.৯ (কঠিন) — টুকরোর আবার টুকরো

প্রশ্ন: ৪০২০ byte-এর datagram (৪০০০ byte ডেটা) প্রথমে MTU ১৫০০-এর link-এ, তারপর প্রথম টুকরোটি MTU ৫৭৬-এর link-এ যায়। দুই ধাপের টুকরোগুলো লিখুন।

step 1, MTU 1500: P = 1480
   [1500, data 1480, off 0, MF 1]  [1500, data 1480, off 185, MF 1]  [1060, data 1040, off 370, MF 0]
step 2, first piece (data 1480, off 0, MF 1) on MTU 576: P = floor(556/8) x 8 = 552
   [572, data 552, off 0, MF 1]  [572, data 552, off 69, MF 1]  [396, data 376, off 138, MF 1]

দুটি সূক্ষ্ম বিষয়: (১) দ্বিতীয় ধাপের শেষ টুকরোরও MF = ১, কারণ মূল datagram-এর আরও অংশ (offset ১৮৫ থেকে) বাকি; (২) offset গোনা হয় মূল datagram-এর শুরু থেকে — তাই প্রথম টুকরোর ভাঙা অংশের offset ০, ৬৯, ১৩৮. প্রাপক সব টুকরো সরাসরি মূল offset দিয়ে জোড়া লাগায়; router কখনো জোড়া লাগায় না।

// Subnet calculator: network, broadcast, usable range; same-subnet test; summarisation.
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(s => Math.floor(n / 2 ** s) % 256).join(".");
function info(cidr) {
  const [ip, p] = cidr.split("/"), size = 2 ** (32 - p), x = toInt(ip);
  const net = x - (x % size);                      // = ip AND mask
  return { net, bc: net + size - 1, size, p: +p };
}
for (const c of ["172.16.45.200/20", "10.20.30.77/27", "192.168.5.130/25", "192.168.5.120/25"]) {
  const r = info(c);
  console.log(c.padEnd(17) + " net " + toIp(r.net) + "  bc " + toIp(r.bc) + "  usable " +
    toIp(r.net + 1) + " - " + toIp(r.bc - 1) + "  hosts " + (r.size - 2));
}
const k = 5, base = info("198.51.100.0/27");       // the 6th /27 (index 5) of 198.51.100.0/24
console.log("6.3 subnet #" + (k + 1) + ": " + toIp(base.net + k * 32) + "/27, bc " + toIp(base.net + k * 32 + 31));
function summarise(list) {
  const nets = list.map(info);
  let p = 32;
  while (new Set(nets.map(n => n.net - (n.net % 2 ** (32 - p)))).size > 1) p--;
  const s = info(toIp(nets[0].net) + "/" + p);
  const listed = nets.reduce((t, n) => t + n.size, 0);
  console.log("6.7 " + list.length + " nets " + list[0] + " .. " + list[list.length - 1] + "\n    -> " + toIp(s.net) + "/" + p + " covers " + s.size +
    " addresses, listed " + listed + (s.size > listed ? "  (covers extra space!)" : "  (exact)"));
}
summarise(["192.168.96.0/24", "192.168.97.0/24", "192.168.98.0/24", "192.168.99.0/24",
  "192.168.100.0/24", "192.168.101.0/24", "192.168.102.0/24", "192.168.103.0/24"]);
summarise(["10.4.20.0/24", "10.4.21.0/24", "10.4.22.0/24", "10.4.24.0/24"]);
console.log("6.x wildcard of /21: " + toIp(2 ** (32 - 21) - 1));

আউটপুট:

172.16.45.200/20  net 172.16.32.0  bc 172.16.47.255  usable 172.16.32.1 - 172.16.47.254  hosts 4094
10.20.30.77/27    net 10.20.30.64  bc 10.20.30.95  usable 10.20.30.65 - 10.20.30.94  hosts 30
192.168.5.130/25  net 192.168.5.128  bc 192.168.5.255  usable 192.168.5.129 - 192.168.5.254  hosts 126
192.168.5.120/25  net 192.168.5.0  bc 192.168.5.127  usable 192.168.5.1 - 192.168.5.126  hosts 126
6.3 subnet #6: 198.51.100.160/27, bc 198.51.100.191
6.7 8 nets 192.168.96.0/24 .. 192.168.103.0/24
    -> 192.168.96.0/21 covers 2048 addresses, listed 2048  (exact)
6.7 4 nets 10.4.20.0/24 .. 10.4.24.0/24
    -> 10.4.16.0/20 covers 4096 addresses, listed 1024  (covers extra space!)
6.x wildcard of /21: 0.0.7.255

info()-এর মূল লাইন x - (x % size) — ঠিকানাকে block-এর নিচের গুণিতকে নামানো, যা mask দিয়ে AND করারই সমান (পর্ব ১৭-এর প্রমাণ)। প্রথম চার লাইন উদাহরণ ৬.১, ৬.২ আর ৬.৫; তারপর ৬.৩-এর ষষ্ঠ subnet. summarise() prefix এক এক করে ছোট করে যতক্ষণ না সব নেটওয়ার্ক একই block-এ পড়ে, তারপর মোট মাপ তুলনা করে — দ্বিতীয় তালিকায় “covers extra space!” সতর্কবার্তা ঠিক উদাহরণ ৬.৭(খ)-এর সমস্যাটি। শেষ লাইন /21-এর wildcard 0.0.7.255.

// VLSM planner (largest block first, each block aligned to its size) + IPv4 fragmentation.
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(s => Math.floor(n / 2 ** s) % 256).join(".");
function vlsm(base, reqs) {
  console.log("6.6 VLSM in " + base + ":");
  const [ip, bp] = base.split("/"), start = toInt(ip), end = start + 2 ** (32 - bp);
  let next = start;
  for (const [name, hosts] of [...reqs].sort((a, b) => b[1] - a[1])) {
    let p = 30;
    while (2 ** (32 - p) - 2 < hosts) p--;         // smallest block with size - 2 >= hosts
    const size = 2 ** (32 - p); next = start + Math.ceil((next - start) / size) * size;
    if (next + size > end) { console.log("  " + name + " needs /" + p + ": DOES NOT FIT"); continue; }
    console.log("  " + name.padEnd(5) + String(hosts).padStart(4) + " -> " + toIp(next) + "/" + p +
      "  usable " + toIp(next + 1) + "-" + toIp(next + size - 2) + "  bc " + toIp(next + size - 1));
    next += size;
  }
  console.log("  used " + (next - start) + " of " + (end - start) + ", free from " + toIp(next));
}
vlsm("10.10.0.0/22", [["E", 25], ["WAN1", 2], ["A", 300], ["C", 100], ["WAN2", 2], ["B", 200], ["D", 50], ["WAN3", 2]]);
function frag(dataBytes, mtu, firstOff = 0, lastMF = 0) { // offsets in 8-byte units
  const P = Math.floor((mtu - 20) / 8) * 8, out = [];
  for (let o = 0; o < dataBytes; o += P) {
    const n = Math.min(P, dataBytes - o), mf = o + n < dataBytes ? 1 : lastMF;
    out.push("[len " + (n + 20) + ", data " + n + ", off " + (firstOff + o / 8) + ", MF " + mf + "]");
  }
  return out.join(" ");
}
console.log("6.8 2400 B, MTU 620: " + frag(2380, 620));
console.log("6.9 4020 B, MTU 1500: " + frag(4000, 1500));
console.log("    1st piece again, MTU 576: " + frag(1480, 576, 0, 1));

আউটপুট:

6.6 VLSM in 10.10.0.0/22:
  A     300 -> 10.10.0.0/23  usable 10.10.0.1-10.10.1.254  bc 10.10.1.255
  B     200 -> 10.10.2.0/24  usable 10.10.2.1-10.10.2.254  bc 10.10.2.255
  C     100 -> 10.10.3.0/25  usable 10.10.3.1-10.10.3.126  bc 10.10.3.127
  D      50 -> 10.10.3.128/26  usable 10.10.3.129-10.10.3.190  bc 10.10.3.191
  E      25 -> 10.10.3.192/27  usable 10.10.3.193-10.10.3.222  bc 10.10.3.223
  WAN1    2 -> 10.10.3.224/30  usable 10.10.3.225-10.10.3.226  bc 10.10.3.227
  WAN2    2 -> 10.10.3.228/30  usable 10.10.3.229-10.10.3.230  bc 10.10.3.231
  WAN3    2 -> 10.10.3.232/30  usable 10.10.3.233-10.10.3.234  bc 10.10.3.235
  used 1004 of 1024, free from 10.10.3.236
6.8 2400 B, MTU 620: [len 620, data 600, off 0, MF 1] [len 620, data 600, off 75, MF 1] [len 620, data 600, off 150, MF 1] [len 600, data 580, off 225, MF 0]
6.9 4020 B, MTU 1500: [len 1500, data 1480, off 0, MF 1] [len 1500, data 1480, off 185, MF 1] [len 1060, data 1040, off 370, MF 0]
    1st piece again, MTU 576: [len 572, data 552, off 0, MF 1] [len 572, data 552, off 69, MF 1] [len 396, data 376, off 138, MF 1]

চাহিদাগুলো ইচ্ছে করে এলোমেলো ক্রমে দেওয়া (E আর WAN1 আগে), কিন্তু sort বড়টিকে আগে আনে — ফল stepper-এর টেবিলের হুবহু, খালি 10.10.3.236 থেকে। Math.ceil(...) * size লাইনটি alignment-এর নিরাপত্তা। Fragmentation-এর তিন লাইন উদাহরণ ৬.৮ আর ৬.৯; শেষ লাইনে lastMF = 1 দেওয়ায় ভাঙা প্রথম টুকরোর শেষ অংশেও MF ১ থাকে।

নিজে করুন — ভাগ ৬

নি ৬.১(সহজ) 192.168.100.157/29-এর network, broadcast আর ব্যবহারযোগ্য পরিসর?

Block ৮: ১৫২–১৫৯. Network 192.168.100.152, broadcast 192.168.100.159, host .153–.158 (৬টি)।

নি ৬.২(মাঝারি) 10.0.0.0/8 থেকে প্রতিটিতে অন্তত ২০০০ host-এর subnet — prefix আর subnet-সংখ্যা?

211 − 2 = ২০৪৬ ≥ ২০০০ → h = ১১ → /21; ধার করা bit ২১ − ৮ = ১৩ → ৮১৯২টি subnet.

নি ৬.৩(মাঝারি) 172.16.15.255/20 কি একটি কম্পিউটারকে দেওয়া যায়?

/20-এ তৃতীয় octet-এর block ১৬: ০–১৫. নেটওয়ার্ক 172.16.0.0, broadcast 172.16.15.255 — তাই না. অথচ 172.16.15.0 বা 172.16.1.255 এখানে বৈধ host — শেষ octet ২৫৫ বা ০ দেখেই বাতিল করা ভুল।

নি ৬.৪(মাঝারি) 172.16.32.0/24 থেকে 172.16.39.0/24 পর্যন্ত আটটি নেটওয়ার্কের summary?

৩২ = 00100 000, ৩৯ = 00100 111 → সাধারণ ৫ bit → 172.16.32.0/21, নিখুঁত (৩২–৩৯, আটটিই)।

নি ৬.৫(কঠিন) ১৪২০ byte-এর datagram (header ২০) MTU ৫৩২-এর link-এ — টুকরোগুলোর Total Length আর offset?

D = ১৪০০, P = ⌊৫১২/৮⌋ × ৮ = ৫১২. টুকরো: ৫৩২ (offset ০), ৫৩২ (offset ৬৪), ৩৯৬ (offset ১২৮, MF ০). ডেটার যোগ ৫১২ + ৫১২ + ৩৭৬ = ১৪০০.

নি ৬.৬(সহজ) IPv4 header-এ IHL = 6 আর Total Length = 1500 হলে header আর payload কত byte?

IHL ৪-byte এককে: ৬ × ৪ = ২৪ byte (৪ byte option); payload ১৫০০ − ২৪ = ১৪৭৬ byte.

৭ · Routing — longest prefix match, Dijkstra আর distance vector

সূত্রের কার্ড

Longest prefix match: যত সারি মেলে, তার মধ্যে সবচেয়ে লম্বা prefix জেতে; 0.0.0.0/0 সবার সাথে মেলে, তাই শেষ ভরসা।

Dijkstra: প্রতি ধাপে N′-এর বাইরের সবচেয়ে ছোট D(w) যোগ; তারপর w-এর প্রতিবেশী v-তে D(w) + c(w,v) < D(v) হলে D(v), p(v) হালনাগাদ। টেবিলে N′-এ ঢোকা node-এর ঘর পরের সারি থেকে ফাঁকা।

Distance vector (Bellman-Ford): dx(y) = minv {c(x,v) + dv(y)}. ভালো খবর দ্রুত ছড়ায়; খরচ বাড়লে দুই router একে অপরের পুরোনো খবরে ভর করে ধীরে ধীরে বাড়ায় — count-to-infinity-এর ছোট রূপ।

OSPF cost: reference bandwidth ÷ interface bandwidth (পূর্ণসংখ্যা, কমপক্ষে ১)।

উদাহরণ ৭.১ (মাঝারি) — longest prefix match

প্রশ্ন: Router-এর টেবিল: 10.0.0.0/8 → A, 10.1.0.0/16 → B, 10.1.4.0/22 → C, 10.1.6.0/24 → D, 0.0.0.0/0 → E. গন্তব্য 10.1.6.9, 10.1.7.200, 10.1.9.1, 10.2.0.1 আর 192.0.2.1 কোন দিকে যাবে?

10.1.4.0/22 covers third octet 4..7
10.1.6.9    : /8 /16 /22 /24 /0 all match  -> longest /24 -> D
10.1.7.200  : /8 /16 /22 /0  (7 is not 6)  -> /22 -> C
10.1.9.1    : /8 /16 /0      (9 not in 4..7) -> /16 -> B
10.2.0.1    : /8 /0                         -> A
192.0.2.1   : /0 only                       -> E (default route)

D, C, B, A, E. ফাঁদ: টেবিলের ক্রমে প্রথম মিল নেওয়া (তাহলে সব 10.x যেত A-তে) — router ক্রম দেখে না, দৈর্ঘ্য দেখে।

উদাহরণ ৭.২ (মাঝারি → কঠিন) — Dijkstra-র পূর্ণ টেবিল

প্রশ্ন: ছয়টি router, link-এর cost: A–B ৪, A–C ১, B–C ২, B–D ৫, C–D ৮, C–E ১০, D–E ২, D–F ৬, E–F ২. উৎস A. পর্ব ২৪-এর নিয়মে N′ আর D(v),p(v) টেবিল, তারপর A-র forwarding table.

step N'      D(B),p  D(C),p  D(D),p  D(E),p  D(F),p
0    A       4,A     1,A     inf     inf     inf
1    AC      3,C             9,C     11,C    inf       C added (1): B 1+2=3 < 4, D 1+8, E 1+10
2    ACB                     8,B     11,C    inf       B added (3): D 3+5=8 < 9
3    ACBD                            10,D    14,D      D added (8): E 8+2=10 < 11, F 8+6
4    ACBDE                                   12,E      E added (10): F 10+2=12 < 14
5    ACBDEF

dest  cost  path           first hop
B     3     A-C-B          C
D     8     A-C-B-D        C
E     10    A-C-B-D-E      C
F     12    A-C-B-D-E-F    C

সরাসরি link A–B (৪) থাকা সত্ত্বেও B-র পথ C হয়ে (৩) — Dijkstra “কম hop” নয়, “কম cost” খোঁজে। সব গন্তব্যের প্রথম hop C; F-এর cost ১২. যাচাই: পথের link-cost যোগ করুন — A-C-B-D-E-F = ১ + ২ + ৫ + ২ + ২ = ১২.

উদাহরণ ৭.৩ (মাঝারি) — distance vector, round ধরে

প্রশ্ন: চারটি router: W–X ২, W–Y ৭, X–Y ১, X–Z ৬, Y–Z ২. শুরুতে প্রত্যেকে শুধু সরাসরি প্রতিবেশী চেনে। Synchronous মডেলে প্রতিটি round-এর পর W-এর vector আর কখন সব স্থির হয়?

round 0  W: W0 X2 Y7 Z-inf     X: W2 X0 Y1 Z6     Y: W7 X1 Y0 Z2     Z: W-inf X6 Y2 Z0
round 1  W: Y = min(2+1, 7+0) = 3 (via X)    Z = min(2+6, 7+2) = 8 (via X)
         X: Z = min(6, 1+2) = 3 (via Y)      Y: W = min(7, 1+2) = 3 (via X)
         Z: W = min(6+2, 2+7) = 8            Z: X = min(6, 2+1) = 3 (via Y)
round 2  W: Z = min(2 + 3, 7 + 2) = 5 (via X)    Z: W = min(6 + 2, 2 + 3) = 5 (via Y)
round 3  nothing changes -> converged
final W: X 2, Y 3, Z 5   (all via X)

W–Z-এর আসল সবচেয়ে ছোট পথ W-X-Y-Z = ২ + ১ + ২ = ৫, যা তিন link লম্বা — তাই round ২-এ পাওয়া গেল (round ১-এর পর W-এর হাতে X-এর পুরোনো ৬-ই ছিল)। Round ২-এর পর স্থির; round ৩-এ কোনো বদল নেই।

উদাহরণ ৭.৪ (কঠিন) — খরচ বাড়লে ধীরে ধীরে গোনা

প্রশ্ন: তিন router: c(x,y) = ৩, c(y,z) = ১, c(x,z) = ১০; গন্তব্য x. স্থির অবস্থায় y → x = ৩, z → x = ৪ (y হয়ে)। হঠাৎ c(x,y) = ৩০ হলো। Synchronous মডেলে (round ১ পুরোনো vector দেখে) কত round পরে সব স্থির হয়, শেষ পথ কী? Poison reverse নেই।

round:   1   2   3   4   5   6   7   8
y -> x:  5   5   7   7   9   9   11  (stable)
z -> x:  4   6   6   8   8   10  10  (stable)
round 1: y = min(30, 1 + z's old 4) = 5 (via z);  z = min(10, 1 + y's old 3) = 4
...      each pair of rounds adds 2, until z's route via y exceeds its direct 10
round 7: y = min(30, 1 + 10) = 11 (via z);  z = min(10, 1 + 9) = 10 (direct)

৭টি round ধরে মান বদলায়, round ৮-এ কোনো বদল নেই। শেষে z → x = ১০ (সরাসরি), y → x = ১১ (z হয়ে)। মাঝখানের round-গুলোতে y আর z একে অপরকে দেখিয়ে x-এর পথ বানায় — একটি ছোট routing loop. c(x,z) যত বড়, তত বেশি round; পুরোপুরি বিকল্পহীন হলে অসীম পর্যন্ত (RIP-এ ১৬) গোনা চলে।

উদাহরণ ৭.৫ (সহজ) — OSPF cost

প্রশ্ন: Reference bandwidth ১০০ Mbps হলে ১০ Mbps, ১.৫৪৪ Mbps (T1) আর ১ Gbps link-এর cost? Reference ১০ Gbps করলে ১ Gbps-এর cost?

10 Mbps   : 100 / 10    = 10
T1        : 100 / 1.544 = 64.77 -> 64 (integer part)
1 Gbps    : 100 / 1000  = 0.1   -> 1  (minimum 1)
ref 10 Gbps, 1 Gbps: 10000 / 1000 = 10

১০, ৬৪, ১; reference বাড়ালে ১০. পুরোনো reference-এ ১০০ Mbps আর ১ Gbps দুটোরই cost ১ — OSPF তখন দুটিকে সমান ভাবে। তাই আধুনিক নেটওয়ার্কে reference bandwidth বাড়িয়ে নেওয়া হয়, আর সব router-এ একই মান রাখতে হয়।

// Dijkstra table printer: N' and D(v),p(v) after every step. Ties -> alphabetical order;
// p(v) changes only when the new cost is strictly smaller.
const links = [["A","B",4],["A","C",1],["B","C",2],["B","D",5],["C","D",8],
               ["C","E",10],["D","E",2],["D","F",6],["E","F",2]];
const nodes = ["A","B","C","D","E","F"], src = "A";
const c = {};
nodes.forEach(n => c[n] = {});
links.forEach(([a, b, w]) => { c[a][b] = w; c[b][a] = w; });
const D = {}, p = {}, Np = [src], others = nodes.filter(v => v !== src);
others.forEach(v => { D[v] = c[src][v] ?? Infinity; p[v] = src; });
const cell = v => Np.includes(v) ? "" : D[v] === Infinity ? "inf" : D[v] + "," + p[v];
const row = k => console.log(String(k).padEnd(5) + Np.join("").padEnd(8) + others.map(v => cell(v).padEnd(8)).join(""));
console.log("step N'      " + others.map(v => ("D(" + v + "),p").padEnd(8)).join(""));
row(0);
for (let k = 1; k < nodes.length; k++) {
  const w = others.filter(v => !Np.includes(v)).sort((a, b) => D[a] - D[b] || a.localeCompare(b))[0];
  Np.push(w);
  for (const v in c[w])
    if (!Np.includes(v) && D[w] + c[w][v] < D[v]) { D[v] = D[w] + c[w][v]; p[v] = w; }
  row(k);
}
console.log("\ndest cost path         first hop");
for (const v of others) {
  const path = [v];
  while (path[0] !== src) path.unshift(p[path[0]]);
  console.log(v.padEnd(5) + String(D[v]).padEnd(5) + path.join("-").padEnd(13) + path[1]);
}

আউটপুট:

step N'      D(B),p  D(C),p  D(D),p  D(E),p  D(F),p
0    A       4,A     1,A     inf     inf     inf
1    AC      3,C             9,C     11,C    inf
2    ACB                     8,B     11,C    inf
3    ACBD                            10,D    14,D
4    ACBDE                                   12,E
5    ACBDEF

dest cost path         first hop
B    3    A-C-B        C
C    1    A-C          C
D    8    A-C-B-D      C
E    10   A-C-B-D-E    C
F    12   A-C-B-D-E-F  C

টেবিলটি খাতার টেবিলের হুবহু — প্রতিটি সারিতে N′ এক node বাড়ে, আর ঢুকে যাওয়া node-এর ঘর ফাঁকা হয়। sort-এর || a.localeCompare(b) অংশ tie-এর বর্ণক্রম নিয়ম; শর্ত < (≤ নয়) মানে সমান cost-এ p(v) বদলায় না। links বদলে (বা src বদলে) নিজের প্রশ্ন চালান — যেমন নি ৭.২-এর জন্য src = "F".

// Longest prefix match + synchronous distance vector (each round uses last round's vectors).
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const table = [["10.0.0.0/8", "A"], ["10.1.0.0/16", "B"], ["10.1.4.0/22", "C"],
               ["10.1.6.0/24", "D"], ["0.0.0.0/0", "E"]];
for (const ip of ["10.1.6.9", "10.1.7.200", "10.1.9.1", "10.2.0.1", "192.0.2.1"]) {
  const hits = table.filter(([net]) => { const [n, p] = net.split("/"), size = 2 ** (32 - p);
    return Math.floor(toInt(ip) / size) === Math.floor(toInt(n) / size); });
  const best = hits.sort((x, y) => y[0].split("/")[1] - x[0].split("/")[1])[0];
  console.log("7.1 " + ip.padEnd(11) + " matches " + hits.length + ", longest " + best[0] + " -> " + best[1]);
}
function dv(links, start, show) {                 // start = vectors before round 1 (or null)
  const R = [...new Set(links.flatMap(l => l.slice(0, 2)))], c = {};
  R.forEach(x => c[x] = {});
  links.forEach(([u, v, w]) => { c[u][v] = w; c[v][u] = w; });
  let D = start || Object.fromEntries(R.map(x => [x, Object.fromEntries(R.map(y =>
    [y, x === y ? 0 : c[x][y] ?? Infinity]))]));
  for (let r = 1; r < 50; r++) {
    const N = Object.fromEntries(R.map(x => [x, Object.fromEntries(R.map(y => [y, x === y ? 0 :
      Math.min(...Object.keys(c[x]).map(v => c[x][v] + D[v][y]))]))]));
    if (R.every(x => R.every(y => N[x][y] === D[x][y]))) return console.log("    round " + r + ": no change, converged");
    D = N;
    console.log("    round " + r + ": " + show.map(([x, y]) => x + "->" + y + "=" + D[x][y]).join("  "));
  }
}
console.log("7.3 W-X 2, W-Y 7, X-Y 1, X-Z 6, Y-Z 2 (from scratch):");
dv([["W","X",2],["W","Y",7],["X","Y",1],["X","Z",6],["Y","Z",2]], null, [["W","Y"],["W","Z"],["Z","W"]]);
console.log("7.4 x-y 3->30, y-z 1, x-z 10 (start from the old converged vectors):");
const old = { x: { x: 0, y: 3, z: 4 }, y: { x: 3, y: 0, z: 1 }, z: { x: 4, y: 1, z: 0 } };
dv([["x","y",30],["y","z",1],["x","z",10]], old, [["y","x"],["z","x"]]);

আউটপুট:

7.1 10.1.6.9    matches 5, longest 10.1.6.0/24 -> D
7.1 10.1.7.200  matches 4, longest 10.1.4.0/22 -> C
7.1 10.1.9.1    matches 3, longest 10.1.0.0/16 -> B
7.1 10.2.0.1    matches 2, longest 10.0.0.0/8 -> A
7.1 192.0.2.1   matches 1, longest 0.0.0.0/0 -> E
7.3 W-X 2, W-Y 7, X-Y 1, X-Z 6, Y-Z 2 (from scratch):
    round 1: W->Y=3  W->Z=8  Z->W=8
    round 2: W->Y=3  W->Z=5  Z->W=5
    round 3: no change, converged
7.4 x-y 3->30, y-z 1, x-z 10 (start from the old converged vectors):
    round 1: y->x=5  z->x=4
    round 2: y->x=5  z->x=6
    round 3: y->x=7  z->x=6
    round 4: y->x=7  z->x=8
    round 5: y->x=9  z->x=8
    round 6: y->x=9  z->x=10
    round 7: y->x=11  z->x=10
    round 8: no change, converged

প্রথম পাঁচ লাইন উদাহরণ ৭.১: কতটি সারি মেলে আর কোনটি সবচেয়ে লম্বা। মিলের পরীক্ষা Math.floor(ip / size) === Math.floor(net / size) — দুটি ঠিকানা একই block-এ কি না, mask দিয়ে AND-এরই আরেক রূপ। dv()-এর প্রতিটি round নতুন টেবিল N বানায় শুধু আগের round-এর D থেকে — এটাই synchronous মডেল। ৭.৩-এ round ২-এ W → Z = ৫ পেয়ে round ৩-এ থামে; ৭.৪-এ y আর z দুই দুই করে বাড়তে বাড়তে round ৭-এ ১১ আর ১০-এ থামে।

নিজে করুন — ভাগ ৭

নি ৭.১(সহজ) উদাহরণ ৭.১-এর টেবিলে 10.1.5.1 আর 10.1.3.255 কোন দিকে যাবে?

10.1.5.1: ৫ আছে ৪–৭-এ → /22 → C. 10.1.3.255: ৩ আছে ৪–৭-এর বাইরে → /16 → B.

নি ৭.২(মাঝারি) উদাহরণ ৭.২-এর graph-এ উৎস F হলে সব গন্তব্যের সবচেয়ে কম cost কত?

E ২, D ৪ (F-E-D), B ৯ (…-D-B), C ১১ (…-B-C; সরাসরি E-C হলে ১২), A ১২ (…-C-A). A ১২, B ৯, C ১১, D ৪, E ২. Dijkstra-য় পথের cost দুই দিকে একই, তাই A থেকে F-এর ১২-এর সাথে মেলে।

নি ৭.৩(কঠিন) A — B — C একটি লাইনে, প্রতিটি link-এর cost ১, গন্তব্য C. B–C link নষ্ট হলো; split horizon নেই, অসীম = ১৬ (RIP). পর্ব ২৩-এর synchronous মডেলে কত round পরে দুজনেই ১৬-তে পৌঁছায়?

B আর A পালা করে ২ করে বাড়ায় (B ৩, A ৪, B ৫ …); অসীম I হলে মোট I − ১ round, তাই ১৫ round. Split horizon বা poison reverse থাকলে দুই-router-এর এই loop প্রায় সঙ্গে সঙ্গে ভাঙে।

৮ · TCP — seq/ack, RTO, window আর cwnd

সূত্রের কার্ড

Seq/ack: segment-এর seq = তার প্রথম byte-এর নম্বর; ACK = পরের প্রত্যাশিত byte (cumulative). SYN আর FIN একটি করে নম্বর খায়, শুধু ACK কোনো নম্বর খায় না।

RTO (RFC 6298): প্রথম নমুনা R: SRTT = R, RTTVAR = R/2. পরে: RTTVAR ← ¾·RTTVAR + ¼·|SRTT − R| (পুরোনো SRTT দিয়ে), তারপর SRTT ← ⅞·SRTT + ⅛·R; RTO = SRTT + 4·RTTVAR (RFC-তে নিম্নসীমা ১ সেকেন্ড)।

Window: throughput ≤ min(rwnd, cwnd)/RTT; window scale-এ আসল window = header-এর মান × 2shift.

cwnd (MSS-এ): slow start-এ প্রতি round দ্বিগুণ (ssthresh-এ থামে), congestion avoidance-এ +১; loss-এ ssthresh = max(⌊cwnd/2⌋, 2); Reno-তে ৩ dup ACK-এর পর cwnd = ssthresh (fast recovery; কিছু বইয়ে + ৩), timeout-এ ১; Tahoe-তে দুই ক্ষেত্রেই ১.

গড় throughput: AIMD-এর করাতে ≈ ০.৭৫·W·MSS/RTT; Mathis: ≈ 1.22·MSS/(RTT·√p).

উদাহরণ ৮.১ (সহজ) — handshake আর ডেটার seq/ack

প্রশ্ন: Client-এর ISN ১০০০, server-এর ৫০০০. Handshake-এর তিনটি segment-এর seq/ack লিখুন। তারপর client ৫০০ byte করে তিনটি segment পাঠায় — প্রতিটির seq আর server-এর ACK? দ্বিতীয়টি হারালে server তৃতীয়টি পেয়ে কী ACK পাঠায়?

SYN           seq=1000
SYN+ACK       seq=5000  ack=1001         (SYN used one number)
ACK           seq=1001  ack=5001
data 1        seq=1001  (500 B)  -> ACK 1501
data 2        seq=1501  (500 B)  -> ACK 2001
data 3        seq=2001  (500 B)  -> ACK 2501
if data 2 is lost: data 3 arrives -> server repeats ACK 1501 (a duplicate ACK)

ACK সবসময় “পরের যে byte চাই” — তাই হারানো segment-এর শুরুর নম্বর ১৫০১ বারবার ফেরে। এমন তিনটি duplicate ACK-ই fast retransmit চালু করে (পর্ব ৩০)। ফাঁদ: ACK = শেষ পাওয়া byte-এর নম্বর ভাবা (তাহলে ১৫০০ লিখতেন)।

উদাহরণ ৮.২ (মাঝারি) — RTO হিসাব

প্রশ্ন: RTT-র তিনটি নমুনা ১০০, ১২০ আর ৮০ ms. RFC 6298-এর ক্রমে প্রতিবার SRTT, RTTVAR আর RTO কত (১ সেকেন্ডের নিম্নসীমা বাদ দিয়ে)?

R = 100 (first): SRTT = 100      RTTVAR = 50                          RTO = 100 + 200 = 300
R = 120:  RTTVAR = 0.75 x 50 + 0.25 x |100 - 120| = 37.5 + 5     = 42.5
          SRTT   = 0.875 x 100 + 0.125 x 120     = 87.5 + 15     = 102.5   RTO = 102.5 + 170 = 272.5
R = 80 :  RTTVAR = 0.75 x 42.5 + 0.25 x |102.5 - 80| = 31.875 + 5.625 = 37.5
          SRTT   = 0.875 x 102.5 + 0.125 x 80   = 89.6875 + 10 = 99.6875  RTO = 99.6875 + 150 = 249.6875

RTO ৩০০ → ২৭২.৫ → প্রায় ২৪৯.৭ ms. কিছু পাঠ্যবই আগে SRTT, তারপর নতুন SRTT দিয়ে RTTVAR হালনাগাদ করে; সেই ক্রমে RTO আসে ২৭০ আর ২৪৫ ms. প্রশ্নে ক্রম দেওয়া থাকলে সেটিই মানুন, উত্তরে নিজের ক্রম লিখে দিন। RFC মানলে তিনটিই ১ সেকেন্ডের নিচে, তাই আসল RTO ১০০০ ms.

উদাহরণ ৮.৩ (মাঝারি) — rwnd-সীমিত throughput আর window scale

প্রশ্ন: Window scaling নেই, rwnd = ৬৫,৫৩৫ byte, RTT ১০০ ms. সর্বোচ্চ throughput? ১০০ Mbps পেতে কত window, আর ন্যূনতম shift?

65535 x 8 / 0.1 = 5.24 Mbps
needed W = 10^8 x 0.1 / 8 = 1,250,000 byte
1,250,000 / 65535 = 19.07 -> need 2^shift >= 19.07 -> shift = 5 (x32)

প্রায় ৫.২৪ Mbps; ১২,৫০,০০০ byte; shift ৫. ঢাকা থেকে দূরের সার্ভারে window scaling বন্ধ থাকলে ব্যান্ডউইথ যতই হোক, গতি এই সীমায় আটকে যায়।

উদাহরণ ৮.৪ (কঠিন) — cwnd-এর round টেবিল: Reno বনাম Tahoe

প্রশ্ন: শুরুতে cwnd = ১ MSS, ssthresh = ২০. Round ১০-এ ৩টি duplicate ACK, round ১৬-এ timeout ধরা পড়ে। ২০টি round-এর cwnd লিখুন (Reno আর Tahoe). (ক) কোন round-গুলোতে slow start? (খ) প্রতিটি loss-এর পর ssthresh? (গ) Reno-তে ১০০তম segment কোন round-এ যায়? (ঘ) ২০ round-এ মোট কতটি segment?

round  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
Reno   1  2  4  8 16 20 21 22 23 24 12 13 14 15 16 17  1  2  4  8
Tahoe  1  2  4  8 16 20 21 22 23 24  1  2  4  8 12 13  1  2  4  6
Reno sent so far: 1 3 7 15 31 51 72 94 117 141 153 166 180 195 211 228 229 231 235 243

(ক) Reno-তে slow start round ১–৫ (দ্বিগুণ; round ৬-এ ৩২ নয়, ssthresh-এ আটকে ২০) আর ১৭–১৯ (round ২০-এ cwnd ৮ = নতুন ssthresh, সেখান থেকে congestion avoidance). (খ) Round ১০-এ cwnd ২৪ → ssthresh ১২; round ১৬-এ Reno-র cwnd ১৭ → ssthresh ৮ (Tahoe-তে তখন cwnd ১৩ → ssthresh ৬)। (গ) Round ৮ পর্যন্ত ৯৪টি, round ৯-এ ১১৭ — ১০০তম segment round ৯-এ. (ঘ) Reno ২৪৩, Tahoe ১৯৪. Reno-র লাভ round ১১–১৬-এ: Tahoe আবার ১ থেকে শুরু করে, Reno ১২ থেকে। ফাঁদ: round ৬-এ ৩২ লেখা — slow start ssthresh ছাড়িয়ে যায় না।

উদাহরণ ৮.৫ (মাঝারি) — গড় throughput আর sequence নম্বরের ঘোরা

প্রশ্ন: (ক) একটি Reno প্রবাহ loss-এর ঠিক আগে W = ৪০ segment-এ পৌঁছায়; MSS ১৪৬০ byte, RTT ১০০ ms — গড় throughput? (খ) একই MSS আর RTT-তে loss rate p = ১০−৪ হলে Mathis সূত্রে? (গ) ১০ Gbps-এ ৩২-bit sequence নম্বর কত সেকেন্ডে পুরো ঘুরে আসে?

(a) 0.75 x 40 x 1460 x 8 / 0.1 = 3.504 Mbps
(b) 1.22 x 1460 x 8 / (0.1 x sqrt(10^-4)) = 14249.6 / 0.001 = 14.25 Mbps
(c) 2^32 byte x 8 / 10^10 = 3.44 s

৩.৫০ Mbps; ১৪.২৫ Mbps; প্রায় ৩.৪৪ সেকেন্ড। (গ) দেখায়, দ্রুত link-এ একটি দেরিতে আসা পুরোনো segment নতুনের নম্বর নিয়ে ফেলতে পারে — তাই timestamps option দিয়ে PAWS (পর্ব ৩০)।

// RTO (RFC 6298: alpha 1/8, beta 1/4, RTTVAR updated first with the OLD SRTT) + cwnd tracer.
let srtt = null, v = null;
for (const r of [100, 120, 80]) {                  // RTT samples in ms (1 s minimum ignored)
  if (srtt === null) { srtt = r; v = r / 2; }
  else { v = 0.75 * v + 0.25 * Math.abs(srtt - r); srtt = 0.875 * srtt + 0.125 * r; }
  console.log("8.2 R=" + r + "  SRTT=" + srtt + "  RTTVAR=" + v + "  RTO=" + (srtt + 4 * v));
}
// cwnd per transmission round in MSS. Slow start doubles but stops at ssthresh;
// on loss ssthresh = max(cwnd/2, 2); Reno after 3 dup ACKs: cwnd = ssthresh; timeout: cwnd = 1.
function trace(kind, rounds, ss0, loss) {
  let cwnd = 1, th = ss0, sent = 0, w = [], total = [];
  for (let r = 1; r <= rounds; r++) {
    w.push(cwnd); sent += cwnd; total.push(sent);
    if (loss[r]) {
      th = Math.max(Math.floor(cwnd / 2), 2);
      cwnd = loss[r] === "3dup" && kind === "Reno" ? th : 1;
    } else cwnd = cwnd < th ? Math.min(2 * cwnd, th) : cwnd + 1;
  }
  return { w, total, th };
}
const loss = { 10: "3dup", 16: "timeout" };
for (const kind of ["Reno", "Tahoe"]) {
  const t = trace(kind, 20, 20, loss);
  console.log("8.4 " + kind.padEnd(5) + " cwnd: " + t.w.join(" "));
  console.log("          sent so far: " + t.total.join(" "));
}
console.log("8.3 64 KB window, RTT 100 ms: " + (65535 * 8 / 0.1 / 1e6).toFixed(2) + " Mbps");
console.log("8.5 0.75*W*MSS/RTT = " + (0.75 * 40 * 1460 * 8 / 0.1 / 1e6).toFixed(3) + " Mbps; Mathis p=1e-4: " +
  (1.22 * 1460 * 8 / (0.1 * Math.sqrt(1e-4)) / 1e6).toFixed(2) + " Mbps");
console.log("8.5 32-bit sequence space at 10 Gbps wraps in " + (2 ** 32 * 8 / 10e9).toFixed(2) + " s");

আউটপুট:

8.2 R=100  SRTT=100  RTTVAR=50  RTO=300
8.2 R=120  SRTT=102.5  RTTVAR=42.5  RTO=272.5
8.2 R=80  SRTT=99.6875  RTTVAR=37.5  RTO=249.6875
8.4 Reno  cwnd: 1 2 4 8 16 20 21 22 23 24 12 13 14 15 16 17 1 2 4 8
          sent so far: 1 3 7 15 31 51 72 94 117 141 153 166 180 195 211 228 229 231 235 243
8.4 Tahoe cwnd: 1 2 4 8 16 20 21 22 23 24 1 2 4 8 12 13 1 2 4 6
          sent so far: 1 3 7 15 31 51 72 94 117 141 142 144 148 156 168 181 182 184 188 194
8.3 64 KB window, RTT 100 ms: 5.24 Mbps
8.5 0.75*W*MSS/RTT = 3.504 Mbps; Mathis p=1e-4: 14.25 Mbps
8.5 32-bit sequence space at 10 Gbps wraps in 3.44 s

RTO-র তিন লাইন উদাহরণ ৮.২-এর হুবহু; লুপের else লাইনে আগে v (RTTVAR), পরে srtt — RFC-র ক্রম। ক্রম উল্টে দুটি statement-এর জায়গা বদলালে পাঠ্যবইয়ের ২৭০ আর ২৪৫ পাবেন। trace()-এর Math.min(2 * cwnd, th) slow start-কে ssthresh-এ থামায়; Reno আর Tahoe-র পার্থক্য একটি শর্তে — loss[r] === "3dup" && kind === "Reno". শেষ তিন লাইন ৮.৩ আর ৮.৫.

নিজে করুন — ভাগ ৮

নি ৮.১(সহজ) seq = ৪০০০-এর segment-এ ১৪৬০ byte. সব ঠিক থাকলে প্রাপকের ACK নম্বর কত?

৪০০০ + ১৪৬০ = ৫৪৬০ — পরের প্রত্যাশিত byte.

নি ৮.২(মাঝারি) Client-এর ISN ২০০০. Handshake-এর পর ১০০, ২০০ আর ৩০০ byte-এর তিনটি segment, তারপর FIN. প্রতিটির seq, শেষ ডেটার পর server-এর ACK, আর FIN-এর ACK?

Seq ২০০১, ২১০১, ২৩০১; শেষ ডেটার পর ACK ২৬০১; FIN-এর seq ২৬০১, তার ACK ২৬০২ (FIN একটি নম্বর খায়)।

নি ৮.৩(মাঝারি) cwnd ১ থেকে, ssthresh ৬৪, কোনো loss নেই। কোন round-এ cwnd প্রথম ৬৪ হয়, আর ততক্ষণে মোট কতটি segment গেছে?

১, ২, ৪, ৮, ১৬, ৩২, ৬৪ — round ৭; যোগফল ১২৭ (২৭ − ১)।

নি ৮.৪(মাঝারি) Header-এর window field ৮১৯২, window scale shift ৫, RTT ৫০ ms. প্রাপকের window কত byte, আর সেটি একমাত্র বাধা হলে সর্বোচ্চ throughput?

8192 × 25 = ২,৬২,১৪৪ byte; 262144 × 8 ÷ 0.05 ≈ ৪১.৯ Mbps.

৯ · Application, media আর মোবাইল — HTTP, cache, P2P, DNS, VoIP আর cell

সূত্রের কার্ড

HTTP (base + N বস্তু, transmission নগণ্য, DNS ও TLS বাদ): non-persistent ক্রমে 2(N + 1)·RTT; P টি parallel 2(1 + ⌈N/P⌉)·RTT; persistent (N + 2)·RTT; pipelining 3·RTT.

প্রতিষ্ঠানের cache (পর্ব ৩৮-এর মডেল): ρ = (1 − h)·L·a/R; access link-এ সময় (L/R)/(1 − ρ); গড় = h·LAN + (1 − h)(LAN + access + Internet).

P2P distribution time: Dcs = max(NF/us, F/dmin); DP2P = max(F/us, F/dmin, NF/(us + Σui)).

VoIP: payload = codec rate × packet সময়; IP packet = payload + ৪০ byte (RTP ১২ + UDP ৮ + IPv4 ২০); Ethernet-এ আরও ১৮. Playout delay q-এর চেয়ে বেশি delay-এর packet দেরিতে আসা — হারানো।

Cell: N = i² + ij + j²; D/R = √(3N); S/I ≈ (√(3N))n/৬.

উদাহরণ ৯.১ (সহজ) — HTTP-র চার পদ্ধতি

প্রশ্ন: RTT ৮০ ms, base HTML আর ৮টি ছোট ছবি (transmission নগণ্য)। Non-persistent (একটির পর একটি), ৪টি parallel non-persistent সংযোগ, persistent আর pipelining-এ পাতা আনতে কত সময়?

non-persistent, serial : 2 (N + 1) RTT       = 2 x 9 x 80       = 1440 ms
4 parallel             : 2 (1 + ceil(8/4)) RTT = 2 x 3 x 80     = 480 ms
persistent             : (N + 2) RTT         = 10 x 80          = 800 ms
pipelining             : 3 RTT               = 240 ms

১৪৪০, ৪৮০, ৮০০ আর ২৪০ ms. Base-এর জন্য সবসময় ২ RTT (handshake + request) — এটি বাদ দেওয়া সবচেয়ে সাধারণ ভুল।

উদাহরণ ৯.২ (মাঝারি) — DNS-সহ মোট সময়

প্রশ্ন: নাম খুঁজতে ক্রমে তিনটি DNS সার্ভারে যেতে হলো, RTT যথাক্রমে ১০, ২০ আর ৩০ ms. ওয়েব সার্ভারের RTT ৪০ ms. Base HTML আর ৮টি বস্তু non-persistent, একটির পর একটি (transmission নগণ্য)। মোট সময়?

DNS         = 10 + 20 + 30   = 60 ms
base HTML   = 2 x 40         = 80 ms
8 objects   = 8 x 2 x 40     = 640 ms
total                        = 780 ms

৭৮০ ms. একই সার্ভারের বস্তুর জন্য DNS আবার লাগে না (cache-এ থাকে) — প্রতিটি বস্তুতে DNS যোগ করা ভুল।

উদাহরণ ৯.৩ (কঠিন) — link বাড়াবেন, না cache বসাবেন?

প্রশ্ন: প্রতিষ্ঠানের access link ১৫ Mbps; প্রতিটি বস্তু L = ১ Mbit; প্রতি সেকেন্ডে a = ১৪টি অনুরোধ; LAN-এ ০.০১ সেকেন্ড; access link-এর বাইরে থেকে origin হয়ে ফেরা ১ সেকেন্ড। পর্ব ৩৮-এর মডেলে (ক) cache ছাড়া, (খ) hit ০.৪-এর cache-সহ, (গ) link ১০০ Mbps করলে গড় delay?

(a) rho = 1 x 14 / 15 = 0.933   access = (1/15) / (1 - 0.933) = 1.000 s
    avg = 0.01 + 1.000 + 1 = 2.010 s
(b) rho = 0.6 x 14 / 15 = 0.56  access = 0.0667 / 0.44 = 0.152 s
    avg = 0.4 x 0.01 + 0.6 x (0.01 + 0.152 + 1) = 0.004 + 0.697 = 0.701 s
(c) rho = 14 / 100 = 0.14       access = 0.01 / 0.86 = 0.012 s
    avg = 0.01 + 0.012 + 1 = 1.022 s

২.০১, ০.৭০ আর ১.০২ সেকেন্ড — সস্তা cache দামি link-এর চেয়েও ভালো, কারণ hit-গুলো দূরের ১ সেকেন্ডও বাঁচায়। মডেলটি আনুমানিক (M/M/1-ধাঁচের); উত্তরে মডেলের নাম লিখুন।

উদাহরণ ৯.৪ (মাঝারি) — client-server বনাম P2P

প্রশ্ন: F = ২০০০ Mbit (২৫০ MB), us = ৫০ Mbps, dmin = ১০ Mbps, প্রতিটি peer-এর আপলোড ২ Mbps. N = ৫০ আর ৫০০-এ দুই পদ্ধতির ন্যূনতম বিতরণ-সময়?

N = 50 : CS  = max(50 x 2000/50, 2000/10)          = max(2000, 200)       = 2000 s
         P2P = max(2000/50, 2000/10, 100000/(50+100)) = max(40, 200, 666.7) = 666.7 s
N = 500: CS  = max(20000, 200)                     = 20000 s
         P2P = max(40, 200, 1,000,000/(50+1000))   = 952.4 s

N দশ গুণ হলে client-server-এর সময়ও দশ গুণ, কিন্তু P2P-র মাত্র ১.৪৩ গুণ — প্রতিটি নতুন peer নিজেও আপলোড আনে। ৫০-এ ২০০০ বনাম ৬৬৬.৭ সেকেন্ড; ৫০০-এ ২০,০০০ বনাম ৯৫২.৪ সেকেন্ড।

উদাহরণ ৯.৫ (সহজ) — DNS-এ কতটি বার্তা

প্রশ্ন: সব cache খালি। Host তার local resolver-কে জিজ্ঞেস করে; resolver iterativeভাবে root, TLD আর authoritative সার্ভারে যায়। মোট কতটি DNS বার্তা? TLD সার্ভারের ঠিকানা আগেই cache-এ থাকলে? আর ওই domain-এর authoritative সার্ভারের ঠিকানাও cache-এ থাকলে?

host -> resolver, resolver -> host               2
resolver <-> root, TLD, authoritative (3 x 2)     6
total                                             8
TLD server cached (root skipped)            :  2 + 2 x 2 = 6
authoritative server cached (root, TLD skipped):  2 + 2     = 4

৮টি; TLD সার্ভার cache-এ থাকলে ৬টি; authoritative সার্ভারও cache-এ থাকলে ৪টি। প্রশ্নে শুধু “query” গুনতে বললে উত্তর অর্ধেক (৪, ৩ আর ২) — শব্দটি খেয়াল করুন। আর host-এর নিজের cache-এ নামটি থাকলে কোনো বার্তাই যায় না।

উদাহরণ ৯.৬ (মাঝারি) — VoIP-এর আসল bandwidth

প্রশ্ন: G.729 codec (৮ kbps), প্রতি packet-এ ২০ ms কণ্ঠ, RTP/UDP/IPv4. এক দিকের IP-স্তরের bitrate কত? Ethernet-এর ১৮ byte ধরলে? ৪০ ms-এর packet করলে?

payload = 8000 / 8 x 0.020 = 20 byte;   packet = 20 + 40 = 60 byte;   50 packets/s
IP rate = 60 x 8 x 50 = 24 kbps      with Ethernet: 78 x 8 x 50 = 31.2 kbps
40 ms : payload 40 B, packet 80 B, 25/s -> 16 kbps (19.6 kbps with Ethernet)

২৪ kbps (Ethernet-সহ ৩১.২) — codec-এর ৮ kbps-এর তিন গুণ! কম-bitrate codec-এ header-ই বড় খরচ। Packet বড় করলে খরচ কমে, কিন্তু delay আর একটি packet হারালে বেশি কণ্ঠ হারায়।

উদাহরণ ৯.৭ (মাঝারি) — নির্দিষ্ট playout delay

প্রশ্ন: প্রতি ২০ ms-এ একটি packet; ৮টি packet-এর একমুখী delay (ms): ৪০, ৬৫, ৫২, ১১০, ৫৮, ৯০, ৪৭, ১৩০. প্রাপক প্রতিটি packet তার তৈরি হওয়ার q পরে বাজায়; তার পরে এলে বাদ। q = ৮০ আর q = ১২০ ms-এ কতটি বাদ?

late if delay > q
q = 80 : packets 4 (110), 6 (90), 8 (130) late -> 3 of 8 = 37.5% loss
q = 120: packet 8 (130) late                -> 1 of 8 = 12.5% loss

৩টি (৩৭.৫%) আর ১টি (১২.৫%). q বাড়ালে কম packet হারায়, কিন্তু কথার মোট দেরি বাড়ে — একমুখী ১৫০ ms-এর বেশি হলে কথোপকথন অস্বস্তিকর লাগতে শুরু করে বলে সাধারণত ধরা হয়। এজন্যই adaptive playout.

উদাহরণ ৯.৮ (কঠিন) — cell-এর reuse

প্রশ্ন: Cell-এর ব্যাসার্ধ ১.৫ km, N = ৭, path loss exponent n = ৪. (ক) একই চ্যানেলের নিকটতম cell কত দূরে? (খ) S/I কত dB (প্রথম সারির ৬টি interferer)? (গ) মোট spectrum ২৫ MHz, প্রতিটি চ্যানেল প্রতি দিকে ৩০ kHz — প্রতি cell-এ কতটি duplex চ্যানেল? (ঘ) S/I অন্তত ১৫ dB চাইলে ন্যূনতম বৈধ N?

(a) D/R = sqrt(3 x 7) = sqrt(21) = 4.583   D = 1.5 x 4.583 = 6.87 km
(b) S/I = (sqrt 21)^4 / 6 = 441 / 6 = 73.5  ->  10 log10 73.5 = 18.66 dB
(c) duplex channels = floor(25 MHz / 60 kHz) = 416;  per cell floor(416 / 7) = 59
(d) (D/R)^4 >= 6 x 10^1.5 = 189.7  ->  D/R >= 3.711  ->  N >= 3.711^2 / 3 = 4.59
    valid N = 1, 3, 4, 7, 9, 12, 13 ...  -> N = 7

৬.৮৭ km; ১৮.৬৬ dB; ৫৯টি; N = ৭. (ঘ)-তে ৪.৫৯-এর পরের পূর্ণসংখ্যা ৫ নয় — ৫ বা ৬ কোনো (i, j) থেকে আসে না, তাই পরের বৈধ মান ৭.

// Application-layer checker: HTTP page time, institutional cache, P2P distribution, DNS.
function page(RTT, N, P) {                         // object transmission time ignored, no DNS/TLS
  console.log("9.1 RTT=" + RTT + " ms, " + N + " objects: non-persistent " + 2 * (N + 1) * RTT +
    " | " + P + " parallel " + 2 * (1 + Math.ceil(N / P)) * RTT + " | persistent " + (N + 2) * RTT +
    " | pipelined " + 3 * RTT + " ms");
}
page(80, 8, 4);
const dns = 10 + 20 + 30;                          // three DNS servers visited one after another
console.log("9.2 DNS " + dns + " + base 2*40 + 8 objects non-persistent 8*2*40 = " + (dns + 80 + 8 * 80) + " ms");
function cache(R, a, hit, L = 1e6, lan = 0.01, inet = 1.0) {   // M/M/1-style access-link model
  const rho = (1 - hit) * L * a / R, acc = (L / R) / (1 - rho);
  const avg = hit * lan + (1 - hit) * (lan + acc + inet);
  console.log("9.3 R=" + R / 1e6 + " Mbps hit=" + hit + "  rho=" + rho.toFixed(3) + "  access=" +
    acc.toFixed(3) + " s  average=" + avg.toFixed(3) + " s");
}
cache(15e6, 14, 0); cache(15e6, 14, 0.4); cache(100e6, 14, 0);
function dist(F, us, dmin, u, N) {                 // fluid model, Mbit and Mbit/s
  const cs = Math.max(N * F / us, F / dmin);
  const p2p = Math.max(F / us, F / dmin, N * F / (us + N * u));
  console.log("9.4 N=" + N + "  client-server " + cs.toFixed(1) + " s  P2P " + p2p.toFixed(1) + " s");
}
for (const N of [50, 500]) dist(2000, 50, 10, 2, N);
console.log("9.5 iterative lookup, empty cache: host<->local 2 + local<->root/TLD/auth 6 = " + (2 + 3 * 2) +
  " messages; TLD server cached: " + (2 + 2 * 2) + "; authoritative cached: " + (2 + 1 * 2));

আউটপুট:

9.1 RTT=80 ms, 8 objects: non-persistent 1440 | 4 parallel 480 | persistent 800 | pipelined 240 ms
9.2 DNS 60 + base 2*40 + 8 objects non-persistent 8*2*40 = 780 ms
9.3 R=15 Mbps hit=0  rho=0.933  access=1.000 s  average=2.010 s
9.3 R=15 Mbps hit=0.4  rho=0.560  access=0.152 s  average=0.701 s
9.3 R=100 Mbps hit=0  rho=0.140  access=0.012 s  average=1.022 s
9.4 N=50  client-server 2000.0 s  P2P 666.7 s
9.4 N=500  client-server 20000.0 s  P2P 952.4 s
9.5 iterative lookup, empty cache: host<->local 2 + local<->root/TLD/auth 6 = 8 messages; TLD server cached: 6; authoritative cached: 4

চারটি HTTP সময়, DNS-সহ ৭৮০ ms, cache-এর তিন পরিস্থিতি (২.০১০, ০.৭০১, ১.০২২ সেকেন্ড), P2P-র দুই N আর DNS-এর বার্তা-সংখ্যা — সব ওপরের উদাহরণের সাথে মেলে। cache()-এ hit-এর অনুরোধ access link পার হয় না, তাই ρ-কে (1 - hit) দিয়ে গুণ — মডেলের মূল কথা এই এক গুণে।

// Media and cellular checker: VoIP bandwidth, fixed playout delay, cell reuse.
function voip(codec, kbps, ms) {                   // RTP 12 + UDP 8 + IPv4 20 = 40 bytes
  const pay = kbps * 1000 / 8 * ms / 1000, pps = 1000 / ms;
  console.log("9.6 " + codec + " " + ms + " ms: payload " + pay + " B, IP packet " + (pay + 40) +
    " B, " + pps + " pkt/s, IP " + (pay + 40) * 8 * pps / 1000 + " kbps, with Ethernet 18 B " +
    (pay + 58) * 8 * pps / 1000 + " kbps");
}
voip("G.729", 8, 20); voip("G.729", 8, 40);
const delay = [40, 65, 52, 110, 58, 90, 47, 130];  // one-way delay of packets 1..8 (sent every 20 ms)
for (const q of [80, 120]) {
  const late = delay.map((d, i) => d > q ? i + 1 : 0).filter(Boolean);
  console.log("9.7 playout q=" + q + " ms: late packets " + (late.join(", ") || "none") +
    " -> loss " + (100 * late.length / delay.length).toFixed(1) + "%");
}
const R = 1.5, N = 7, n = 4;                       // cell radius km, cluster size, path-loss exponent
console.log("9.8 N=7: D/R=" + Math.sqrt(3 * N).toFixed(3) + "  D=" + (R * Math.sqrt(3 * N)).toFixed(2) +
  " km  S/I=" + (10 * Math.log10(Math.sqrt(3 * N) ** n / 6)).toFixed(2) + " dB");
const ch = Math.floor(25e6 / (2 * 30e3));          // 25 MHz, 30 kHz each way -> duplex channels
console.log("    channels " + ch + ", per cell " + Math.floor(ch / N) + " (" + (ch / N).toFixed(2) + ")");
const valid = [];
for (let i = 0; i <= 4; i++) for (let j = 0; j <= i; j++) if (i + j) valid.push(i * i + i * j + j * j);
const ok = [...new Set(valid)].sort((a, b) => a - b);
const needN = (6 * 10 ** (15 / 10)) ** (2 / n) / 3;          // S/I >= 15 dB
console.log("    valid N: " + ok.filter(x => x <= 16).join(" ") + "; for 15 dB need N >= " +
  needN.toFixed(2) + " -> N=" + ok.find(x => x >= needN));

আউটপুট:

9.6 G.729 20 ms: payload 20 B, IP packet 60 B, 50 pkt/s, IP 24 kbps, with Ethernet 18 B 31.2 kbps
9.6 G.729 40 ms: payload 40 B, IP packet 80 B, 25 pkt/s, IP 16 kbps, with Ethernet 18 B 19.6 kbps
9.7 playout q=80 ms: late packets 4, 6, 8 -> loss 37.5%
9.7 playout q=120 ms: late packets 8 -> loss 12.5%
9.8 N=7: D/R=4.583  D=6.87 km  S/I=18.66 dB
    channels 416, per cell 59 (59.43)
    valid N: 1 3 4 7 9 12 13 16; for 15 dB need N >= 4.59 -> N=7

VoIP-এর দুই লাইনে ২৪/৩১.২ আর ১৬/১৯.৬ kbps; playout-এ ৩টি আর ১টি দেরিতে; cell-এর হিসাবে ৬.৮৭ km, ১৮.৬৬ dB, ৪১৬ আর ৫৯ চ্যানেল। শেষ লাইনটি (i, j) দিয়ে বৈধ N-এর তালিকা বানায় (১, ৩, ৪, ৭, ৯, ১২, ১৩, ১৬) আর ৪.৫৯-এর পরের বৈধ মান ৭ খুঁজে দেয় — হাতে করলে এখানেই ভুল হয়।

নিজে করুন — ভাগ ৯

নি ৯.১(সহজ) RTT ৫০ ms, base আর ১০টি বস্তু — persistent (pipelining ছাড়া) আর pipelining-এ সময়?

(১০ + ২) × ৫০ = ৬০০ ms; ৩ × ৫০ = ১৫০ ms.

নি ৯.২(মাঝারি) উদাহরণ ৯.৩-এর প্রতিষ্ঠানে hit rate ০.৬ হলে গড় delay?

ρ = ০.৪ × ১৪/১৫ ≈ ০.৩৭৩; access = (১/১৫) ÷ ০.৬২৭ ≈ ০.১০৬ s; গড় = ০.৬ × ০.০১ + ০.৪ × (০.০১ + ০.১০৬ + ১) ≈ ০.৪৫৩ সেকেন্ড.

নি ৯.৩(মাঝারি) উদাহরণ ৯.৪-এর মানে N = ১০০০ হলে দুই পদ্ধতির সময়?

Client-server ১০০০ × ২০০০/৫০ = ৪০,০০০ সেকেন্ড; P2P ২০,০০,০০০/(৫০ + ২০০০) ≈ ৯৭৫.৬ সেকেন্ড — F/u = ১০০০-এর ছাদের দিকে এগোচ্ছে।

নি ৯.৪(মাঝারি) Host থেকে local resolver-এর RTT ৫ ms; resolver থেকে root ৪০, TLD ৬০, authoritative ৮০ ms (iterative, cache খালি)। নাম পেতে কত সময়?

৫ + ৪০ + ৬০ + ৮০ = ১৮৫ ms. দ্বিতীয়বার একই নাম খুঁজলে (TTL-এর মধ্যে) শুধু ৫ ms.

নি ৯.৫(সহজ) (i, j) = (৩, ০) হলে cluster size আর D/R?

N = ৯ + ০ + ০ = ৯; D/R = √২৭ ≈ ৫.২০.

১০ · AI-এর যুগে — numerical-এর উত্তর যাচাই

AI-কে একটি subnetting বা CRC-র অঙ্ক দিলে উত্তর আসে পরিষ্কার টেবিলে, আত্মবিশ্বাসী গলায় — আর বেশ প্রায়ই ভুল। ভুলের ধরনও চেনা: block size ঠিক রেখে ভুল গুণিতকে network বসানো, CRC-তে r-এর বদলে r + ১টি শূন্য জোড়া, Shannon-এ dB সরাসরি বসানো, Mbps আর MB/s মেশানো, Reno-র fast recovery-তে বইয়ের আলাদা রীতি চুপচাপ ধরে নেওয়া। এই পাতার ক্যালকুলেটর আর চেক ঠিক এই কাজের জন্য।

AI সাধারণত যেখানে ভুল করে

AI-এর ভুলপরিণামকীভাবে ধরবেন
Subnet-এ ভুল octet-এ block size, বা broadcast-এ শেষ octet ২৫৫ না করাভুল network, overlapBinary AND দিয়ে একবার মিলিয়ে নিন; subnet ক্যালকুলেটর চালান
VLSM-এ ছোট block আগে, বা block নিজের মাপের গুণিতকে না বসানোOverlap বা “জায়গা নেই”প্রতিটি network ÷ block size পূর্ণসংখ্যা কি না দেখুন
CRC-তে শূন্য জুড়তে ভুল, বা XOR-এর বদলে সাধারণ বিয়োগভুল ভাগশেষপ্রাপকের দিক থেকে পুরো frame ভাগ করে ০ আসে কি না দেখুন
Shannon-এ SNR-এর dB মান সরাসরিCapacity অনেক কম10dB/10 রূপান্তর আলাদা লাইনে চেয়ে নিন
Stop-and-wait-এ RTT দেওয়া থাকলেও আবার ২ দিয়ে গুণEfficiency অর্ধেকএকমুখী না দুইমুখী — প্রশ্নের শব্দ মিলিয়ে নিন
Fragment offset byte-এ লেখা, ৮ দিয়ে ভাগ না করাHeader-এর ভুল মানOffset × ৮ = আগের টুকরোগুলোর ডেটার যোগ কি না দেখুন
Slow start-এ cwnd ssthresh ছাড়িয়ে দ্বিগুণ, বা fast recovery-তে নিজের মতো +৩পুরো cwnd টেবিল সরে যায়প্রম্পটে রীতি লিখে দিন; cwnd ক্যালকুলেটরে মিলিয়ে নিন
বানানো RFC নম্বর বা “সব বইয়ে এই সূত্র” জাতীয় দাবিভুল উৎস উদ্ধৃতিRFC Editor-এর সাইটে নম্বর খুঁজে দেখুন; পর্বের সূত্রের সাথে মেলান

AI-কে উত্তরদাতা নয়, যাচাইকারী আর প্রশ্ন-বানানোর সহকারী হিসেবে ব্যবহার করুন:

আমি কম্পিউটার নেটওয়ার্কের numerical অনুশীলন করছি। নিচে প্রশ্ন, নিয়ম আর আমার হাতে করা সমাধান দিলাম। প্রশ্ন: [যেমন: 10.10.0.0/22 থেকে VLSM / CRC-র ডেটা আর generator / cwnd-এর loss-এর round] নিয়ম: 1 Mbps = 10^6 bit/s; s = 2 x 10^8 m/s; VLSM-এ বড় block আগে; Dijkstra-য় tie হলে বর্ণক্রম; Reno-তে ৩ dup ACK-এর পর cwnd = ssthresh; RTO-তে আগে RTTVAR. আমার সমাধান: [টেবিল বা ধাপগুলো পেস্ট করুন] ১. পুরো উত্তর আগে দিও না। আমার সমাধানের প্রথম যে ধাপে ভুল আছে, শুধু সেই ধাপটি বলো। ২. তুমি নিজে হিসাব করলে প্রতিটি একক রূপান্তর আলাদা লাইনে দেখাও (byte → bit, dB → অনুপাত, ms → s). ৩. শেষে একটি চেক দাও: CRC-সহ frame-এর ভাগশেষ ০, checksum-সহ যোগফল 0xFFFF, VLSM-এর মোট ≤ মূল block, বা fragment-এর ডেটার যোগ = মূল ডেটা। ৪. একই নিয়মে একটি নতুন, ফাঁদওয়ালা প্রশ্ন দাও — উত্তর লুকিয়ে রাখো।

যাচাইয়ের চেকলিস্ট

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

প্রতিটি প্রশ্নে খাতায় হিসাব করে তবে উত্তর বাছুন। ভুল হলে কারণসহ ব্যাখ্যা পাবেন।

ক্রমএকটি ঠিকানা/prefix থেকে network, broadcast আর host-সংখ্যা বের করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Prefix থেকে mask লেখা আর কোন octet-এ prefix শেষ হয় তা চেনা
  2. Block size = ২৫৬ − সেই octet-এর mask-মান
  3. Host-এর মানের ঠিক নিচের block-গুণিতক খুঁজে network বের করা
  4. পরের গুণিতক − ১ থেকে broadcast, বাকি octet-গুলো ২৫৫ করে
  5. ব্যবহারযোগ্য পরিসর আর 2h − 2 লিখে binary AND দিয়ে যাচাই

(সহজ) ১০০০ byte-এর একটি packet ৮ Mbps-এর link-এ তুলতে transmission delay কত?

  • 1 ms
  • 0.125 ms
  • 8 ms
  • 64 ms

(মাঝারি) ৩ kHz bandwidth-এর একটি চ্যানেলে SNR = ৩০ dB. Shannon capacity প্রায় কত?

  • ≈ 14.9 kbps
  • ≈ 29.9 kbps
  • 6 kbps
  • 90 kbps

(মাঝারি) ডেটা 1001, generator 1011 (x3 + x + 1). ডেটার শেষে কোন CRC বসবে?

  • 000
  • 010
  • 110
  • 1110

(সহজ) Host 192.168.40.200/28 যে subnet-এ আছে, তার broadcast ঠিকানা কী?

  • 192.168.40.255
  • 192.168.40.192
  • 192.168.40.208
  • 192.168.40.207

(মাঝারি) ৪ bit-এর sequence নম্বরে Selective Repeat-এর সর্বোচ্চ window কত?

  • 8
  • 15
  • 16
  • 7

(মাঝারি) Slotted ALOHA-তে offered load G = ২ হলে throughput S প্রায় কত (Poisson মডেল)?

  • 0.368
  • 0.271
  • 0.037
  • 0.135

(কঠিন) SRTT = ১০০ ms, RTTVAR = ২০ ms. নতুন নমুনা R = ১৪০ ms. RFC 6298-এর ক্রমে (আগে RTTVAR, পুরোনো SRTT দিয়ে; α = 1/8, β = 1/4) নতুন RTO কত (১ সেকেন্ডের নিম্নসীমা বাদ দিয়ে)?

  • 180 ms
  • 200 ms
  • 205 ms
  • 240 ms

(কঠিন) F = ১০০০ Mbit, সার্ভারের আপলোড ১০০ Mbps, সবচেয়ে ধীর peer-এর ডাউনলোড ৫০ Mbps, ২০টি peer-এর প্রত্যেকের আপলোড ১০ Mbps. P2P-তে ন্যূনতম বিতরণ-সময় কত?

  • 200 s
  • 20 s
  • 10 s
  • ≈ 66.7 s

শব্দকোষ

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

মনে রাখুন

  1. একক আর নিয়ম আগে: byte → bit, dB → অনুপাত, ms → s, RTT না একমুখী — উত্তরের প্রথম লাইনে লিখুন; নিয়ম বদলালে উত্তর বদলায়।
  2. Delay আর সংকেত: L/R আর d/s আলাদা; throughput = সবচেয়ে সরু link; BDP = R × RTT আর window ≥ BDP; Shannon দিয়ে সীমা, Nyquist দিয়ে স্তর।
  3. Error আর data link: CRC-তে r টি শূন্য আর XOR, প্রাপকের ভাগশেষ ০; Hamming-এ syndrome = ভুলের অবস্থান; U = W/(1 + 2a), GBN 2m − 1, SR 2m−1; ALOHA ১/(২e) আর ১/e; Lmin = 2RTprop.
  4. IP আর routing: block size দিয়ে network/broadcast, VLSM-এ বড় আগে, summary-র বাড়তি জায়গা খেয়াল; offset ৮-এর এককে; LPM-এ লম্বা prefix জেতে; Dijkstra-র টেবিলে tie-নিয়ম লিখুন।
  5. TCP আর উপরের স্তর: ACK = পরের প্রত্যাশিত byte; RTO-তে আগে RTTVAR; cwnd slow start-এ ssthresh-এ থামে; HTTP-তে base-এর ২ RTT; cache-এ ρ × (১ − h); VoIP-এ header ৪০ byte. শেষে ক্যালকুলেটরে মিলিয়ে নিন।

পরের পর্বে: পুরো কোর্সের MCQ প্রশ্নব্যাংক — মডিউল ধরে সাজানো, প্রতিটি অপশনের ব্যাখ্যাসহ। এই পাতার হিসাবগুলো সেখানে দ্রুত সিদ্ধান্তে কাজে লাগবে।

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

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