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

Network layer — forwarding, routing আর router-এর ভেতর

The Network Layer — Forwarding vs Routing, Data & Control Planes, Best-Effort Service and Inside a Router

Taught in Bangla, this lesson explains the network layer's host-to-host job, forwarding versus routing and the data and control planes, datagram and virtual-circuit service and the Internet's best-effort model, destination-based forwarding with longest prefix match, the four parts of a router, where queues build up with head-of-line blocking and bufferbloat, packet scheduling, and a datagram's hop-by-hop journey.

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

  • Network layer ঠিক কোন সমস্যার সমাধান করে, আর ইন্টারনেট কেন “best effort”
  • Forwarding বনাম routing, data plane বনাম control plane — প্রচলিত router আর SDN-এর পার্থক্য
  • Longest prefix match দিয়ে forwarding table থেকে output port বাছাই — হাতে আর কোডে
  • Router-এর ভেতর: input port, switching fabric, output queue, head-of-line blocking, buffer-এর আকার, RED আর CoDel
  • FIFO, priority, round robin আর WFQ scheduling, আর hop-by-hop যাত্রায় TTL, checksum আর MAC-এর বদল

১ · Network layer-এর কাজ — অনেক link পেরিয়ে host থেকে host

মডিউল ২-এ দেখেছেন একটি link-এর ভেতরের সব কিছু: সংকেত, frame, ত্রুটি ধরা, আর switch কীভাবে MAC দেখে LAN-এর ভেতরে frame পাঠায় (পর্ব ১২)। কিন্তু আপনার ফোন থেকে একটি ওয়েবসাইটের সার্ভার পর্যন্ত পথে থাকে বাসার Wi-Fi, ISP-র fiber, দেশের backbone, হয়তো সমুদ্রের নিচের কেবল — একেকটি আলাদা link, আলাদা প্রযুক্তি। এই পুরো যাত্রা যে স্তর সামলায়, সেটিই network layer (OSI-র স্তর ৩, TCP/IP-তে Internet স্তর; পর্ব ০৩)। ইন্টারনেটে এর protocol IP.

পঞ্চগড়ের এক গ্রাম থেকে কক্সবাজারে একটি চিঠি পাঠাচ্ছেন। গ্রামের ডাকঘর জানে না কক্সবাজারের কোন গলিতে প্রাপকের বাড়ি — সে শুধু জানে “দক্ষিণের চিঠি জেলা সদরের বড় ডাকঘরে যায়”. জেলা সদর জানে “চট্টগ্রাম বিভাগের চিঠি ঢাকার বাছাই কেন্দ্রে”. প্রতিটি ডাকঘর খামের ওপরের ঠিকানা দেখে শুধু পরের ডাকঘরটি ঠিক করে, আর এক ডাকঘর থেকে আরেক ডাকঘরে চিঠি যায় যেকোনো বাহনে — ভ্যান, ট্রেন, বাস। প্রতিটি ডাকঘর একটি router, খামের ঠিকানা IP ঠিকানা, আর প্রতিটি বাহন একটি link. ডাকঘর চেষ্টা করে, কিন্তু কবে পৌঁছাবে বা আদৌ পৌঁছাবে কি না — লিখিত কোনো নিশ্চয়তা দেয় না।

তিনটি স্তরের কাজ পাশাপাশি রাখলে পার্থক্যটি পরিষ্কার হয়:

স্তরকার থেকে কার কাছেঠিকানাকোন যন্ত্র পড়ে
Data link (পর্ব ১০–১৪)একই link-এর এক যন্ত্র থেকে পাশের যন্ত্রে — একটি hopMACSwitch, NIC, access point
Network (এই মডিউল)উৎস host থেকে গন্তব্য host — অনেক hopIP ঠিকানাRouter আর host
Transport (মডিউল ৫)একটি host-এর একটি প্রোগ্রাম থেকে অন্য host-এর একটি প্রোগ্রামেPort নম্বরশুধু দুই প্রান্তের host

প্রতিটি host আর router-এ network layer থাকে; সাধারণ switch-এ থাকে না (ব্যতিক্রম layer-3 switch, পর্ব ১৩)। Router সাধারণত নিচের তিন স্তর পর্যন্তই খোলে (পর্ব ০৩-এর encapsulation).

 Host A                 R1             R2              Host B
┌───────────┐                                       ┌───────────┐
│Application│                                       │Application│
│Transport  │                                       │Transport  │
│Network    │──────▶ ┌───────┐ ──▶ ┌───────┐ ─────▶ │Network    │
│Data link  │        │Network│     │Network│        │Data link  │
│Physical   │        │Link   │     │Link   │        │Physical   │
└───────────┘        │Phys   │     │Phys   │        └───────────┘
                     └───────┘     └───────┘
   link 1 (Wi-Fi)    link 2 (fiber)   link 3 (Ethernet)

Network layer-এর দুটি মূল কাজ

Forwarding

একটি router-এর input port-এ packet এলো — কোন output port দিয়ে বের হবে? প্রতিটি packet-এর জন্য, প্রতিটি router-এ আলাদাভাবে, খুব দ্রুত এই সিদ্ধান্ত। মোড়ের ট্রাফিক পুলিশের হাতের ইশারা।

স্থানীয় · প্রতি packet

Routing

উৎস থেকে গন্তব্য পর্যন্ত পুরো পথ কোনটি হবে? পুরো নেটওয়ার্কের খবর মিলিয়ে প্রতিটি router-এর টেবিল বানানো। শহরের ট্রাফিক বিভাগের রুট-পরিকল্পনা — কোন রাস্তা একমুখী, কোথায় ঘুরপথ।

নেটওয়ার্ক-জুড়ে · টেবিল বানানো

বাকি দায়িত্বগুলো এই মডিউলের আলাদা পর্বে: ঠিকানা আর IPv4 header (পর্ব ১৬), subnet (পর্ব ১৭), DHCP ও ARP (পর্ব ১৮), NAT (পর্ব ১৯), ICMP (পর্ব ২০) আর IPv6 (পর্ব ২১)। এই পর্বের লক্ষ্য পুরো স্তরের কাঠামো — বিশেষ করে router ভেতরে আসলে কী করে।

২ · Forwarding বনাম routing — data plane আর control plane

পরীক্ষা আর ইন্টারভিউতে সবচেয়ে বেশি গুলিয়ে ফেলা জোড়া এটি। Forwarding যে টেবিল দেখে কাজ করে তার নাম forwarding table; routing-এর কাজ সেই টেবিল ভরা।

বিষয়Forwarding (data plane)Routing (control plane)
প্রশ্নএই packet কোন output port দিয়ে যাবে?এই গন্তব্যে যাওয়ার সবচেয়ে ভালো পথ কোনটি?
পরিসরএকটি router-এর ভেতরেপুরো নেটওয়ার্ক (অনেক router মিলে)
কত ঘন ঘনপ্রতিটি packet-এTopology বদলালে, বা নিয়মিত বিরতিতে
সময়ের মাপন্যানোসেকেন্ড (একশো কোটি ভাগের এক সেকেন্ড)মিলিসেকেন্ড থেকে সেকেন্ড, কখনো মিনিট
কোথায় চলেLine card-এর বিশেষ hardware (ASIC, TCAM)Routing processor-এর CPU-তে software
ইনপুট → আউটপুটPacket + forwarding table → output portপ্রতিবেশীদের বার্তা → forwarding table
উদাহরণLongest prefix match (অংশ ৪)OSPF, BGP, RIP (মডিউল ৪)

ন্যানোসেকেন্ড কেন — একটি হিসাব

একটি ১০০ Gbps Ethernet port-এ সবচেয়ে ছোট frame (৬৪ byte) একটার পর একটা এলে, তারে প্রতিটি frame নেয় ৬৪ + ৮ (preamble) + ১২ (দুই frame-এর মাঝের ফাঁক) = ৮৪ byte = ৬৭২ bit. তাই প্রতি সেকেন্ডে frame আসে ১০০ × ১০৯ ÷ ৬৭২ ≈ ১৪ কোটি ৮৮ লক্ষ, আর একটি packet-এর জন্য সময় মাত্র ৬৭২ ÷ (১০০ × ১০৯) সেকেন্ড = ৬.৭২ ন্যানোসেকেন্ড. এই সময়ের মধ্যে টেবিল খোঁজা, TTL কমানো, checksum বদলানো — সব। কোনো সাধারণ CPU-র software এই গতিতে প্রতিটি packet দেখতে পারে না; তাই forwarding হয় বিশেষ chip-এ। অন্যদিকে routing-এর হিসাব (কোন পথ সবচেয়ে ভালো) কয়েক সেকেন্ডে একবার হলেই চলে — সেটি CPU-তে software.

RIB আর FIB — এক router-এর ভেতরে দুই টেবিল

বাস্তব router-এ দুটি টেবিল থাকে। Routing protocol-গুলো যা শেখে, সব জমা হয় routing processor-এর RIB (Routing Information Base)-এ। সেখান থেকে প্রতিটি গন্তব্যের সেরা পথ বেছে, দ্রুত খোঁজার উপযোগী আকারে কপি হয় প্রতিটি line card-এর FIB (Forwarding Information Base)-এ — forwarding table বলতে সাধারণত এটিই। দৈনন্দিন ভাষায় routing table শব্দটি দুটিকেই বোঝায় (পর্ব ০৬)।

Control plane কোথায় থাকবে — প্রতিটি router-এ, না এক জায়গায়?

প্রচলিত পদ্ধতি — প্রতিটি router-এ

প্রতিটি router-এ data plane আর control plane দুটোই। Router-গুলো প্রতিবেশীদের সাথে routing protocol-এর বার্তা বিনিময় করে, প্রত্যেকে নিজে নিজের টেবিল হিসাব করে। কোনো কেন্দ্র নেই — একটি router নষ্ট হলে বাকিরা নিজেরাই নতুন পথ খুঁজে নেয়। ইন্টারনেটের বেশিরভাগ অংশ আজও এভাবে চলে।

বিকেন্দ্রীভূত · মডিউল ৪

SDN — যৌক্তিকভাবে কেন্দ্রীভূত controller

SDN (Software-Defined Networking)-এ router বা switch শুধু data plane রাখে। একটি দূরের controller (যা আসলে কয়েকটি সার্ভারের একটি দল হতে পারে, তাই “যৌক্তিকভাবে” কেন্দ্রীভূত) পুরো নেটওয়ার্কের ছবি দেখে প্রতিটি যন্ত্রের টেবিল হিসাব করে পাঠিয়ে দেয়। নকশা আর নতুন নীতি software-এ লেখা যায়।

কেন্দ্রীভূত · পর্ব ৫৩
মূল ধারণা

Forwarding হলো করা, routing হলো ঠিক করা। Data plane প্রতিটি packet-এ টেবিল দেখে কাজ করে; control plane মাঝে মাঝে টেবিল বদলায়। দুটিকে আলাদা করে ভাবলেই router-এর নকশা, SDN আর মডিউল ৪-এর routing algorithm — সব জায়গায় পরিষ্কার থাকবেন।

৩ · Datagram, virtual circuit আর ইন্টারনেটের service model

পর্ব ০৪-এ packet switching-এর দুই ঘরানা দেখেছেন। সংক্ষেপে মনে করিয়ে দিই, কারণ network layer-এর নকশা এই সিদ্ধান্ত থেকেই শুরু:

  • Datagram নেটওয়ার্ক (ইন্টারনেটের IP): কোনো আগাম setup নেই। প্রতিটি packet-এ পুরো গন্তব্য ঠিকানা; router প্রতিটি packet আলাদাভাবে দেখে, কোনো সংযোগ মনে রাখে না। একই কথোপকথনের দুটি packet আলাদা পথে যেতে পারে, আগে-পরে পৌঁছাতে পারে।
  • Virtual circuit (VC) নেটওয়ার্ক: ডেটার আগে setup; পথের প্রতিটি router সেই সংযোগের একটি টেবিল-লাইন রাখে; packet-এ ছোট একটি VC নম্বর বা label. পুরোনো X.25 (১৯৭০-এর দশকে CCITT-র মান), পরে Frame Relay, নব্বইয়ের দশকে টেলিফোন কোম্পানিগুলোর বড় আশা ATM, আর আজ ISP-র ভেতরে MPLS (স্থাপত্য RFC 3031, ২০০১) এই ঘরানার।

Service model — নেটওয়ার্ক কী কী প্রতিশ্রুতি দেয়

একটি network layer-এর service model বলে, প্রেরকের হাত থেকে packet নিয়ে নেটওয়ার্ক কী কী নিশ্চয়তা দেবে। সম্ভাব্য প্রতিশ্রুতির তালিকা আর ইন্টারনেটের উত্তর:

সম্ভাব্য নিশ্চয়তামানেইন্টারনেট (IP, best effort)ATM-এর CBR সেবা (নকশায়)
নিশ্চিত পৌঁছানোPacket হারাবে নানাচুক্তিতে নির্দিষ্ট সীমার মধ্যে loss
সীমিত delayযেমন “১০০ ms-এর মধ্যে”নাহ্যাঁ
ক্রম বজায়যে ক্রমে পাঠানো, সে ক্রমে পৌঁছানোনাহ্যাঁ
ন্যূনতম bandwidthযেমন “সবসময় ২ Mbps”নাহ্যাঁ (স্থির হার)
নিরাপত্তাগোপনীয়তা, অক্ষততানা (IPsec, TLS আলাদা, মডিউল ৮)না

ইন্টারনেটের উত্তর প্রায় সব ঘরে “না”. একে বলে best effort — “যথাসাধ্য চেষ্টা করব, কিন্তু কিছুর নিশ্চয়তা নেই”. শুনতে দুর্বল লাগে, কিন্তু এটিই ইন্টারনেটের সাফল্যের একটি বড় কারণ:

  • সরল মাঝখান, বুদ্ধি প্রান্তে: হারানো packet আবার পাঠানো, ক্রম ঠিক করা, গতি নিয়ন্ত্রণ — এসব দুই প্রান্তের TCP করে (মডিউল ৫), পর্ব ০৩-এর end-to-end principle. Router কোনো সংযোগ মনে রাখে না, তাই সে সস্তা, দ্রুত, আর একটি নষ্ট হলে packet অন্য পথে যায়।
  • যেকোনো link-এর ওপর চলে: IP শুধু চায় “একটি packet এক hop পার করানো” — Wi-Fi, fiber, স্যাটেলাইট, মোবাইল, সবাই এটুকু পারে। কঠিন নিশ্চয়তা চাইলে প্রতিটি link-কেও সেই নিশ্চয়তা দিতে হতো।
  • বাস্তবে যথেষ্ট ভালো: বেশি bandwidth, CDN (পর্ব ৩৮), TCP-র congestion control (পর্ব ৩২) আর ভিডিও অ্যাপের মান বদলে নেওয়া মিলে best effort-এও ভিডিও কল চলে। অগ্রাধিকার সত্যিই দরকার হলে QoS (পর্ব ২৬)।

১৯৮৮ সালে MIT-র David Clark “The Design Philosophy of the DARPA Internet Protocols” প্রবন্ধে লেখেন, ইন্টারনেটের নকশায় সবচেয়ে বড় অগ্রাধিকার ছিল আলাদা আলাদা নেটওয়ার্ক জোড়া লাগানো, আর তার পরেই — নেটওয়ার্কের কিছু অংশ নষ্ট হলেও যোগাযোগ চালু রাখা। মাঝের যন্ত্রে সংযোগের state থাকলে সেই যন্ত্র নষ্ট হলেই সংযোগ মরে যায়; state শুধু প্রান্তে থাকলে মাঝের যন্ত্র বদলালেও চলে। Clark এই ধারণাকে বলেছিলেন “fate-sharing”. লক্ষ্যের তালিকায় “নিশ্চিত bandwidth বা delay” ছিল না; বরং নানা ধরনের সেবা আর নানা ধরনের নেটওয়ার্ক সামলাতে IP-কে যতটা সম্ভব সাধারণ রাখা হয়েছিল — TCP আর IP-কে আলাদা করার পেছনেও এই চিন্তা ছিল। এভাবেই ইন্টারনেট best effort.

৪ · গন্তব্য দেখে forwarding — longest prefix match

IPv4 ঠিকানা ৩২ bit, অর্থাৎ ২৩২ ≈ ৪৩০ কোটি সম্ভাব্য ঠিকানা। প্রতিটি ঠিকানার জন্য forwarding table-এ একটি সারি রাখা অসম্ভব। তাই টেবিলে থাকে ঠিকানার prefix — ঠিকানার শুরুর কিছু bit, যা একটি পুরো দলকে বোঝায়। ঠিক যেমন ডাকঘরের বাছাইকারী পুরো ঠিকানা না পড়ে শুধু জেলার নাম দেখে বস্তায় চিঠি ফেলেন। লেখার ধরন 198.51.100.0/24: “/24” মানে প্রথম ২৪ bit (এখানে 198.51.100) মিললেই এই সারি প্রযোজ্য; শেষের ৮ bit যা-ই হোক। এই লেখার নিয়ম (CIDR) আর ঠিকানার হিসাব বিস্তারিত পর্ব ১৬–১৭-এ; এখানে শুধু lookup-এর নিয়মটি।

সমস্যা হলো, একটি গন্তব্য টেবিলের একাধিক সারির সাথে মিলতে পারে। নিয়ম: longest prefix match — যে সারির prefix সবচেয়ে লম্বা, অর্থাৎ সবচেয়ে নির্দিষ্ট, সেটিই জেতে। খামে যদি লেখা থাকে “চট্টগ্রাম বিভাগের সব চিঠি কুমিল্লা হয়ে”, আবার আলাদা নির্দেশ থাকে “কক্সবাজার সদরের চিঠি সরাসরি কক্সবাজারের বাসে” — কক্সবাজার সদরের চিঠির জন্য দ্বিতীয় নির্দেশটিই প্রযোজ্য, কারণ তা বেশি নির্দিষ্ট। আর 0.0.0.0/0 (প্রথম ০ bit মিলতে হবে, অর্থাৎ সব ঠিকানা মেলে) হলো default route — “অন্য কিছু না মিললে এদিকে”, পর্ব ০৬-এর default gateway.

Router R1-এর forwarding table (সব ঠিকানা documentation-এর জন্য সংরক্ষিত range থেকে):

Prefixশেষ byte-এর পরিসরOutput interface
0.0.0.0/0সব ঠিকানা (default)eth0 (ISP-র দিকে)
198.51.100.0/24198.51.100.0 – .255eth1
198.51.100.128/25.128 – .255eth2
198.51.100.192/26.192 – .255eth3
198.51.100.224/27.224 – .255eth4
203.0.113.0/24203.0.113.0 – .255eth4

গন্তব্য 198.51.100.200-এর জন্য R1 কী করে, bit ধরে দেখি। প্রথম ২৪ bit সব 198.51.100-এর সারিতে একই, তাই আসল লড়াই শেষ byte-এ: ২০০ = বাইনারি 11001000.

গন্তব্যের শেষ byte: 200 = 11001000
0.0.0.0/0 → eth0
.0/24 → eth1
.128/25 → eth2
.192/26 → eth3
.224/27 → eth4
এ পর্যন্ত সবচেয়ে লম্বা মিল
  1. শুরু: default সবসময় মেলে। /0 সারিতে তুলনার কোনো bit নেই, তাই যেকোনো গন্তব্য মেলে — “শেষ ভরসা”. শেষ byte 11001000 হাতে রেখে বাকি সারি দেখা শুরু।
  2. /24: প্রথম ২৪ bit. গন্তব্যের প্রথম তিন byte 198.51.100, সারিরও তাই — মিলেছে। প্রার্থী eth1. শেষ byte এখানে দেখাই হয় না।
  3. /25: আরও এক bit. ২৫তম bit মানে শেষ byte-এর প্রথম bit. গন্তব্যে 1, সারির 128 = 10000000-এও 1 — মিলেছে। এখন সবচেয়ে লম্বা মিল /25.
  4. /26: প্রথম দুই bit. গন্তব্যের 11001000 আর 192 = 11000000 — প্রথম দুই bit একই। মিলেছে, সবচেয়ে লম্বা মিল এখন /26 → eth3.
  5. /27: প্রথম তিন bit — এখানে আটকে গেল। গন্তব্যের 110, কিন্তু 224 = 11100000. তৃতীয় bit আলাদা, তাই বাদ — ২০০ সংখ্যাটি .224–.255-এর মধ্যে পড়েও না।
  6. বিজয়ী /26 → eth3. চারটি সারি মিলেছে (/0, /24, /25, /26); সবচেয়ে লম্বা /26, তাই packet যাবে eth3 দিয়ে। যুক্তি: বড় দলের ভেতরে ছোট দলের জন্য আলাদা সারি বসানো মানেই সেই ছোট দলের packet আলাদা পথে পাঠানোর ইচ্ছা।

এবার একই টেবিল দিয়ে ছয়টি গন্তব্যের lookup একসাথে। Simulator প্রতিটি গন্তব্যের সাথে কোন কোন prefix মিলল আর কোনটি জিতল, তা ছাপে। mask(len) প্রথম lenটি bit ১ রেখে বাকিগুলো ০ করে; গন্তব্যের সাথে AND করলে যদি সারির network ঠিকানা পাওয়া যায়, তবে মিল।

// Forwarding table of router R1: prefix -> output interface.
const table = [
  ["0.0.0.0/0", "eth0"],          // default route (towards the ISP)
  ["198.51.100.0/24", "eth1"],
  ["198.51.100.128/25", "eth2"],
  ["198.51.100.192/26", "eth3"],
  ["198.51.100.224/27", "eth4"],
  ["203.0.113.0/24", "eth4"],
];
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const mask = len => len === 0 ? 0 : (0xffffffff << (32 - len)) >>> 0;
const rows = table.map(([p, ifc]) => {
  const [net, len] = p.split("/");
  return { p, ifc, len: Number(len), net: toInt(net) };
});
function lookup(dst) {
  const d = toInt(dst);
  const hits = rows.filter(r => ((d & mask(r.len)) >>> 0) === r.net);
  const best = hits.reduce((a, b) => (b.len > a.len ? b : a));
  console.log(dst.padEnd(15) + " matches: " + hits.map(h => "/" + h.len).join(" ").padEnd(18) +
    " -> " + best.p.padEnd(18) + " " + best.ifc);
}
["198.51.100.200", "198.51.100.230", "198.51.100.150",
 "198.51.100.10", "203.0.113.9", "192.0.2.99"].forEach(lookup);

আউটপুট:

198.51.100.200  matches: /0 /24 /25 /26     -> 198.51.100.192/26  eth3
198.51.100.230  matches: /0 /24 /25 /26 /27 -> 198.51.100.224/27  eth4
198.51.100.150  matches: /0 /24 /25         -> 198.51.100.128/25  eth2
198.51.100.10   matches: /0 /24             -> 198.51.100.0/24    eth1
203.0.113.9     matches: /0 /24             -> 203.0.113.0/24     eth4
192.0.2.99      matches: /0                 -> 0.0.0.0/0          eth0

প্রথম লাইন stepper-এর ফল: চারটি মিল, জেতে /26 → eth3. .230-এর শেষ byte 11100110 — প্রথম তিন bit 111, তাই /27-ও মেলে আর পাঁচটির মধ্যে সেটিই জেতে (eth4). .150 = 10010110: প্রথম bit ১ (/25 মেলে), কিন্তু দ্বিতীয় bit ০, তাই /26 মেলে না → eth2. .10-এর প্রথম bit ০, তাই শুধু /24 → eth1. 203.0.113.9 নিজের /24-এ → eth4 — লক্ষ করুন, দুটি আলাদা prefix একই interface-এ যেতে পারে। আর 192.0.2.99-এর জন্য default ছাড়া কিছু মেলেনি → eth0, ISP-র দিকে। নিজে চেষ্টা করুন: টেবিলে ["198.51.100.200/32", "eth5"] যোগ করলে প্রথম লাইনের ফল কী হবে, আগে খাতায় ভাবুন, তারপর চালিয়ে দেখুন।

সাবধান — firewall-এর নিয়ম আলাদা: forwarding table-এ সারির ক্রম কোনো ব্যাপার না, জেতে সবচেয়ে লম্বা prefix. কিন্তু router-এর ACL বা firewall-এর নিয়মে সাধারণত প্রথম মেলা নিয়মটি জেতে (first match) — সেখানে ক্রমই সব (পর্ব ৪৯)। দুটি গুলিয়ে ফেলা খুব প্রচলিত ভুল।

বড় ISP-র router-এর টেবিলে প্রায় দশ লক্ষ IPv4 prefix, আর lookup করতে হয় কয়েক ন্যানোসেকেন্ডে — সারি একে একে দেখা চলে না। তাই ব্যবহার হয় TCAM নামের বিশেষ মেমরি, যা এক ধাপে সব সারির সাথে তুলনা করে, অথবা bit ধরে নিচে নামা গাছের মতো কাঠামো (trie) — Linux kernel-ও trie ব্যবহার করে (/proc/net/fib_trie). Static route আর lookup-এর algorithm পর্ব ২২-এ।

আপনার কম্পিউটারও একটি ছোট router

প্রতিটি host-এরও একটি forwarding table আছে — সাধারণত দুটি-তিনটি সারি: নিজের LAN সরাসরি, আর বাকি সব default gateway দিয়ে। Linux-এ ip route দেখায় মূল টেবিল (main), আর ip -4 route show table all দেখায় সব টেবিল, এমনকি kernel-এর নিজের ঠিকানাগুলোর “local” টেবিলও। ip route get kernel-কে জিজ্ঞেস করে, “এই ঠিকানায় packet পাঠালে কোন সারি জিতবে?” — কোনো packet না পাঠিয়েই। নিচের স্ক্রিপ্ট এই পাতার কোড-চালানোর container-এ এগুলো চালায়, তারপর /proc/net/route-এর hex নিজের হাতে decode করে (পর্ব ০৬-এর মতো উল্টো byte ক্রমে, আর mask-এর ১ bit গুনে prefix-এর দৈর্ঘ্য):

hex2ip() { local h=$1; printf '%d.%d.%d.%d' "0x${h:6:2}" "0x${h:4:2}" "0x${h:2:2}" "0x${h:0:2}"; }
masklen() { local m=$(( 16#$1 )) n=0; while [ "$m" -gt 0 ]; do n=$(( n + (m & 1) )); m=$(( m >> 1 )); done; echo "$n"; }
if command -v ip >/dev/null; then
  echo "== ip route  (main table) =="
  ip route
  echo "== ip -4 route show table all =="
  ip -4 route show table all
  echo "== ip route get: which entry wins? =="
  for d in 10.0.2.77 192.0.2.1 127.8.8.8; do ip route get "$d" | head -n 1; done
else
  echo "ip নেই — শুধু /proc/net/route দেখানো হচ্ছে"
fi
echo "== /proc/net/route decoded by hand =="
printf '  %-6s %-15s %-12s %-4s %s\n' Iface Destination Gateway Flags Prefix
while read -r ifc dst gw flags _ _ _ msk _; do
  printf '  %-6s %-15s %-12s %-4s /%s  (raw %s %s %s)\n' "$ifc" "$(hex2ip "$dst")" \
    "$(hex2ip "$gw")" "$flags" "$(masklen "$msk")" "$dst" "$gw" "$msk"
done < <(tail -n +2 /proc/net/route)

আসল রানের আউটপুট:

== ip route  (main table) ==
default via 10.0.2.2 dev tap0
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.100
== ip -4 route show table all ==
default via 10.0.2.2 dev tap0
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.100
local 10.0.2.100 dev tap0 table local proto kernel scope host src 10.0.2.100
broadcast 10.0.2.255 dev tap0 table local proto kernel scope link src 10.0.2.100
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
== ip route get: which entry wins? ==
10.0.2.77 dev tap0 src 10.0.2.100 uid 999
192.0.2.1 via 10.0.2.2 dev tap0 src 10.0.2.100 uid 999
local 127.8.8.8 dev lo src 127.0.0.1 uid 999
== /proc/net/route decoded by hand ==
  Iface  Destination     Gateway      Flags Prefix
  tap0   0.0.0.0         10.0.2.2     0003 /0  (raw 00000000 0202000A 00000000)
  tap0   10.0.2.0        0.0.0.0      0001 /24  (raw 0002000A 00000000 00FFFFFF)

main টেবিল: মাত্র দুটি সারি — 10.0.2.0/24 সরাসরি tap0-এ (proto kernel: ঠিকানা বসানোর সময় kernel নিজেই যোগ করেছে), আর বাকি সব default via 10.0.2.2. একটি host-এর forwarding table সাধারণত এমনই ছোট। table all: সাথে আসে local টেবিল — kernel-এর নিজের ঠিকানা (10.0.2.100 আর পুরো 127.0.0.0/8) আর broadcast ঠিকানা। Linux এই local টেবিল main-এর আগে দেখে, তাই নিজের ঠিকানার packet কখনো তারে যায় না।

route get: 10.0.2.77-এর সাথে /24 আর /0 দুটোই মেলে, জেতে /24 — তাই gateway ছাড়া সরাসরি। 192.0.2.1-এর সাথে মেলে শুধু /0, তাই via 10.0.2.2. 127.8.8.8 মেলে local টেবিলের 127.0.0.0/8-এ — loopback. ঠিক longest prefix match. (uid 999 হলো কমান্ড চালানো ব্যবহারকারীর id.) /proc/net/route: শুধু main টেবিল, hex-এ উল্টো byte ক্রমে (little-endian): 0202000A → 10.0.2.2; mask 00FFFFFF-এ ২৪টি ১ bit → /24; flags 0003 = U (চালু) + G (gateway দিয়ে), 0001 = শুধু U. সব ঠিকানাই rootless container-এর private ঠিকানা (পর্ব ০৬)। ip না থাকলে স্ক্রিপ্ট শুধু শেষ অংশটি দেখাত।

গন্তব্য ছাড়িয়ে — generalised forwarding (match-plus-action)

এতক্ষণ forwarding মানে ছিল “গন্তব্য IP দেখে port বাছাই”. কিন্তু একটু বড় করে ভাবলে switch, router, firewall আর NAT — সবাই একই কাজ করে: packet-এর header-এর কিছু ঘর মেলানো, তারপর একটি কাজ করা। Switch মেলায় গন্তব্য MAC, router গন্তব্য IP, firewall port নম্বর, NAT ঠিকানা মিলিয়ে বদলে দেয়। এই সাধারণ ধারণার নাম match-plus-action, আর এভাবে forwarding-কে বলে generalised forwarding. ২০০৮ সালের OpenFlow প্রস্তাব এই ধারণাকে একটি খোলা মানে রূপ দেয়: যন্ত্রের ভেতরে একটি flow table, যার প্রতিটি সারিতে মেলানোর ঘর, অগ্রাধিকার, কাজ আর counter, আর সারিগুলো বসায় SDN controller.

অগ্রাধিকারMatchActionযে যন্ত্রের মতো আচরণ
৩০০গন্তব্য TCP port 23 (Telnet)DropFirewall
২০০গন্তব্য IP 198.51.100.192/26Port 3 দিয়ে পাঠানোRouter
১০০গন্তব্য MAC 02:00:00:00:00:0bPort 5 দিয়ে পাঠানোSwitch
১০উৎস IP 192.0.2.10, গন্তব্য port 80উৎস ঠিকানা বদলে port 1 দিয়ে পাঠানোNAT-এর মতো
০বাকি সবController-কে পাঠানো“কী করব জিজ্ঞেস করি”

নিয়ম মেলে অগ্রাধিকার ধরে, আর প্রতিটি সারির counter গোনে কতগুলো packet মিলেছে। SDN আর OpenFlow-এর বিস্তারিত পর্ব ৫৩-এ।

৫ · Router-এর ভেতরে — চারটি অংশ

বাইরে থেকে router একটি বাক্স, পেছনে অনেকগুলো port. ভেতরে চারটি অংশ, আর বড় router-এ প্রতিটি port-এর দল একটি আলাদা বোর্ডে থাকে, যার নাম line card.

                   ┌──────────────────────┐
                   │  Routing processor   │  control plane: OSPF/BGP, RIB,
                   │  (CPU, software)     │  FIB হিসাব করে line card-এ পাঠায়
                   └──────────┬───────────┘
                              │ FIB-এর কপি
 ┌─────────────────┐   ┌──────┴───────┐   ┌──────────────────┐
 │ Input port eth1 │──▶│              │──▶│ Output port eth3 │──▶ তার
 │ line term. │ L2 │   │  Switching   │   │ queue │ L2 │ tx  │
 │ lookup │ queue  │   │   fabric     │   └──────────────────┘
 └─────────────────┘   │              │   ┌──────────────────┐
 ┌─────────────────┐   │ (memory/bus/ │──▶│ Output port eth4 │──▶ তার
 │ Input port eth2 │──▶│  crossbar)   │   └──────────────────┘
 └─────────────────┘   └──────────────┘
 ◀──────────────── data plane (hardware, ns) ─────────────────▶

Input port

তিন কাজ: (১) physical স্তরে তারের সংকেত থেকে bit (line termination), (২) data link স্তরে frame খোলা আর FCS মেলানো, (৩) সবচেয়ে গুরুত্বপূর্ণ — FIB-এর নিজস্ব কপিতে lookup করে output port ঠিক করা। Fabric ব্যস্ত থাকলে packet এখানে লাইনে দাঁড়ায়।

“কোথায় যাবে” এখানেই ঠিক হয়

Switching fabric

Input port থেকে output port-এ packet সরানোর ভেতরের রাস্তা। এর গতিই ঠিক করে router একসাথে কত packet পার করতে পারবে।

router-এর ভেতরের নেটওয়ার্ক

Output port

Fabric থেকে আসা packet-কে buffer-এ রাখে, scheduler ঠিক করে কে আগে যাবে, তারপর নতুন frame বানিয়ে (নতুন MAC, নতুন FCS) তারে পাঠায়।

queue, scheduling, transmission

Routing processor

Control plane: routing protocol চালায়, RIB রাখে, FIB হিসাব করে line card-গুলোতে পাঠায়। SSH আর নজরদারির কাজও (management) এখানে। SDN-এ এর অনেকটা কাজ দূরের controller-এর।

মস্তিষ্ক, কিন্তু packet-এর পথে নেই

লক্ষ করুন, lookup হয় প্রতিটি input port-এর নিজস্ব FIB-কপিতে — তাই কেন্দ্রীয় CPU bottleneck হয় না। এবার একটি packet-কে R1-এর ভেতর দিয়ে অনুসরণ করি — গন্তব্য সেই 198.51.100.200, ঢুকছে eth1 দিয়ে।

  1. Input eth1bit → frameFCS যাচাই
  2. Lookup/26 → eth3FIB-কপি
  3. Fabriceth1 → eth3crossbar
  4. Output queue২টি আগেscheduler
  5. Transmitনতুন frameeth3 থেকে তারে
Packet-এর অবস্থা (192.0.2.10 → 198.51.100.200)
কোথায়
কী হচ্ছে
TTL
Header checksum
Frame-এর MAC
এখানে সময় খরচ
  1. Line termination আর data link. eth1-এর input port তারের সংকেত থেকে bit, bit থেকে Ethernet frame বানাল। FCS মিলেছে, গন্তব্য MAC R1-এর eth1-এর — তাই frame-টি R1-এর জন্যই। (FCS না মিললে নিঃশব্দে ফেলে দেওয়া হতো।)
  2. IP header-এর প্রাথমিক যাচাই। Ethernet header আর FCS ফেলা হলো — ওগুলো শুধু আগের link-এর জন্য ছিল। Version ৪, checksum 0x315d মিলেছে, TTL ৬৪ — ১-এর বেশি, তাই সামনে পাঠানো যাবে।
  3. Lookup আর TTL. Input port-এর নিজস্ব FIB-কপিতে longest prefix match: 198.51.100.192/26 → eth3. পরের hop-এর MAC আগে থেকেই জানা (ARP, পর্ব ১৮)। TTL এক কমে ৬৩, আর header বদলেছে বলে checksum নতুন করে হলো 0x325d. এই পুরো ধাপ কয়েক ন্যানোসেকেন্ডের কাজ।
  4. Switching fabric পার। Packet এখন eth3-এর line card-এ যাবে। Fabric ফাঁকা থাকলে সাথে সাথে; অন্য input port-ও একই মুহূর্তে eth3-এ পাঠাতে চাইলে কাউকে অপেক্ষা করতে হয় — input queue (অংশ ৬)।
  5. Output queue-তে লাইন। eth3-এ আগের দুটি packet যাচ্ছে বা অপেক্ষায়; আমাদের packet buffer-এ লাইনে দাঁড়াল। কে আগে যাবে, ঠিক করে scheduler (অংশ ৭)। Buffer ভরা থাকলে এখানেই হারাত — বেশিরভাগ packet loss এখানেই ঘটে।
  6. নতুন frame, তারে। পালা এলে output port নতুন Ethernet header বানাল: গন্তব্য MAC = পরের hop, উৎস MAC = R1-এর eth3; শেষে নতুন FCS. তারপর bit তারে — যত বড় packet আর যত ধীর link, তত বেশি transmission delay (পর্ব ০৫)। IP ঠিকানা দুটি শুরু থেকে একই রইল।

Switching fabric তিন রকম

ধরনকীভাবে কাজ করেসীমাকোথায় দেখা যায়
MemoryInput port packet-কে CPU-র মেমরিতে লেখে, CPU সেখান থেকে output port-এ কপি করে — সাধারণ কম্পিউটারের মতোপ্রতিটি packet-এর জন্য মেমরিতে একবার লেখা, একবার পড়া; তাই গতি মেমরির ক্ষমতার অর্ধেকের বেশি হয় নাপ্রথম যুগের router, আজকের সফটওয়্যার router (Linux-এর ভেতরের forwarding)
Busসব port একটি ভাগাভাগির পথে (bus) যুক্ত; input port packet সরাসরি bus-এ দেয়, শুধু ঠিক output port তা নেয়এক সময়ে একটিই packet; মোট গতি bus-এর গতির বেশি নয়ছোট আর মাঝারি router, কিছু পুরোনো enterprise যন্ত্র
CrossbarN টি input আর N টি output-কে জাল দিয়ে যুক্ত; প্রতিটি সংযোগবিন্দু চালু-বন্ধ করা যায়আলাদা output-এ একসাথে অনেক packet যেতে পারে; কিন্তু দুটি input একই output চাইলে একটিকে অপেক্ষা করতে হয়বড় router আর switch; আরও বড়টিতে কয়েক স্তরের জাল (Clos)

৬ · Queue কোথায় জমে — head-of-line blocking, buffer আর bufferbloat

পর্ব ০৫-এ দেখেছেন, queuing delay আর packet loss আসে লাইনে দাঁড়ানো থেকে। Router-এর ভেতরে লাইন জমতে পারে দুই জায়গায়।

Output queue — যখন সবাই একই দরজায়

ধরুন তিনটি ১০ Gbps input port একই মুহূর্তে একই ১০ Gbps output port-এ পাঠাচ্ছে। Fabric যত দ্রুতই হোক, output-এর তার সেকেন্ডে ১০ Gbit-এর বেশি পাঠাতে পারে না। আসছে ৩০, যাচ্ছে ১০ — প্রতি সেকেন্ডে ২০ Gbit জমার কথা; buffer কয়েক মিলিসেকেন্ডেই ভরে যায়, তারপর packet ফেলা। ঢাকার মোড়ে তিন দিক থেকে গাড়ি এক দিকে গেলে লাইন হবেই — পর্ব ০৫-এর traffic intensity ১-এর বেশি।

Input queue আর head-of-line blocking

Fabric যদি সব input-এর মিলিত গতির সমান দ্রুত না হয়, packet input port-এই অপেক্ষা করে। সমস্যা হয় যখন input port-এ একটিই লাইন (FIFO): লাইনের সামনের packet-টি যে output চায় তা ব্যস্ত হলে, তার পেছনের packet-টি — যার output হয়তো সম্পূর্ণ ফাঁকা — সেটিও আটকে থাকে। একে বলে head-of-line (HOL) blocking. সরু গলিতে সামনের রিকশা ডানে ঢোকার জন্য দাঁড়িয়ে, পেছনের রিকশা বামে যাবে — রাস্তা ফাঁকা, তবু যেতে পারছে না।

নিচে একটি ৩ × ৩ crossbar. প্রতি সময়-ধাপে (slot) প্রতিটি output একটির বেশি packet নিতে পারে না; দুটি input একই output চাইলে কম নম্বরের input জেতে। প্রতিটি input-এ দুটি packet, লাইনের সামনেরটি আগে লেখা।

Input-এর লাইন (সামনে → পেছনে) আর এই slot-এ কে কোথায় গেল
I1-এর লাইন
I2-এর লাইন
I3-এর লাইন
O1 এই slot-এ
O2 এই slot-এ
O3 এই slot-এ
মোট পাঠানো
  1. শুরু: ৬টি packet, ৩টি output. প্রতিটি output-এর জন্য ঠিক দুটি করে packet আছে (O1: I1, I2; O2: I1, I3; O3: I2, I3). তাই আদর্শ অবস্থায় ২ slot-এই সব শেষ হওয়ার কথা। প্রতিটি input-এ একটিই FIFO লাইন — শুধু সামনের packet পাঠানো যায়।
  2. Slot ১: O1-এ সংঘর্ষ। I1 আর I2 দুজনের সামনের packet-ই O1 চায়; I1 জিতল, I2 আটকে গেল। I3 গেল O2-তে। দেখুন O3: সে পুরো slot ফাঁকা বসে রইল, অথচ I2-এর লাইনে O3-এর একটি packet আছে — শুধু সামনের packet-টির কারণে বের হতে পারল না। এটাই head-of-line blocking.
  3. Slot ২: সবাই আলাদা দরজায়। এবার সামনের packet-গুলো তিনটি আলাদা output চায় (I1 → O2, I2 → O1, I3 → O3), তাই তিনটিই গেল। মোট ৫টি।
  4. Slot ৩: বাকি একটি। শুধু I2-এর O3-এর packet বাকি। O1 আর O2 ফাঁকা। ৬টি packet পাঠাতে লাগল ৩ slot, অথচ ৩ slot-এ ৯টি পাঠানোর ক্ষমতা ছিল — ব্যবহার ৬ ÷ ৯ ≈ ৬৭%.
  5. সমাধান: VOQ. প্রতিটি input-এ প্রতিটি output-এর জন্য আলাদা লাইন (virtual output queue). Slot ১-এ I2 তার O3-এর লাইন থেকে পাঠাতে পারে, তাই I1 → O1, I2 → O3, I3 → O2; slot ২-এ I1 → O2, I2 → O1, I3 → O3. ২ slot-এ ৬টি — পূর্ণ ব্যবহার। কোন slot-এ কোন জোড়া, তা বাছতে একটি scheduler লাগে।

এটি শুধু খেলনা উদাহরণের সমস্যা নয়। ১৯৮৭ সালে Karol, Hluchyj আর Morgan দেখান, প্রতিটি packet-এর output এলোমেলোভাবে সমান সম্ভাবনায় বাছা হলে আর port অনেক হলে FIFO input queue-র switch সর্বোচ্চ প্রায় ২ − √২ ≈ ৫৮.৬% ক্ষমতায় চলতে পারে — বাকিটা HOL blocking-এ নষ্ট। তাই আধুনিক উচ্চগতির router-এ VOQ প্রায় সর্বজনীন, সাথে প্রতিটি slot-এ input আর output-এর জোড়া মেলানোর দ্রুত algorithm (যেমন ১৯৯৯ সালে প্রকাশিত iSLIP), আর অনেক সময় fabric-কে port-এর চেয়ে কিছুটা দ্রুত রাখা (speedup).

Buffer কত বড় হবে — RTT × C আর √N

Buffer ছোট হলে ঝাপটায় packet হারায় আর link ফাঁকা পড়ে থাকে; বড় হলে delay বাড়ে। বহু বছর প্রচলিত হাতের নিয়ম (সাধারণত ১৯৯৪ সালের Villamizar আর Song-এর কাজকে উৎস ধরা হয়):

B = RTT × C

RTT একটি সাধারণ সংযোগের round-trip time, C link-এর গতি — অর্থাৎ একটি bandwidth-delay product (পর্ব ০৫)। যুক্তি: TCP loss দেখলে গতি অর্ধেক করে (পর্ব ৩২); সেই বিরতিতে link ব্যস্ত রাখতে এক RTT-র মতো জমা packet লাগে। হিসাব: RTT ২৫০ ms, C = ১০ Gbps → B = ২.৫ × ১০৯ bit = ৩১২.৫ MB — প্রতিটি port-এ এত দ্রুত মেমরি খুব দামি।

২০০৪ সালে Appenzeller, Keslassy আর McKeown দেখান: link-এ একসাথে N টি দীর্ঘস্থায়ী, পরস্পর-স্বাধীন TCP সংযোগ থাকলে যথেষ্ট B = RTT × C ÷ √N. N = ১০,০০০ হলে √N = ১০০, তাই B ≈ ৩.১২৫ MB. তবে এর শর্ত সব জায়গায় খাটে না — বাসার মতো কম সংযোগের link-এ পুরোনো নিয়মটিই কাছাকাছি — আর সঠিক আকার নিয়ে গবেষণা আজও চলছে।

কাকে ফেলব — tail drop থেকে AQM

সবচেয়ে সরল নিয়ম tail drop: buffer ভরা থাকলে নতুন packet ফেলে দেওয়া। সমস্যা: queue প্রায় সবসময় ভরা (delay বেশি), আর অনেক TCP একসাথে loss দেখে একসাথে গতি কমায়-বাড়ায়, ঢেউয়ের মতো। সমাধান active queue management (AQM): buffer ভরার আগেই বুদ্ধি করে কিছু packet ফেলা বা চিহ্ন দেওয়া।

  • RED (Random Early Detection, Floyd আর Jacobson, ১৯৯৩): গড় queue-র দৈর্ঘ্য একটি নিচের সীমা পেরোলে ছোট সম্ভাবনায় এলোমেলো packet ফেলা শুরু; দৈর্ঘ্য যত বাড়ে, সম্ভাবনা তত বাড়ে; ওপরের সীমা পেরোলে সব ফেলা। ফেলার বদলে header-এ “ভিড় আছে” চিহ্নও দেওয়া যায় (ECN, পর্ব ৩২)। সমস্যা: সঠিক সীমা ঠিক করা কঠিন, তাই অনেক জায়গায় RED বন্ধই থাকত।
  • CoDel (Controlled Delay, Nichols আর Jacobson, ২০১২; RFC 8289): queue-র দৈর্ঘ্য নয়, প্রতিটি packet buffer-এ কতক্ষণ ছিল তা মাপে। একটি নির্দিষ্ট সময় (ডিফল্ট ১০০ ms) ধরে সবচেয়ে কম অপেক্ষাও লক্ষ্যমাত্রার (ডিফল্ট ৫ ms) বেশি থাকলে packet ফেলা শুরু করে। প্রায় কোনো সেটিং লাগে না। প্রতিটি সংযোগের জন্য আলাদা ছোট লাইনসহ এর রূপ fq_codel (RFC 8290) অনেক Linux distribution-এ ডিফল্ট queue নিয়ম।

Bufferbloat — বড় buffer-এর লুকানো দাম

পর্ব ০৫-এর bufferbloat-এর হিসাব এবার। বাসার router-এর upload ১০ Mbps, buffer ১ MB = ৮ Mbit. কেউ Google Drive-এ বড় ফাইল তুললে buffer ভরে থাকে, আর প্রতিটি নতুন packet অপেক্ষা করে ৮ ÷ ১০ = ০.৮ সেকেন্ড. পাশের ঘরের ভিডিও কল কেটে কেটে যায়, গেমের ping বাড়ে — অথচ কোনো packet হারায়নি, speed test-ও “ভালো”. Jim Gettys ২০১০-এর দিকে এই সমস্যাকে bufferbloat নামে সামনে আনেন। সমাধান AQM — buffer ঝাপটা সামলাবে, কিন্তু স্থায়ীভাবে ভরে থাকবে না।

“Buffer যত বড়, তত ভালো” — ভুল ধারণা। Buffer-এর কাজ হঠাৎ আসা ঝাপটা সামলানো, লাগাতার বেশি traffic নয়। লাগাতার আসা traffic link-এর চেয়ে বেশি হলে buffer যত বড়ই হোক একসময় ভরবে — শুধু ভরার আগে সবাইকে অনেক বেশি অপেক্ষা করাবে।

৭ · Packet scheduling — লাইনে কে আগে যাবে

Output queue-তে কয়েকটি packet অপেক্ষায়। পরের packet কোনটি যাবে, ঠিক করে packet scheduling. হাসপাতালের কাউন্টারের মতো ভাবুন — নিয়ম কয়েক রকম হতে পারে:

FIFO

যে আগে এসেছে, সে আগে যাবে। সরল, ন্যায্য মনে হয় — কিন্তু বড় ফাইলের ১০০টি packet-এর পেছনে একটি ভয়েস packet দাঁড়ালে তাকে সবগুলোর জন্য অপেক্ষা করতে হয়। বেশিরভাগ সাধারণ router-এর ডিফল্ট।

ব্যাংকের একটি লাইন

Priority

Packet-গুলো শ্রেণিতে ভাগ (যেমন ভয়েস = উচ্চ, বাকি = নিম্ন)। উচ্চ শ্রেণির লাইনে কেউ থাকলে সে আগে যাবে। জরুরি বিভাগের রোগীর মতো। বিপদ: উচ্চ শ্রেণির traffic লাগাতার এলে নিম্ন শ্রেণি কখনো সুযোগই পায় না (starvation).

জরুরি রোগী আগে

Round robin

প্রতিটি শ্রেণির আলাদা লাইন, আর পালা করে প্রতিটি লাইন থেকে একটি করে। বাসস্ট্যান্ডের তিনটি কাউন্টার থেকে পালা করে একজন করে টিকিট। কাউকে না খাইয়ে রাখে না, তবে বড় packet-এর লাইন বেশি byte পায়।

পালা করে একজন

WFQ

Weighted Fair Queueing: round robin-এর মতো, কিন্তু প্রতিটি শ্রেণির একটি ওজন w. সবাই ব্যস্ত থাকলে শ্রেণি i পায় link-এর wi ÷ Σw ভাগ। কোনো শ্রেণি ফাঁকা থাকলে তার ভাগ বাকিরা ভাগ করে নেয়।

ওজন অনুযায়ী ন্যায্য ভাগ

WFQ-র একটি হিসাব: ৬০ Mbps link-এ তিন শ্রেণি, ওজন ৩ : ২ : ১. সবাই ব্যস্ত হলে তারা পায় ৬০ × ৩/৬ = ৩০, ৬০ × ২/৬ = ২০ আর ৬০ × ১/৬ = ১০ Mbps. তৃতীয় শ্রেণি ফাঁকা হয়ে গেলে প্রথম দুটি ভাগ করে ৩ : ২ অনুপাতে — ৩৬ আর ২৪ Mbps. অর্থাৎ ওজন হলো ভিড়ের সময়ের ন্যূনতম নিশ্চয়তা, সর্বোচ্চ সীমা নয়। (Fair queueing-এর মূল ধারণা Demers, Keshav আর Shenker-এর ১৯৮৯ সালের কাজে; প্রতিটি byte-কে আলাদাভাবে ভাগ করার আদর্শ রূপটির তাত্ত্বিক বিশ্লেষণ Parekh আর Gallager-এর।)

এবার একটি output port-এ FIFO আর priority পাশাপাশি চালাই। প্রতি slot-এ একটি packet পাঠানো যায়, buffer-এ সর্বোচ্চ ৩টি packet অপেক্ষা করতে পারে, আর ভরা থাকলে tail drop. H মানে উচ্চ অগ্রাধিকার (ভয়েস), L নিম্ন (ফাইল ডাউনলোড)। দুই রানে আগমন হুবহু এক। “waited” = কত slot অপেক্ষা করে পাঠানো হলো।

// One output port: sends 1 packet per time slot; buffer holds at most 3 waiting packets.
// H = high priority (voice), L = low priority (file download). Same arrivals for both runs.
const arrivals = ["L1 L2 L3", "H1 L4", "L5 H2", "L6", "H3", "", "", ""];
const B = 3;
function run(policy) {
  console.log(`\n=== ${policy} ===  slot | arrive   | sent (waited) | queue (len) | dropped`);
  const q = [], wait = { H: [], L: [] }, dropped = [];
  arrivals.forEach((a, i) => {
    const t = i + 1, drop = [];
    for (const name of a.split(" ").filter(Boolean)) {
      if (q.length < B) q.push({ name, cls: name[0], t });
      else { drop.push(name); dropped.push(name); }          // tail drop
    }
    let sent = "-";
    if (q.length) {
      let k = 0;
      if (policy === "PRIORITY") { const h = q.findIndex(p => p.cls === "H"); if (h >= 0) k = h; }
      const p = q.splice(k, 1)[0];
      wait[p.cls].push(t - p.t);
      sent = `${p.name} (${t - p.t})`;
    }
    console.log(`  ${String(t).padStart(4)} | ${(a || "-").padEnd(8)} | ${sent.padEnd(13)} | ` +
      `${(q.length + ": " + (q.map(p => p.name).join(" ") || "empty")).padEnd(11)} | ${drop.join(" ") || "-"}`);
  });
  const avg = xs => (xs.reduce((s, x) => s + x, 0) / xs.length).toFixed(2);
  console.log(`  avg wait: H = ${avg(wait.H)} slots, L = ${avg(wait.L)} slots;` +
    ` dropped: ${dropped.join(" ") || "none"}`);
}
run("FIFO");
run("PRIORITY");

আউটপুট:

=== FIFO ===  slot | arrive   | sent (waited) | queue (len) | dropped
     1 | L1 L2 L3 | L1 (0)        | 2: L2 L3    | -
     2 | H1 L4    | L2 (1)        | 2: L3 H1    | L4
     3 | L5 H2    | L3 (2)        | 2: H1 L5    | H2
     4 | L6       | H1 (2)        | 2: L5 L6    | -
     5 | H3       | L5 (2)        | 2: L6 H3    | -
     6 | -        | L6 (2)        | 1: H3       | -
     7 | -        | H3 (2)        | 0: empty    | -
     8 | -        | -             | 0: empty    | -
  avg wait: H = 2.00 slots, L = 1.40 slots; dropped: L4 H2

=== PRIORITY ===  slot | arrive   | sent (waited) | queue (len) | dropped
     1 | L1 L2 L3 | L1 (0)        | 2: L2 L3    | -
     2 | H1 L4    | H1 (0)        | 2: L2 L3    | L4
     3 | L5 H2    | L2 (2)        | 2: L3 L5    | H2
     4 | L6       | L3 (3)        | 2: L5 L6    | -
     5 | H3       | H3 (0)        | 2: L5 L6    | -
     6 | -        | L5 (3)        | 1: L6       | -
     7 | -        | L6 (3)        | 0: empty    | -
     8 | -        | -             | 0: empty    | -
  avg wait: H = 0.00 slots, L = 2.20 slots; dropped: L4 H2

Slot ধরে পড়ুন। Slot ১-এ তিনটি L-এর ঝাপটা; L1 সাথে সাথে গেল। Slot ২-এ H1 ঢুকল (লাইন ৩), L4-এর জায়গা নেই — ফেলা হলো। Slot ৩-এ L5 ঢুকল, H2 ফেলা হলো। এরপর আর drop নেই।

FIFO-তে H1 আর H3 দুজনকেই L-গুলোর পেছনে ২ slot করে অপেক্ষা করতে হলো — গড় ২.০০। Priority-তে H1 আর H3 এসেই চলে গেল (অপেক্ষা ০), আর তার দাম দিল L-রা: তাদের গড় অপেক্ষা ১.৪০ থেকে বেড়ে ২.২০। লক্ষ করুন, মোট অপেক্ষা একই থাকে (FIFO: ২ × ২ + ৫ × ১.৪ = ১১; priority: ০ + ৫ × ২.২ = ১১) — scheduling অপেক্ষা ভাগ করে, কমায় না। আর queue-র দৈর্ঘ্য প্রতিটি slot-এ দুই রানেই হুবহু এক।

সবচেয়ে গুরুত্বপূর্ণ পর্যবেক্ষণ: দুই রানেই ফেলা হলো একই দুটি packet — L4 আর H2. Priority scheduling ঠিক করে কে আগে যাবে, কিন্তু buffer ভরা থাকলে কে ঢুকবে, তা ঠিক করে drop policy. ভয়েস packet বাঁচাতে চাইলে দুটোই লাগে — যেমন প্রতিটি শ্রেণির আলাদা buffer, বা AQM. নিজে চেষ্টা করুন: const B = 4; করে চালান — কোন packet বাঁচল, আর কার অপেক্ষা বাড়ল?

কোন packet কোন শ্রেণির, router তা জানে IP header-এর DSCP ঘর দেখে বা নিজের নিয়মে মিলিয়ে। এক ISP-র দেওয়া চিহ্ন অন্য ISP সাধারণত মানে না — তাই ইন্টারনেট মোটের ওপর best effort থেকে যায়। QoS-এর পুরো কাঠামো পর্ব ২৬-এ।

৮ · একটি datagram-এর hop-by-hop যাত্রা

পর্ব ০৩-এ encapsulation-এর ছবিতে দেখেছেন, router frame খুলে IP packet বের করে আবার নতুন frame-এ ভরে। আর পর্ব ১৩-এর router-on-a-stick-এ দেখেছেন, MAC বদলায় কিন্তু IP থাকে। এবার পুরো পথ ধরে একটি নিয়মে বাঁধি — একটি router পার হলে কী বদলায়, কী বদলায় না:

ঘরপ্রতিটি router-একেন
উৎস আর গন্তব্য IPবদলায় নাশুরু থেকে শেষ পর্যন্ত ঠিকানা। ব্যতিক্রম NAT (পর্ব ১৯)
TTL১ কমেঘুরপাক খাওয়া packet একসময় মরবে; ০ হলে ফেলে দিয়ে উৎসকে ICMP “Time Exceeded” (পর্ব ২০)
IP header checksumনতুন হিসাবTTL বদলেছে, তাই header-এর যোগফলও বদলেছে
উৎস আর গন্তব্য MACসম্পূর্ণ নতুনMAC শুধু এক link-এর ঠিকানা; প্রতিটি link-এ নতুন frame (পর্ব ১২)
FCSনতুননতুন frame, নতুন CRC (পর্ব ০৯)
TCP/UDP আর ডেটাবদলায় নাRouter transport স্তর খোলে না (NAT বাদে)

নিচের simulator একটি ping-এর আকারের (৮৪ byte) IPv4 packet-কে host A (192.0.2.10) থেকে তিনটি router পেরিয়ে host B (203.0.113.80)-এ নেয়। প্রতিটি router TTL কমিয়ে পুরো header-এর checksum নতুন করে হিসাব করে (১৬ bit-এর word যোগ, উপচে পড়া অংশ ঘুরিয়ে যোগ, শেষে উল্টানো — পর্ব ০৯), আর মিলিয়ে দেখে শুধু বদলানো word থেকে হিসাবের দ্রুত পদ্ধতিটিও (RFC 1624) একই উত্তর দেয় কি না।

// A ping-sized IPv4 packet 192.0.2.10 -> 203.0.113.80 crosses routers R1, R2, R3.
const hdr = [0x45,0x00,0x00,0x54, 0x1c,0x46,0x40,0x00, 64,0x01,0,0,
             192,0,2,10, 203,0,113,80];                  // bytes 10-11 = checksum
function checksum(h) {                                  // RFC 791 / RFC 1071
  let sum = 0;
  for (let i = 0; i < 20; i += 2) if (i !== 10) sum += (h[i] << 8) | h[i + 1];
  while (sum > 0xffff) sum = (sum & 0xffff) + (sum >>> 16); // end-around carry
  return ~sum & 0xffff;
}
const hex = n => "0x" + n.toString(16).padStart(4, "0");
const mac = s => "02:00:00:00:" + s;
// each link: [who sends, src MAC, dst MAC]
const links = [["host A", mac("00:0a"), mac("01:01")], ["R1", mac("01:02"), mac("02:01")],
               ["R2", mac("02:02"), mac("03:01")], ["R3", mac("03:02"), mac("00:0b")]];
let ck = checksum(hdr);
console.log("link  sender  TTL  checksum  src MAC -> dst MAC");
links.forEach(([who, s, d], i) => {
  if (i > 0) {                                          // a router forwards it
    const oldWord = (hdr[8] << 8) | hdr[9];
    hdr[8] -= 1;                                        // TTL - 1
    const newWord = (hdr[8] << 8) | hdr[9];
    let inc = (~ck & 0xffff) + (~oldWord & 0xffff) + newWord;  // RFC 1624 update
    while (inc > 0xffff) inc = (inc & 0xffff) + (inc >>> 16);
    inc = ~inc & 0xffff;
    ck = checksum(hdr);                                 // full recompute
    if (inc !== ck) console.log("  incremental update disagrees!");
  }
  console.log(`  ${i + 1}   ${who.padEnd(6)}  ${String(hdr[8]).padStart(3)}  ${hex(ck)}    ${s} -> ${d}`);
});
console.log("src/dst IP never changed: 192.0.2.10 -> 203.0.113.80");

আউটপুট:

link  sender  TTL  checksum  src MAC -> dst MAC
  1   host A   64  0x2008    02:00:00:00:00:0a -> 02:00:00:00:01:01
  2   R1       63  0x2108    02:00:00:00:01:02 -> 02:00:00:00:02:01
  3   R2       62  0x2208    02:00:00:00:02:02 -> 02:00:00:00:03:01
  4   R3       61  0x2308    02:00:00:00:03:02 -> 02:00:00:00:00:0b
src/dst IP never changed: 192.0.2.10 -> 203.0.113.80

TTL: ৬৪ → ৬৩ → ৬২ → ৬১ — তিনটি router, তিনবার কমল; B TTL ৬১ দেখে অনুমান করতে পারে পথে ৩টি router ছিল (প্রেরক ৬৪ দিয়ে শুরু করলে)। Checksum: 0x2008 → 0x2108 → 0x2208 → 0x2308, প্রতিবার ঠিক 0x0100 বাড়ল। কারণ TTL একটি ১৬ bit word-এর ওপরের byte (TTL আর protocol মিলে 0x4001); TTL ১ কমলে word আর যোগফল কমে 0x0100, তাই উল্টানো যোগফল বাড়ে 0x0100. RFC 1624-এর পদ্ধতি শুধু পুরোনো আর নতুন word দিয়ে এই হিসাব করে; কোডে তা পুরো হিসাবের সাথে সবসময় মিলেছে (“disagrees” একবারও ছাপা হয়নি)। দ্রুত router এভাবেই কাজ বাঁচায়।

MAC: প্রতিটি link-এ একেবারে নতুন জোড়া — উৎস হলো যে পাঠাচ্ছে তার সেই link-এর interface, গন্তব্য হলো পরের hop. আর শেষ লাইন: উৎস আর গন্তব্য IP পুরো পথে একই। নিজে চেষ্টা করুন: hdr[8]-এর শুরুর মান 64 থেকে 2 করে চালান — বাস্তবে তৃতীয় link-এ কী হওয়া উচিত (TTL ০ হলে R2 কী করে)?

MTU ছোট হলে — fragmentation আছে

প্রতিটি link-এর একটি সর্বোচ্চ আকার আছে (MTU) — Ethernet-এ সাধারণত ১,৫০০ byte, কোনো tunnel বা পুরোনো link-এ কম। পথে ছোট MTU-র link পড়লে IPv4 router বড় packet-কে কয়েকটি টুকরোয় ভাগ করতে পারে — fragmentation; টুকরোগুলো জোড়া লাগে শুধু গন্তব্য host-এ। Header-এ “Don’t Fragment” bit চালু থাকলে router ভাগ না করে packet ফেলে দেয় আর উৎসকে ICMP-তে জানায় — এটিই path MTU discovery-র ভিত্তি (পর্ব ২০)। Fragmentation-এর ঘর আর হিসাব পর্ব ১৬-এ; আর IPv6-এ router কখনো ভাগ করে না (পর্ব ২১)।

আরও গভীরে: Linux যন্ত্রকে router বানাতে লাগে শুধু net.ipv4.ip_forward = 1; তখন kernel-এর ip_forward() ফাংশন প্রতিটি packet-এ TTL কমায় (ip_decrease_ttl(), যা RFC 1624-এর মতো বাড়তি হিসাবেই checksum ঠিক করে), FIB-এর trie-তে lookup করে, আর queue-র নিয়ম (qdisc, যেমন fq_codel) মেনে পাঠায়। উচ্চগতির router-এর data plane আজ অনেক ক্ষেত্রে programmable — P4 ভাষায় লেখা যায় কোন header-এর কোন ঘর মেলানো হবে আর কী করা হবে; আর DPDK বা XDP-র মতো প্রযুক্তি সাধারণ সার্ভারেই প্রতি সেকেন্ডে কোটি packet forward করতে পারে। Router-এর সব আবশ্যিক আচরণের মূল তালিকা RFC 1812 (Requirements for IP Version 4 Routers, ১৯৯৫)।

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

  • Forwarding আর routing-এর পার্থক্য? — Forwarding: এক router-এ এক packet-কে output port-এ পাঠানো (data plane, ns, hardware); routing: নেটওয়ার্ক-জুড়ে পথ ঠিক করে টেবিল বানানো (control plane, software).
  • Longest prefix match কী? — একাধিক prefix মিললে সবচেয়ে লম্বা (নির্দিষ্ট) prefix-এর সারি জেতে; /0 default সবচেয়ে শেষ ভরসা।
  • Head-of-line blocking কী, সমাধান? — FIFO input queue-র সামনের packet আটকে থাকলে পেছনের, অন্য ফাঁকা output-গামী packet-ও আটকে যায়; সমাধান virtual output queue.
  • একটি router পার হলে IP packet-এর কী বদলায়? — TTL −১, header checksum, আর frame-এর MAC জোড়া ও FCS; IP ঠিকানা বদলায় না (NAT ছাড়া)।
  • Bufferbloat কী, কীভাবে কমাবেন? — অতিরিক্ত বড় buffer ভরে থেকে delay বাড়ায়; AQM (CoDel, fq_codel) দিয়ে queue ছোট রাখা।

৯ · AI-এর যুগে network layer

“আমার router-এর routing table বুঝিয়ে দিন” বা “এই packet কোন route-এ যাবে?” — AI এসব প্রশ্নে আত্মবিশ্বাসী, গোছানো উত্তর দেয়। কিন্তু network layer-এ কিছু ভুল AI বারবার করে, আর সেগুলো দেখতে নির্ভুল লাগে:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
“টেবিলের প্রথম মেলা সারি জেতে”Forwarding-এ longest prefix match; first match ACL-এর নিয়মঅংশ ৪-এর simulator-এ একই টেবিল দিয়ে মিলিয়ে দেখুন
“প্রতিটি router IP ঠিকানা বদলায়”বদলায় MAC; IP বদলায় শুধু NAT-এদুই প্রান্তে packet capture করে তুলনা (পর্ব ৫৫)
“TTL মানে সেকেন্ড”নামটি পুরোনো; বাস্তবে প্রতিটি router ১ কমায় — hop-সংখ্যাRFC 791 আর RFC 1812 দেখুন
“Lag কমাতে router-এর buffer বাড়ান”বড় buffer মানে bufferbloat, বেশি delayলোডের সময় ping মেপে দেখুন; AQM (fq_codel) চালু করুন
route -n, netstat -rn দিয়ে নির্দেশনাপুরোনো net-tools; আধুনিক Linux-এ ip routeman ip-route দেখুন
বানানো RFC নম্বর (যেমন RED-কে কোনো “RED RFC”)RED মূলত গবেষণাপত্র; AQM-এর সুপারিশ RFC 7567, CoDel RFC 8289rfc-editor.org-এ নম্বর খুলে শিরোনাম মেলান

AI-কে routing table বা forwarding-এর প্রশ্ন দিলে আসল তথ্য আর যাচাইয়ের শর্তসহ দিন:

আমার Linux সার্ভারে ip -4 route show table all-এর আউটপুট নিচে দিলাম (বাইরের ঠিকানা মুছে দিয়েছি)। [এখানে আউটপুট] ১. 192.0.2.50, 198.51.100.7 আর 10.0.2.77 — প্রতিটি গন্তব্যের জন্য কোন সারি জিতবে, longest prefix match দিয়ে ধাপে ধাপে দেখাও; প্রতিটি মিলের জন্য prefix-এর দৈর্ঘ্য লেখো। ২. local আর main টেবিলের পার্থক্য কী, আর কোনটি আগে দেখা হয় — নিশ্চিত না হলে স্পষ্ট বলো। ৩. শুধু iproute2-এর কমান্ড ব্যবহার করো (ifconfig, route, netstat নয়)। ৪. প্রতিটি দাবির পাশে কোন কমান্ড দিয়ে আমি নিজে যাচাই করব (যেমন ip route get) তা লেখো। ৫. কোনো route যোগ বা মুছে ফেলার পরামর্শ দিলে আগে বলো দূর থেকে চালালে আমার SSH সংযোগ কেটে যেতে পারে কি না।

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

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

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

প্র ০১টেলিফোন কোম্পানিগুলো নিশ্চয়তাসহ virtual circuit-এর নেটওয়ার্ক (ATM) চেয়েছিল, অথচ জিতল কোনো নিশ্চয়তাহীন best effort IP. কেন?

নব্বইয়ের দশকের শুরুতে অনেকেই ভাবতেন ভবিষ্যতের নেটওয়ার্ক হবে ATM: কণ্ঠ, ভিডিও আর ডেটা একসাথে, ছোট স্থির আকারের cell-এ, আর প্রতিটি সংযোগের জন্য আগে থেকে ঠিক করা bandwidth আর delay-এর নিশ্চয়তা। টেলিফোনের অভিজ্ঞতা থেকে এটাই স্বাভাবিক মনে হতো — নিশ্চয়তা ছাড়া কে নেটওয়ার্ক কিনবে? অথচ আজ ATM প্রায় বিলুপ্ত, আর সব কিছু চলে IP-র ওপর।

প্রথম কারণ জটিলতার জায়গা। ATM-এ নিশ্চয়তা দিতে পথের প্রতিটি switch-কে প্রতিটি সংযোগের state রাখতে হয়, setup-এর সময় হিসাব করতে হয় নতুন সংযোগ জায়গা পাবে কি না। IP-তে router কিছুই মনে রাখে না; জটিলতা থাকে দুই প্রান্তের কম্পিউটারে, যেগুলো এমনিতেই শক্তিশালী আর software বদলানো সহজ। David Clark-এর ১৯৮৮ সালের প্রবন্ধে যেমন বলা হয়েছিল, state প্রান্তে থাকলে মাঝের যন্ত্র নষ্ট হলেও সংযোগ বাঁচে।

দ্বিতীয় কারণ প্রযুক্তির বৈচিত্র্য। IP যেকোনো link-এর ওপর চলে — Ethernet, Wi-Fi, মোবাইল, স্যাটেলাইট — কারণ সে link-এর কাছে প্রায় কিছুই চায় না। ATM-এর নিশ্চয়তা পুরো পথে ATM না থাকলে অর্থহীন, অথচ অফিস আর বাসার LAN-এ ততদিনে সস্তা Ethernet জিতে গেছে। তৃতীয় কারণ খরচ আর গতি: Ethernet আর IP router-এর দাম দ্রুত কমেছে, link-এর গতি দ্রুত বেড়েছে। Bandwidth যথেষ্ট থাকলে best effort-এর delay-ও বেশিরভাগ সময় কম থাকে, আর নিশ্চয়তার জন্য বাড়তি জটিলতার দাম মেটানোর চেয়ে আরও bandwidth কেনা সস্তা হয়ে দাঁড়ায়। সাথে TCP congestion control, adaptive ভিডিও আর CDN মিলে “যথেষ্ট ভালো” অভিজ্ঞতা দিল।

তবে virtual circuit-এর ধারণা মরেনি। ISP-র ভেতরে MPLS label দিয়ে পূর্বনির্ধারিত পথ বানায় — traffic engineering আর ব্যবসায়িক VPN-এর জন্য। অর্থাৎ বাইরে থেকে ইন্টারনেট datagram, ভেতরে অনেক জায়গায় circuit-এর ছায়া।

মূল উপলব্ধি: নিশ্চয়তা বিনামূল্যে আসে না — তার দাম মাঝের যন্ত্রের জটিলতা আর নমনীয়তার অভাব। ইন্টারনেট সেই দাম না দিয়ে সরল মাঝখান বেছে নিয়েছিল, আর বৃদ্ধির গতিতে সেটিই জিতেছে।

প্র ০২Control plane-কে প্রতিটি router থেকে সরিয়ে একটি controller-এ নিলে কী লাভ, কী ঝুঁকি? SDN কেন বিশেষ করে data center আর বড় কোম্পানির নিজস্ব নেটওয়ার্কে জনপ্রিয় হলো?

প্রচলিত নেটওয়ার্কে প্রতিটি router নিজেই control plane চালায়। এর শক্তি স্থিতিস্থাপকতা: কোনো কেন্দ্র নেই, তাই একটি জায়গা নষ্ট হলে পুরো নেটওয়ার্ক অচল হয় না। কিন্তু দুর্বলতাও আছে। প্রতিটি router-এর software আর routing protocol একটি vendor-এর বানানো; নতুন কোনো নীতি চালু করতে প্রতিটি যন্ত্রে আলাদা কনফিগারেশন লিখতে হয়; আর বিতরণকৃত algorithm দিয়ে “এই ধরনের traffic ওই পথে, কিন্তু ভিড় হলে এই পথে” জাতীয় সূক্ষ্ম নীতি চালানো কঠিন। নতুন ধারণা পরীক্ষা করতে vendor-এর পরের সংস্করণের জন্য অপেক্ষা করতে হতো।

২০০৮ সালে Nick McKeown-সহ কয়েকজন গবেষকের “OpenFlow: Enabling Innovation in Campus Networks” প্রবন্ধ একটি সরল প্রস্তাব দেয়: switch-এর ভেতরে একটি flow table থাকবে, আর বাইরের software একটি খোলা protocol দিয়ে সেই টেবিলে match-plus-action-এর সারি বসাবে। এতে control plane হয়ে যায় একটি সাধারণ প্রোগ্রাম, যা পুরো নেটওয়ার্কের ছবি একসাথে দেখে। পরে Google প্রকাশ্যে জানায়, তাদের data center-গুলোর মাঝের নিজস্ব WAN (B4 নামে পরিচিত) SDN-ধাঁচের কেন্দ্রীয় traffic engineering দিয়ে link-গুলো অনেক বেশি ব্যবহারে চালায় — প্রচলিত নেটওয়ার্কে link সাধারণত অনেক ফাঁকা রাখা হয়।

ঝুঁকিগুলোও বাস্তব। Controller নিজে একটি দুর্বল বিন্দু, তাই তাকে কয়েকটি সার্ভারে প্রতিলিপি রেখে চালাতে হয় — “যৌক্তিকভাবে কেন্দ্রীভূত” কথাটি সেখান থেকে। Controller আর switch-এর মাঝের যোগাযোগ কেটে গেলে switch কী করবে, তা আগে থেকে ঠিক রাখতে হয়। খুব বড় নেটওয়ার্কে প্রতিটি নতুন flow-এর জন্য controller-কে জিজ্ঞেস করা ধীর, তাই বাস্তবে আগাম নিয়ম বসানো হয়। আর controller-এ ঢুকতে পারলে আক্রমণকারী পুরো নেটওয়ার্কের নিয়ন্ত্রণ পায়।

এই কারণে SDN সবচেয়ে বেশি সফল যেখানে একটি প্রতিষ্ঠান পুরো নেটওয়ার্কের মালিক — data center, cloud, বড় কোম্পানির নিজস্ব WAN. পুরো ইন্টারনেট, যেখানে হাজার হাজার স্বাধীন প্রতিষ্ঠান, এখনো বিতরণকৃত BGP-তে চলে (পর্ব ২৫)। বিস্তারিত পর্ব ৫৩-এ।

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

প্র ০৩Router-এর buffer কত বড় হওয়া উচিত — এই সাধারণ প্রশ্নে দুই দশক ধরে বিতর্ক কেন? বাসার ব্রডব্যান্ডে এর প্রভাব কী?

Buffer-এর আকার একটি টানাপোড়েন। ছোট buffer-এ ঝাপটার সময় packet হারায়; TCP তাতে গতি অর্ধেক করে, আর link কিছুক্ষণ অব্যবহৃত পড়ে থাকে — throughput কমে। বড় buffer-এ loss কমে, কিন্তু queue লম্বা হয়ে সবার delay বাড়ে। কোথায় থামা উচিত?

বহু বছর router নির্মাতারা মেনে চলত RTT × C নিয়মটি, যার উৎস হিসেবে সাধারণত ১৯৯৪ সালের Villamizar আর Song-এর পরীক্ষার কথা বলা হয়। একটি TCP সংযোগের ক্ষেত্রে যুক্তিটি সুন্দর: loss-এর পর TCP-র window অর্ধেক হয়, আর buffer-এ যদি এক bandwidth-delay product পরিমাণ জমা থাকে, তবে সেই বিরতিতেও link ব্যস্ত থাকে। কিন্তু ১০ Gbps link আর ২৫০ ms RTT-তে এর মানে ৩১২.৫ MB খুব দ্রুত মেমরি — প্রতিটি port-এ। ২০০৪ সালে Stanford-এর Appenzeller, Keslassy আর McKeown দেখান, backbone-এ হাজার হাজার স্বাধীন সংযোগ থাকলে তাদের ওঠানামা একে অপরকে কাটাকাটি করে, তাই √N ভাগ কম buffer-ই যথেষ্ট। এই ফল নিয়ে পরে আরও গবেষণা হয়েছে — কোন শর্তে খাটে, কোথায় খাটে না (যেমন সংযোগ কম হলে বা traffic-এর ধরন অন্য হলে)। সে কারণেই প্রশ্নটি আজও পুরোপুরি মীমাংসিত নয়।

বাসার ব্রডব্যান্ডে সমস্যাটি উল্টো দিকে। এখানে সংযোগ কম, link ধীর, আর সস্তা মেমরির যুগে অনেক যন্ত্রে buffer প্রয়োজনের চেয়ে বহু গুণ বড়। ১০ Mbps upload-এ ১ MB buffer ভরলে ০.৮ সেকেন্ড delay — বাসায় কেউ ভিডিও আপলোড করলে অন্য সবার ভিডিও কল আর গেম ভোগে। Jim Gettys আর অন্যরা ২০১০-এর দিকে এই সমস্যাকে bufferbloat নামে পরিচিত করান। সমাধান হিসেবে এলো CoDel আর fq_codel, যা buffer-এর আকার নয়, packet-এর অপেক্ষার সময় নিয়ন্ত্রণ করে। অনেক আধুনিক বাসার router-এর firmware-এ “SQM” বা “Smart Queue” নামে এই ধরনের সেটিং থাকে।

মূল উপলব্ধি: “কত buffer” প্রশ্নের এক উত্তর নেই — তা নির্ভর করে কতগুলো সংযোগ, কত RTT, কেমন traffic-এর ওপর। আর আকারের চেয়ে বেশি গুরুত্বপূর্ণ হলো queue-কে স্থায়ীভাবে ভরে থাকতে না দেওয়া।

প্র ০৪Head-of-line blocking শুধু router-এর সমস্যা নয় — আর কোথায় একই ধরনের সমস্যা দেখা যায়, আর সমাধানের ধরন কি একই?

HOL blocking-এর মূল কথা: একটিই লাইন, আর লাইনের সামনের কেউ আটকে গেলে পেছনের সবাই আটকে যায় — যদিও তাদের কাজ সম্পূর্ণ আলাদা আর করা সম্ভব। Router-এর crossbar-এ এটি দেখেছেন: FIFO input queue-তে সামনের packet-এর output ব্যস্ত, তাই পেছনের ফাঁকা output-গামী packet-ও বসে থাকে। ১৯৮৭ সালের বিশ্লেষণ অনুযায়ী অনেক port আর এলোমেলো traffic-এ এতে ক্ষমতার প্রায় ৪১% নষ্ট হয়। সমাধান VOQ: প্রতিটি গন্তব্যের জন্য আলাদা লাইন, আর একটি scheduler যে প্রতিটি slot-এ মিলিয়ে দেয় কোন input কোন output-এ পাঠাবে — ১৯৯৯ সালে প্রকাশিত iSLIP এমন একটি সুপরিচিত algorithm.

একই সমস্যা নেটওয়ার্কের ওপরের স্তরেও আছে। HTTP/1.1-এ একটি TCP সংযোগে একটির পর একটি request-এর উত্তর আসে; একটি বড় বা ধীর উত্তর পেছনের সবগুলোকে আটকে রাখে। HTTP/2 একই সংযোগে অনেক stream পাশাপাশি চালিয়ে এটি কমায় (পর্ব ৩৭)। কিন্তু নিচে TCP নিজে একটি byte-এর ধারা — একটি packet হারালে পরের সব packet এসে পৌঁছালেও application পায় না, যতক্ষণ না হারানোটি আবার আসে। এটি transport স্তরের HOL blocking. QUIC প্রতিটি stream-এর ক্রম আলাদা রেখে এর সমাধান করে (পর্ব ৩৩)।

দৈনন্দিন জীবনেও উদাহরণ চারপাশে: সুপারশপের একটি কাউন্টারে সামনের ক্রেতার কার্ড কাজ করছে না, অথচ পেছনের মানুষটির হাতে শুধু এক বোতল পানি আর নগদ টাকা। সমাধান আলাদা “শুধু কয়েকটি জিনিস” কাউন্টার — VOQ-এর মতোই।

সব ক্ষেত্রে সমাধানের ধরন এক: একটি লাইনকে স্বাধীন কয়েকটি লাইনে ভাঙা, আর তাদের মাঝে একটি ন্যায্য scheduler. দাম: বেশি state, বেশি জটিলতা — প্রতিটি input-এ N টি লাইন, প্রতিটি সংযোগে অনেক stream-এর হিসাব।

মূল উপলব্ধি: যেখানেই “একটি FIFO লাইন, আলাদা আলাদা গন্তব্য” — সেখানেই HOL blocking লুকিয়ে থাকে। একবার ধরনটি চিনলে router, HTTP, TCP আর QUIC-এর নকশার সিদ্ধান্তগুলো একই সূত্রে বোঝা যায়।

প্র ০৫Router চাইলেই কিছু traffic-কে অগ্রাধিকার দিতে পারে। তাহলে ISP কি নিজের পছন্দের অ্যাপ বা সাইটকে আগে পাঠাতে পারে? Priority scheduling-এর প্রযুক্তি আর নীতির প্রশ্ন কীভাবে মেলে?

প্রযুক্তির দিক থেকে উত্তর সহজ: হ্যাঁ, পারে। অংশ ৭-এ দেখেছেন, priority বা WFQ scheduling-এ কোন শ্রেণি আগে যাবে, তা router-এর নিয়মে ঠিক হয়। আর match-plus-action দিয়ে সেই শ্রেণি ঠিক করা যায় ঠিকানা, port বা আরও গভীরে দেখে। একই যন্ত্র দিয়ে ভয়েস কলকে অগ্রাধিকার দেওয়া যায় — যা ভালো — আবার কোনো প্রতিদ্বন্দ্বী ভিডিও সেবাকে ধীর করে দেওয়াও যায়।

এখান থেকেই “net neutrality” বা নেটওয়ার্ক-নিরপেক্ষতার বিতর্ক: ISP কি সব বৈধ traffic-কে সমান আচরণ করতে বাধ্য, নাকি টাকা নিয়ে বা নিজের ব্যবসার স্বার্থে কাউকে আগে রাখতে পারবে? বিভিন্ন দেশ বিভিন্ন পথ নিয়েছে। ইউরোপীয় ইউনিয়ন ২০১৫ সালে একটি বিধিমালায় মূল নিয়ম হিসেবে traffic-এর সমান আচরণ চায়, তবে নেটওয়ার্ক ঠিক রাখার যুক্তিসংগত ব্যবস্থাপনার সুযোগ রাখে। ভারতের নিয়ন্ত্রক সংস্থা ২০১৬ সালে বিষয়বস্তু অনুযায়ী আলাদা দাম নেওয়া নিষেধ করে। যুক্তরাষ্ট্রে নিয়মটি কয়েকবার এসেছে আর বাতিল হয়েছে। বাংলাদেশসহ অনেক দেশে মোবাইল অপারেটরদের নির্দিষ্ট অ্যাপের জন্য আলাদা প্যাকেজ দেখা যায়; এ ধরনের প্যাকেজ নিরপেক্ষতার প্রশ্নের সাথে যুক্ত, যদিও প্রতিটি দেশের নিয়ম আর তার ব্যাখ্যা আলাদা, আর সময়ের সাথে বদলায়।

প্রকৌশলী হিসেবে মূল পার্থক্যটি বুঝুন: traffic-এর ধরন অনুযায়ী অগ্রাধিকার (যেমন ভিড়ের সময় ভয়েসের মতো delay-সংবেদনশীল traffic-কে আগে রাখা, বা একজন ব্যবহারকারী যেন বাকিদের পুরো link দখল না করেন) সাধারণত নেটওয়ার্ক ব্যবস্থাপনা হিসেবে গ্রহণযোগ্য ধরা হয়; আর কে পাঠাচ্ছে বা কে টাকা দিয়েছে অনুযায়ী অগ্রাধিকার নিয়েই বিতর্ক। স্বচ্ছতাও গুরুত্বপূর্ণ — ব্যবহারকারী কি জানেন তাঁর traffic-এর সাথে কী হচ্ছে? আর encryption বাড়ায় (TLS, QUIC) router-এর পক্ষে ভেতরে দেখে আলাদা আচরণ করাও কঠিন হচ্ছে।

মূল উপলব্ধি: Scheduling algorithm নিরপেক্ষ, তার ব্যবহার নয়। একই priority queue দিয়ে নেটওয়ার্ক ভালো চালানো যায়, আবার প্রতিযোগিতাও বিকৃত করা যায় — তাই নেটওয়ার্ক প্রকৌশলের সিদ্ধান্তের সাথে নীতি, আইন আর স্বচ্ছতার প্রশ্ন জড়িয়ে থাকে।

অনুশীলন

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

  1. হাতে হিসাব (lookup আর সময়ের বাজেট): (ক) একটি router-এর টেবিল: 0.0.0.0/0 → eth0, 192.0.2.0/24 → eth1, 192.0.2.0/25 → eth2, 192.0.2.96/27 → eth3. গন্তব্য 192.0.2.100, 192.0.2.130, 192.0.2.20 আর 198.51.100.7 — প্রতিটি কোন interface-এ যাবে? (খ) একটি ১০ Gbps port-এ সবচেয়ে ছোট Ethernet frame (৬৪ byte, সাথে ৮ byte preamble আর ১২ byte ফাঁক) একটানা এলে প্রতি সেকেন্ডে কতটি packet, আর একটির জন্য কত সময়?

    (ক) শেষ byte বাইনারিতে লিখুন। /25 = .0–.127 (প্রথম bit ০), /27 .96 = 01100000, অর্থাৎ .96–.127. .100 = 01100100: /24 ✔, /25 ✔ (প্রথম bit ০), /27 ✔ (প্রথম তিন bit 011) → সবচেয়ে লম্বা /27 → eth3. .130 = 10000010: /24 ✔, /25 ✘ (প্রথম bit ১), /27 ✘ → eth1. .20 = 00010100: /24 ✔, /25 ✔, /27 ✘ (000 ≠ 011) → eth2. 198.51.100.7: শুধু /0 → eth0.

    (খ) তারে প্রতিটি frame = ৬৪ + ৮ + ১২ = ৮৪ byte = ৬৭২ bit. প্রতি সেকেন্ডে ১০ × ১০৯ ÷ ৬৭২ ≈ ১ কোটি ৪৮ লক্ষ ৮১ হাজার packet (১৪.৮৮ Mpps), আর প্রতিটির জন্য ৬৭২ ÷ ১০১০ সেকেন্ড = ৬৭.২ ns. ১০০ Gbps-এ এর দশ ভাগের এক ভাগ, ৬.৭২ ns. এই বাজেটেই lookup, TTL আর checksum — তাই hardware.

  2. আউটপুট অনুমান করুন: অংশ ৭-এর output_queue.js-এ শুধু const B = 3; বদলে const B = 4; করা হলো। দুই রানে কোন কোন packet ফেলা হবে, আর FIFO-তে H-এর আর priority-তে L-এর গড় অপেক্ষা কত হবে? চালানোর আগে slot ধরে হিসাব করুন।

    Slot ২-এ এখন L4-এরও জায়গা হয় (লাইন ৩), তাই L4 বাঁচে। Slot ৩-এ লাইনে ৩টি, L5 ঢুকে ৪, আর H2-এর জায়গা নেই — দুই রানেই শুধু H2 ফেলা হয়। শেষ লাইনগুলো:

    FIFO:      avg wait: H = 2.50 slots, L = 2.00 slots; dropped: H2
    PRIORITY:  avg wait: H = 0.00 slots, L = 2.83 slots; dropped: H2

    FIFO-তে H1 অপেক্ষা করে ২, H3 অপেক্ষা করে ৩ slot (গড় ২.৫০)। Priority-তে H অপেক্ষা ০, কিন্তু L4, L5, L6 প্রত্যেকে ৪ slot অপেক্ষা করে — L-এর গড় (০ + ২ + ৩ + ৪ + ৪ + ৪) ÷ ৬ = ২.৮৩. শিক্ষা: buffer বাড়িয়ে একটি loss কমল, কিন্তু সবার delay বাড়ল — ছোট আকারে bufferbloat-এর গল্প।

  3. কমান্ড লিখুন ও decode করুন: (ক) Linux-এ 192.0.2.50-এ packet পাঠালে কোন route ব্যবহার হবে, packet না পাঠিয়ে কীভাবে জানবেন? (খ) সব টেবিলসহ IPv4 route দেখার কমান্ড? (গ) /proc/net/route-এর একটি লাইন: eth0 006433C6 010200C0 0003 0 0 0 00FFFFFF — এটি কোন route? (ঘ) এই route-টি নিজে যোগ করার কমান্ড কী (root লাগে)?
    ip route get 192.0.2.50          # (ক) kernel-এর lookup, কোনো packet যায় না
    ip -4 route show table all       # (খ) local, main, default — সব টেবিল
    sudo ip route add 198.51.100.0/24 via 192.0.2.1 dev eth0   # (ঘ)

    (গ) Byte উল্টে পড়ুন: Destination 006433C6 → C6 33 64 00 = 198.51.100.0; Gateway 010200C0 → C0 00 02 01 = 192.0.2.1; Mask 00FFFFFF → FF FF FF 00 = 255.255.255.0, অর্থাৎ ২৪টি ১ bit = /24; Flags 0003 = U (চালু) + G (gateway দিয়ে)। সব মিলিয়ে: 198.51.100.0/24 via 192.0.2.1 dev eth0 — ঠিক (ঘ)-এর কমান্ডের ফল। দূরের সার্ভারে route যোগ বা মুছার আগে নিশ্চিত হোন যে আপনার নিজের SSH-এর পথ এতে বদলাবে না।

  4. হিসাব (buffer আর bufferbloat): (ক) একটি backbone link ১০ Gbps, গড় RTT ২০০ ms, আর একসাথে প্রায় ৪০,০০০টি দীর্ঘস্থায়ী TCP সংযোগ। RTT × C নিয়মে আর √N সংশোধনে buffer কত MB? (খ) একটি বাসার router-এর upload ২০ Mbps, buffer ২ MB. Buffer ভরা থাকলে একটি নতুন packet-এর queuing delay কত? RTT ৫০ ms ধরে RTT × C নিয়মে এই link-এ কত buffer যথেষ্ট হতো?

    (ক) RTT × C = ০.২ × ১০১০ = ২ × ১০৯ bit = ২৫০ MB. √৪০,০০০ = ২০০, তাই √N নিয়মে ২ × ১০৯ ÷ ২০০ = ১০৭ bit = ১.২৫ MB — দুইশো ভাগের এক ভাগ (শর্তসাপেক্ষে: অনেক স্বাধীন সংযোগ)।

    (খ) ২ MB = ১৬ Mbit; delay = ১৬ ÷ ২০ = ০.৮ সেকেন্ড = ৮০০ ms — ভিডিও কল বা গেমের জন্য অসহনীয়। RTT × C = ০.০৫ × ২০ × ১০৬ = ১০৬ bit = ১২৫ KB. অর্থাৎ buffer প্রয়োজনের প্রায় ১৬ গুণ বড় — বাসার bufferbloat-এর আদর্শ উদাহরণ। সমাধান: router-এ fq_codel বা SQM চালু করা, বা upload-এর গতি সামান্য কম ধরে সীমা বেঁধে দেওয়া, যাতে queue router-এ জমে যেখানে AQM আছে।

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

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

ক্রমএকটি IP packet একটি router পার হচ্ছে — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Input port তারের সংকেত থেকে frame বানিয়ে FCS মেলায়
  2. Ethernet header সরিয়ে IP header যাচাই করা হয়
  3. FIB-এ longest prefix match করে output port ঠিক হয়
  4. TTL এক কমে আর header checksum নতুন করে হিসাব হয়
  5. Packet switching fabric পেরিয়ে output port-এ যায়
  6. Output queue-তে পালা এলে নতুন MAC-সহ নতুন frame হয়ে তারে যায়

নিচের কোনটি “forwarding”, “routing” নয়?

  • OSPF চালিয়ে প্রতিবেশী router-দের থেকে topology জেনে সবচেয়ে ছোট পথ হিসাব করা
  • Input port-এ আসা একটি packet-এর গন্তব্য দেখে FIB থেকে output port বেছে নেওয়া
  • SDN controller-এর পুরো নেটওয়ার্ক দেখে প্রতিটি switch-এর টেবিল হিসাব করা
  • Routing processor-এর RIB থেকে সেরা route বেছে line card-এ পাঠানো

একটি router-এর টেবিল: 0.0.0.0/0 → A, 203.0.113.0/24 → B, 203.0.113.0/26 → C, 203.0.113.32/27 → D. গন্তব্য 203.0.113.40 হলে packet কোন interface-এ যাবে?

  • A
  • B
  • C
  • D

একটি crossbar router-এর প্রতিটি input port-এ একটিই FIFO লাইন। কোনো input-এর সামনের packet যে output চায় তা ব্যস্ত, তাই পেছনের যে packet-এর output ফাঁকা, সেটিও যেতে পারছে না। এই ঘটনার নাম আর সাধারণ সমাধান কী?

  • Head-of-line blocking; সমাধান virtual output queue
  • Bufferbloat; সমাধান buffer ছোট করা
  • Tail drop; সমাধান RED
  • TTL expiry; সমাধান TTL বাড়ানো

NAT নেই এমন পথে একটি IPv4 packet একটি router পার হলো। নিচের কোন জোড়া বদলায় না?

  • TTL আর header checksum
  • উৎস MAC আর গন্তব্য MAC
  • উৎস IP আর গন্তব্য IP
  • Frame-এর FCS আর গন্তব্য MAC

একটি ১ Gbps link-এ গড় RTT ১০০ ms. প্রচলিত “B = RTT × C” নিয়মে buffer কত হওয়া উচিত?

  • ১০০ MB
  • ১২.৫ MB
  • ১.২৫ MB
  • ১২.৫ GB

৯০ Mbps-এর একটি link-এ WFQ, তিন শ্রেণির ওজন ৪ : ১ : ১. তিনটি শ্রেণিই একটানা ব্যস্ত থাকলে প্রথম শ্রেণি কত পায়?

  • ৬০ Mbps
  • ৩০ Mbps
  • ৯০ Mbps
  • ৭২ Mbps

শব্দকোষ

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

মনে রাখুন

  1. Network layer = host থেকে host, অনেক hop পেরিয়ে, best effort: IP পৌঁছানো, ক্রম, delay বা bandwidth-এর কোনো নিশ্চয়তা দেয় না; সেসব প্রান্তের কাজ।
  2. Forwarding (data plane) এক router-এ প্রতি packet-এ ন্যানোসেকেন্ডে; routing (control plane) নেটওয়ার্ক-জুড়ে টেবিল বানায় — প্রতিটি router-এ, বা SDN-এ একটি controller-এ। RIB থেকে FIB.
  3. Longest prefix match: একাধিক মিল হলে সবচেয়ে লম্বা prefix জেতে; /0 default শেষ ভরসা। ACL-এ উল্টো — first match.
  4. Router = input port + fabric (memory/bus/crossbar) + output port + routing processor. FIFO input queue-তে HOL blocking (প্রায় ৫৮.৬% সীমা), সমাধান VOQ; output queue-তে loss আর delay; buffer ≈ RTT × C (অনেক সংযোগে ÷ √N); AQM (RED, CoDel) bufferbloat ঠেকায়।
  5. প্রতি hop-এ: TTL −১, header checksum নতুন (TTL ১ কমলে checksum 0x0100 বাড়ে), নতুন MAC আর FCS; IP ঠিকানা আর ডেটা একই। Scheduling (FIFO, priority, RR, WFQ) ঠিক করে কে আগে যাবে, drop policy ঠিক করে কে ঢুকবে।

পরের পর্বে: এই পর্বে ঠিকানাকে “prefix” হিসেবে ব্যবহার করেছি — এবার ঠিকানা নিজেই। IPv4 ঠিকানার ৩২ bit, পুরোনো class থেকে CIDR-এ যাওয়ার গল্প, আর IPv4 header-এর প্রতিটি ঘর (TTL, checksum, fragmentation-এর ঘরসহ)।

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

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