এই পর্বে যা শিখবেন
- কেন নেটওয়ার্ককে স্তরে ভাগ করা হয় — service, protocol আর interface-এর পার্থক্য
- OSI-র সাত স্তরের প্রতিটির কাজ, ডেটার একক (PDU), উদাহরণ protocol আর device — পরীক্ষার ক্লাসিক টেবিল
- TCP/IP মডেল, OSI-র সাথে তার মিল আর কেন TCP/IP-ই টিকে গেল
- Encapsulation আর decapsulation ধাপে ধাপে, আর header overhead-এর পূর্ণ হিসাব
- একটি আসল frame-এর hex পড়ে প্রতিটি স্তর আলাদা করা, আর OS-এর কোন অংশে কোন স্তর থাকে
১ · কেন স্তর — কুরিয়ার সার্ভিসের শিক্ষা
আপনার মোবাইলে একটি WhatsApp বার্তা লিখে “Send” চাপলেন। সেই মুহূর্তে কী কী ঘটতে হবে, একবার ভাবুন। বার্তাটিকে বাইটে রূপ দিতে হবে। ঠিক কোন অ্যাপের কাছে যাবে, তা চিহ্নিত করতে হবে। কোনো অংশ হারালে আবার পাঠাতে হবে। হাজার মাইল দূরের সার্ভার পর্যন্ত পথ খুঁজতে হবে। Wi-Fi-র বাতাসে বা fiber-এর আলোয় বাইটগুলোকে সংকেতে রূপ দিতে হবে। এত কাজ একটিমাত্র বিশাল প্রোগ্রাম করলে কী হতো? Wi-Fi-র জায়গায় 4G এলেই পুরো প্রোগ্রাম নতুন করে লিখতে হতো।
প্রকৌশলীরা এই জটিলতা সামলান একটি পুরোনো কৌশলে — কাজকে স্তরে স্তরে ভাগ করা। একে বলে layering. প্রতিটি স্তর একটি নির্দিষ্ট দায়িত্ব নেয়, নিচের স্তরের দেওয়া সুবিধা ব্যবহার করে, আর ওপরের স্তরকে একটি পরিষ্কার সুবিধা দেয়। ভেতরে কীভাবে কাজ হচ্ছে, তা ওপরের স্তর জানে না, জানার দরকারও নেই।
ধরুন রাজশাহী থেকে আপনি সিলেটে মায়ের কাছে একটি চিঠি পাঠাবেন। আপনি চিঠি লিখে খামে ভরলেন, ওপরে ঠিকানা লিখলেন। কুরিয়ার অফিস খামটিকে সিলেটগামী অন্য অনেক খামের সাথে একটি বস্তায় ভরল, বস্তার গায়ে লিখল “সিলেট হাব”। বস্তাটি উঠল একটি ট্রাকে। ট্রাকচালক জানেন না চিঠিতে কী লেখা — তিনি জানেন শুধু কোন হাবে বস্তা নামাতে হবে। সিলেট হাবে বস্তা খোলা হলো, খাম গেল ডেলিভারিম্যানের হাতে, তিনি ঠিকানা দেখে বাড়িতে দিলেন, আর মা খাম খুলে চিঠি পড়লেন। প্রতিটি ধাপ নিজের “মোড়ক” যোগ করেছে আর ওপাশে ঠিক সেই ধাপই মোড়কটি খুলেছে। চিঠি → খাম → বস্তা → ট্রাক — এটিই নেটওয়ার্কের স্তর আর encapsulation-এর পুরো ছবি।
এই উপমা থেকে layering-এর তিনটি সুবিধা পরিষ্কার হয়:
Modularity
প্রতিটি স্তর আলাদা মডিউল। কুরিয়ার কোম্পানি ট্রাকের বদলে ট্রেনে বস্তা পাঠালেও আপনার চিঠি লেখার নিয়ম বদলায় না। নেটওয়ার্কেও Ethernet থেকে Wi-Fi বা 5G-তে গেলে ব্রাউজার বদলাতে হয় না।
এক স্তর বদলান, বাকিরা অক্ষতAbstraction
ওপরের স্তর নিচের খুঁটিনাটি দেখে না। ব্রাউজার জানে “এই বাইটগুলো নির্ভরযোগ্যভাবে ওই সার্ভারে পৌঁছাবে” — কোন তার, কোন router, তা তার মাথাব্যথা নয়।
“কী” পাব জানি, “কীভাবে” নয়শ্রমবিভাগ
আলাদা কোম্পানি আলাদা স্তর বানায়: চিপ-নির্মাতা NIC, OS-নির্মাতা TCP/IP, অ্যাপ-নির্মাতা application. সবাই একই নিয়ম মানলে সব মিলে কাজ করে।
মান (standard) = সবার চুক্তিLayering মানে একটি বড় সমস্যাকে কয়েকটি ছোট, স্বাধীন সমস্যায় ভাগ করা — যেখানে স্তর n শুধু স্তর n−১-এর সেবা ব্যবহার করে এবং স্তর n+১-কে সেবা দেয়। দাম আছে: প্রতিটি স্তরের নিজস্ব header (বাড়তি বাইট) আর প্রক্রিয়াকরণের সময়। এই দামের হিসাব আমরা অংশ ৬-এ করব।
২ · Service, protocol আর interface — আর peer-to-peer কথোপকথন
স্তরের কথা বলতে গেলে তিনটি শব্দ বারবার আসে, আর পরীক্ষায় এদের পার্থক্য প্রায়ই জিজ্ঞেস করা হয়। শব্দগুলো আলাদা করে বুঝে নিই।
- Service (সেবা): একটি স্তর তার ওপরের স্তরকে কী করে দেয় — যেমন transport স্তরের TCP বলে “আমি আপনার বাইটগুলো ক্রম ঠিক রেখে, না হারিয়ে পৌঁছে দেব।” এটি একটি প্রতিশ্রুতি, কীভাবে রাখা হবে তা বলে না।
- Protocol (প্রোটোকল): দুই মেশিনের একই স্তর পরস্পরের সাথে যে নিয়মে কথা বলে — বার্তার ফর্ম্যাট (কোন বাইটের কী মানে), ক্রম আর কোন ঘটনায় কী করতে হবে। TCP-র header-এর গঠন, three-way handshake — এসব protocol.
- Interface (ইন্টারফেস): একই মেশিনে পাশাপাশি দুই স্তরের সংযোগস্থল — ওপরের স্তর কীভাবে নিচের স্তরের সেবা চায়। Application আর transport-এর মাঝের interface হলো socket API (
socket(),send(),recv()) — পর্ব ৪১-এ আমরা এটি দিয়ে প্রোগ্রাম লিখব।
অফিসের রিসেপশনের কথা ভাবুন। “আপনার পার্সেল আজকেই ঢাকায় পৌঁছে যাবে” — এটি service. রিসেপশনে যে ফর্ম পূরণ করে পার্সেল জমা দেন — সেটি interface. আর রাজশাহী অফিস আর ঢাকা অফিসের মধ্যে চালানের কাগজ কোন ফর্ম্যাটে যাবে, বস্তার গায়ে কোন কোড লেখা থাকবে — সেটি দুই অফিসের protocol. আপনি protocol জানেন না, জানার দরকারও নেই; আপনি শুধু interface ব্যবহার করে service পান।
Peer-to-peer যোগাযোগ: “যেন সরাসরি” কথা বলা
এখানেই layering-এর সবচেয়ে সূক্ষ্ম ধারণাটি। প্রেরকের TCP যখন একটি header লেখে, সেটি কে পড়বে? প্রাপকের TCP — অন্য কেউ নয়। মাঝের router TCP header নিয়ে মাথা ঘামায় না (সাধারণত; ব্যতিক্রম অংশ ৯-এ)। তাই বলা হয়, প্রতিটি স্তর অন্য প্রান্তের একই স্তরের সাথে — তার peer-এর সাথে — protocol-এর মাধ্যমে যেন সরাসরি কথা বলে। একে বলে peer-to-peer (বা horizontal) যোগাযোগ।
কিন্তু আসলে কোনো স্তরই সরাসরি কিছু পাঠায় না। আসল ডেটা যায় উল্লম্বভাবে: প্রেরকের ভেতরে ওপর থেকে নিচে, তারের ওপর দিয়ে, তারপর প্রাপকের ভেতরে নিচ থেকে ওপরে। শুধু সবচেয়ে নিচের physical স্তরেই সত্যিকারের সংযোগ। Peer-to-peer যোগাযোগ একটি যৌক্তিক (logical) ছবি; উল্লম্ব প্রবাহটি বাস্তব (physical) ছবি। দুটি একসাথে মাথায় রাখতে পারলেই নেটওয়ার্কের যেকোনো protocol বোঝা সহজ হয়ে যায়।
প্রেরক প্রাপক
┌────────────┐ application protocol ┌────────────┐
│ Application│ ◀ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ▶ │ Application│
├────────────┤ transport protocol ├────────────┤
│ Transport │ ◀ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ▶ │ Transport │
├────────────┤ ├────────────┤
│ Network │ ◀ ─ ─ ─ ▶ [ Router ] ◀ ─ ▶ │ Network │
├────────────┤ ├────────────┤
│ Link │ ◀ ─ ─ ─ ▶ [ L2/L3 ] ◀ ─ ▶ │ Link │
├────────────┤ ├────────────┤
│ Physical │ ══════════ তার / বাতাস ════│ Physical │
└────────────┘ └────────────┘
─ ─ ▶ যৌক্তিক (peer) ═══ আসল সংযোগ ডেটা চলে উল্লম্বভাবে
খেয়াল করুন, router-এ শুধু নিচের তিনটি স্তর আছে। Router-এর কাজ packet-কে পরের hop-এ পাঠানো; সে transport বা application header খোলার কথা নয়। এজন্যই নতুন application protocol (যেমন একটি নতুন গেম) চালু করতে ইন্টারনেটের কোনো router বদলাতে হয় না — শুধু দুই প্রান্তের সফটওয়্যার। এই ধারণার নাম end-to-end principle — ভাবনার প্রশ্ন ৩-এ এর ইতিহাস দেখবেন।
৩ · OSI-র সাত স্তর — পরীক্ষার ক্লাসিক টেবিল
১৯৭০-এর দশকে প্রতিটি কম্পিউটার কোম্পানির নিজস্ব নেটওয়ার্ক ব্যবস্থা ছিল — IBM-এর SNA, Digital Equipment-এর DECnet ইত্যাদি — যারা একে অপরের সাথে কথা বলতে পারত না। এই সমস্যা সমাধানে আন্তর্জাতিক মান সংস্থা ISO ১৯৭০-এর দশকের শেষ দিকে একটি “Open Systems Interconnection” কাঠামোর কাজ শুরু করে, আর এর reference model সাধারণত ১৯৮৪ সালের ISO 7498 মান হিসেবে উল্লেখ করা হয় (পরে ১৯৯৪ সালে সংশোধিত)। Hubert Zimmermann-এর ১৯৮০ সালের একটি প্রবন্ধ মডেলটিকে ব্যাপক পরিচিতি দেয় বলে জানা যায়। মডেলটি একটি চিন্তার কাঠামো — এর জন্য বানানো OSI protocol-গুলো (যেমন CLNP, TP4) বাজারে তেমন টেকেনি, কিন্তু স্তরের ভাষাটি আজও সবার মুখে: “এটা L2 সমস্যা”, “L7 load balancer”.
নিচ থেকে ওপরে সাতটি স্তর। প্রতিটির জন্য চারটি প্রশ্ন মনে রাখুন: কী কাজ, ডেটার এককের নাম কী (PDU — protocol data unit), কোন protocol, আর কোন device এই স্তর পর্যন্ত দেখে।
| স্তর | মূল কাজ | PDU | উদাহরণ protocol / মান | Device |
|---|---|---|---|---|
| ৭ · Application | ব্যবহারকারীর প্রোগ্রামকে নেটওয়ার্ক সেবা দেওয়া — ওয়েব, ইমেইল, ফাইল, নাম খোঁজা | Message (data) | HTTP, DNS, SMTP, FTP, SSH | Application gateway, L7 load balancer, proxy |
| ৬ · Presentation | ডেটার রূপ: encoding (যেমন UTF-8), compression, encryption — দুই পক্ষ যেন একই অর্থ বোঝে | Message | ASN.1, MIME, JPEG; TLS-কে অনেকে এখানে রাখেন | — |
| ৫ · Session | কথোপকথন শুরু, বজায় আর শেষ করা; checkpoint থেকে আবার শুরু | Message | RPC-এর কিছু অংশ, NetBIOS session | — |
| ৪ · Transport | প্রান্ত থেকে প্রান্তে (process থেকে process) পৌঁছানো: port, নির্ভরযোগ্যতা, flow ও congestion control | Segment (TCP), datagram (UDP) | TCP, UDP, QUIC | L4 firewall, L4 load balancer |
| ৩ · Network | নেটওয়ার্কের পর নেটওয়ার্ক পেরিয়ে host থেকে host: logical ঠিকানা (IP address) আর routing | Packet (IP datagram) | IP (IPv4, IPv6), ICMP, OSPF, BGP | Router, L3 switch |
| ২ · Data link | একই link-এ পাশের যন্ত্র পর্যন্ত: framing, MAC address, ত্রুটি ধরা, মাধ্যম ভাগাভাগি | Frame | Ethernet, Wi-Fi (802.11) MAC, PPP | Switch, bridge, NIC |
| ১ · Physical | বিটকে সংকেতে রূপ: ভোল্টেজ, আলো, রেডিও তরঙ্গ; connector, তারের মান, গতি | Bit (symbol) | 1000BASE-T, fiber optic মান, 802.11-এর রেডিও অংশ, DSL | Hub, repeater, modem, তার |
Application · Presentation · Session · Transport · Network · Data link · Physical
টেবিলটি মুখস্থ করার আগে একটি প্যাটার্ন খেয়াল করুন: স্তর যত নিচে, তার “দৃষ্টি” তত ছোট। Physical স্তর শুধু এক তারের দুই প্রান্ত দেখে। Data link দেখে একটি link বা একটি LAN — পাশের যন্ত্র পর্যন্ত। Network স্তর দেখে পুরো ইন্টারনেট জুড়ে host থেকে host. Transport দেখে host-এর ভেতরের নির্দিষ্ট প্রোগ্রাম (port). এই কারণেই data link-এর MAC ঠিকানা প্রতিটি hop-এ বদলায়, কিন্তু IP ঠিকানা পুরো পথে একই থাকে (NAT না থাকলে) — অংশ ৫-এর stepper-এ নিজের চোখে দেখবেন।
Device আর স্তরের সম্পর্ক “সবচেয়ে উঁচু কোন স্তর পর্যন্ত দেখে” — এই অর্থে। Router-এরও physical আর data link স্তর আছে (না থাকলে তারে বিট পাঠাত কীভাবে?), কিন্তু সিদ্ধান্ত নেয় network স্তরের IP ঠিকানা দেখে, তাই router “Layer 3 device”. আর বাস্তবের অনেক যন্ত্র একাধিক স্তরে কাজ করে: বাড়ির Wi-Fi “রাউটার” আসলে একটি box-এ router, switch, Wi-Fi access point, DHCP সার্ভার আর NAT — সব একসাথে।
Session আর presentation স্তর নিয়ে একটি সৎ কথা বলা দরকার: বাস্তবের ইন্টারনেটে এই দুটি স্তরের আলাদা, সর্বজনীন protocol প্রায় নেই। Encoding, compression, encryption, session — সবই সাধারণত application নিজেই করে, বা application-এর ব্যবহৃত library (যেমন TLS library). তাই অনেক পাঠ্যবই TLS-কে “application আর transport-এর মাঝে” রাখে, কেউ presentation-এ, কেউ session-এ। পরীক্ষায় প্রশ্নের প্রেক্ষাপট দেখে উত্তর দিন, আর লিখে দিন যে শ্রেণিবিভাগটি নিয়ে মতভেদ আছে — এটিই সবচেয়ে নির্ভুল উত্তর।
৪ · TCP/IP মডেল — যা আসলে চলে
OSI যখন কমিটিতে আলোচনা হচ্ছিল, তখন মার্কিন প্রতিরক্ষা গবেষণা সংস্থার অর্থায়নে ARPANET-এ আরেকটি কাজ এগোচ্ছিল। Vint Cerf আর Bob Kahn ১৯৭৪ সালে একটি প্রবন্ধে বিভিন্ন নেটওয়ার্ককে জোড়া লাগানোর (internetworking) একটি protocol-এর নকশা প্রকাশ করেন, যা পরে TCP আর IP — দুই ভাগে ভাগ হয়। ১৯৮১ সালে IP (RFC 791) আর TCP (RFC 793) প্রকাশিত হয়, আর ১ জানুয়ারি ১৯৮৩-তে ARPANET পুরোপুরি TCP/IP-তে চলে যায় — যে দিনটিকে অনেকে ইন্টারনেটের “জন্মদিন” বলেন।
TCP/IP-এর স্তর ভাগ OSI-র মতো আগে থেকে কমিটিতে ঠিক করা নয়; protocol-গুলো আগে তৈরি হয়েছে, মডেল পরে লেখা হয়েছে। Host-এর জন্য প্রয়োজনীয়তা নিয়ে ১৯৮৯ সালের RFC 1122 চারটি স্তরের কথা বলে: application, transport, internet, link. অনেক পাঠ্যবই (যেমন Kurose ও Ross-এর বই, আর এই কোর্সও) link স্তরকে data link আর physical-এ ভেঙে একটি ৫ স্তরের মিশ্র মডেল ব্যবহার করে — কারণ শেখার সময় তারের সংকেত আর frame-এর নিয়ম আলাদা করে বোঝা সহজ।
দুই মডেলের মিল ধাপে ধাপে দেখুন:
- OSI-র সাত স্তর। বাঁ দিকে ISO-র কাঠামো — নিচে Physical (১), ওপরে Application (৭). এখন দেখব TCP/IP-এর চার স্তর এগুলোর সাথে কীভাবে মেলে।
- ওপরের তিনটি মিলে একটি। OSI-র Application, Presentation আর Session — তিনটির কাজই TCP/IP-এ একটি Application স্তরে। HTTP নিজেই encoding (Content-Type) আর সংযোগের অবস্থা (cookie) সামলায়; encryption দেয় TLS library, যা application-এর সাথেই চলে।
- Transport — সরাসরি মিল। OSI-র স্তর ৪ = TCP/IP-এর Transport. TCP নির্ভরযোগ্য byte stream দেয়, UDP দেয় হালকা datagram; দুটিই port নম্বর দিয়ে ঠিক প্রোগ্রামটিকে চেনে।
- Network = Internet. OSI-র স্তর ৩-কে TCP/IP বলে Internet স্তর — এখানে একটিই প্রধান protocol, IP. সব application আর সব link প্রযুক্তি এই একটি protocol-এর ওপর দিয়ে যায়; একে বলা হয় ইন্টারনেটের “সরু কোমর” (narrow waist).
- নিচের দুটি মিলে Link. OSI-র Data link আর Physical — TCP/IP (RFC 1122)-এর মডেলে দুটি মিলে একটি Link স্তর। TCP/IP নিজে এই স্তরের protocol বানায়নি; Ethernet (IEEE 802.3) বা Wi-Fi (IEEE 802.11)-এর মতো যেকোনো প্রযুক্তি ব্যবহার করতে পারে।
- পাঠ্যবইয়ের ৫ স্তর। ডান দিকে এই কোর্সের মডেল: TCP/IP-এর চার স্তর, শুধু Link ভেঙে Link (frame, MAC) আর Physical (bit, সংকেত). পর্ব ০৭–১৪ এই দুই স্তরের, ১৫–২৬ network স্তরের, ২৭–৩৩ transport-এর, ৩৪–৪০ application-এর।
কেন TCP/IP জিতল — “protocol wars”
১৯৮০-র দশক জুড়ে দুই পক্ষের মধ্যে যে প্রতিযোগিতা চলেছিল, তাকে ইতিহাসবিদেরা প্রায়ই “protocol wars” বলেন। কাগজে-কলমে OSI-র পক্ষে ছিল অনেক দেশের সরকার, টেলিকম কোম্পানি আর আন্তর্জাতিক মান সংস্থা — মার্কিন সরকারও একসময় GOSIP নামে নীতি দিয়ে সরকারি কেনাকাটায় OSI চেয়েছিল বলে জানা যায়। তবু ১৯৯০-এর দশকের মাঝামাঝি নাগাদ বাজার স্পষ্টভাবে TCP/IP-র দিকে চলে যায়। সাধারণত যে কারণগুলো বলা হয়:
- চালু কোড আগে ছিল: TCP/IP-এর কাজ করা implementation ছিল; বিশেষ করে বিনামূল্যের BSD Unix-এ (১৯৮০-র দশকের শুরুতে) TCP/IP যুক্ত হওয়ায় বিশ্ববিদ্যালয় আর গবেষণাগারে তা ছড়িয়ে পড়ে।
- সময়: OSI-র মান যখন চূড়ান্ত হচ্ছিল, ততদিনে TCP/IP অনেক জায়গায় চলছে। Andrew Tanenbaum তাঁর পাঠ্যবইয়ে OSI-র ব্যর্থতার কারণ হিসেবে খারাপ সময়, খারাপ প্রযুক্তি, খারাপ implementation আর খারাপ রাজনীতির কথা লিখেছেন।
- জটিলতা: OSI-র মান ছিল বিশাল আর বহু বিকল্পে ভরা; দুই implementation একই মান মেনেও প্রায়ই একে অপরের সাথে মিলত না।
- উন্মুক্ত দলিল: RFC বিনামূল্যে যে কেউ পড়তে পারত; ISO-র মান অনেক সময় কিনতে হতো।
- সংস্কৃতি: IETF-এর বিখ্যাত দর্শন — David Clark-এর ১৯৯২ সালের একটি বক্তৃতার উক্তি হিসেবে প্রচলিত — “আমরা রাজা, প্রেসিডেন্ট আর ভোট মানি না; আমরা মানি rough consensus আর running code.” অর্থাৎ মোটামুটি ঐকমত্য আর বাস্তবে চলে এমন কোড।
OSI পুরোপুরি হারিয়ে যায়নি। এর স্তরের ভাষা আজ সার্বজনীন; IS-IS routing protocol (মূলত OSI-র জন্য তৈরি) আজও বড় ISP-এর নেটওয়ার্কে বহুল ব্যবহৃত; আর X.500 থেকে আসা ধারণা টিকে আছে LDAP আর ওয়েবের certificate-এর X.509 ফর্ম্যাটে (পর্ব ৪৮)।
৫ · Encapsulation আর decapsulation — “Hi”-এর যাত্রা
এবার মূল প্রক্রিয়া। পাঠানোর সময় প্রতিটি স্তর ওপর থেকে পাওয়া ডেটাকে নিজের payload হিসেবে ধরে, তার সামনে নিজের header জুড়ে দেয় (data link স্তর পেছনে একটি trailer-ও যোগ করে)। একে বলে encapsulation. প্রাপকের দিকে প্রতিটি স্তর নিজের header পড়ে, যাচাই করে, সরিয়ে বাকিটা ওপরে দেয় — একে বলে decapsulation. Header-এর ভেতরে থাকে সেই স্তরের protocol-এর তথ্য: ঠিকানা, ক্রম নম্বর, দৈর্ঘ্য, ত্রুটি-যাচাইয়ের সংখ্যা, আর সবচেয়ে গুরুত্বপূর্ণ — ওপরের স্তরে কে আছে (Ethernet-এর EtherType, IP-র protocol নম্বর, TCP/UDP-র port).
ধরুন আপনার ল্যাপটপের (192.168.1.10) ব্রাউজারে একটি ছোট chat পাতা থেকে “Hi” পাঠালেন একটি ওয়েব সার্ভারে (203.0.113.5, port 80). সরলতার জন্য ধরে নিচ্ছি application নিজে কোনো header যোগ করেনি — বাস্তবে HTTP বা WebSocket কয়েক থেকে কয়েকশো বাইট যোগ করে, আর HTTPS হলে TLS-ও। “পরে” চেপে প্রতিটি স্তর দেখুন:
| PDU | |
| গঠন | |
| আকার | |
| মূল তথ্য |
- Application: শুধু ডেটা। ব্রাউজারের chat পাতা socket-এ ২ বাইট দিল:
H(0x48) আরi(0x69). Application স্তরের PDU-কে বলে message. এর পরের কাজ সে জানে না — শুধু interface (socket) ডাকল। - Transport: TCP header +২০। TCP সামনে ২০ বাইটের header জুড়ল (options ছাড়া): উৎস port 50000 (OS-এর বেছে দেওয়া অস্থায়ী port), গন্তব্য port 80, sequence আর ACK নম্বর, checksum. এখন এটি একটি segment, আকার ২ + ২০ = ২২ বাইট।
- Network: IP header +২০। IPv4 আরও ২০ বাইট জুড়ল: উৎস 192.168.1.10, গন্তব্য 203.0.113.5, TTL 64, আর protocol = 6 (মানে “ভেতরে TCP আছে”). এখন এটি একটি packet, ২২ + ২০ = ৪২ বাইট। এই IP ঠিকানা দুটি পুরো পথে একই থাকবে (NAT না থাকলে — পর্ব ১৯)।
- Link: Ethernet header ১৪ + FCS ৪। সার্ভার অন্য নেটওয়ার্কে, তাই গন্তব্য MAC হলো নিজের router-এর MAC — সার্ভারের নয়! EtherType 0x0800 মানে “ভেতরে IPv4”. Ethernet-এর payload কমপক্ষে ৪৬ বাইট হতে হয়, ৪২ বাইট ছোট, তাই ৪ বাইট padding. শেষে ৪ বাইটের FCS (CRC, পর্ব ০৯). মোট ১৪ + ৪২ + ৪ + ৪ = ৬৪ বাইটের frame — Ethernet-এর সর্বনিম্ন আকার।
- Physical: bit হয়ে তারে। NIC frame-এর আগে ৮ বাইট preamble আর SFD বসায় (প্রাপকের ঘড়ি মেলানোর জন্য), তারপর প্রতিটি বিটকে সংকেতে রূপ দেয়। তারে যায় ৭২ বাইট = ৫৭৬ bit; এরপর ১২ বাইট সময়ের নীরবতা (inter-frame gap). ২ বাইটের “Hi”-এর জন্য এত কিছু!
- Router: L3 পর্যন্ত খুলে নতুন মোড়ক। Router bit থেকে frame বানাল, FCS মিলিয়ে দেখল, Ethernet header ফেলে দিল। IP header পড়ে গন্তব্য দেখে পরের hop ঠিক করল, TTL ৬৪ → ৬৩ করল আর তাই IP checksum নতুন করে হিসাব করল। তারপর পরের link-এর জন্য নতুন Ethernet header (নতুন MAC জোড়া) আর নতুন FCS. TCP আর “Hi”-তে সে হাত দেয়নি। বাস্তবে এমন অনেক router পেরিয়ে packet পৌঁছায় (পর্ব ২০-এর traceroute-এ দেখবেন)।
- প্রাপকের Link: frame খোলা। সার্ভারের NIC সংকেত থেকে bit, bit থেকে frame বানাল, FCS মিলিয়ে দেখল (না মিললে নীরবে ফেলে দেয়), গন্তব্য MAC নিজের কি না দেখল। EtherType 0x0800 দেখে বুঝল ভেতরে IPv4, তাই header, padding আর FCS সরিয়ে ৪২ বাইটের packet ওপরে দিল। Padding কতটা, তা বোঝা যায় IP header-এর total length (৪২) থেকে।
- প্রাপকের Network: packet খোলা। IP header-এর checksum ঠিক আছে, গন্তব্য 203.0.113.5 নিজেরই ঠিকানা, তাই আর forward নয়। Protocol ঘরে ৬, অর্থাৎ ভেতরের অংশ TCP-কে দিতে হবে। IP header সরিয়ে ২২ বাইটের segment ওপরে গেল।
- প্রাপকের Transport → Application. TCP checksum আর sequence মিলিয়ে দেখল, গন্তব্য port 80 — যে প্রোগ্রাম port 80-তে শুনছে (ওয়েব সার্ভার), তার socket-এ “Hi” রাখল, আর প্রেরককে ACK পাঠানোর ব্যবস্থা করল। সার্ভার প্রোগ্রাম
recv()ডেকে ঠিক সেই ২ বাইট পেল — সে কোনো header দেখে না। চিঠি মায়ের হাতে পৌঁছাল।
এই যাত্রা থেকে PDU-র নামগুলো এক জায়গায় লিখে রাখুন — পরীক্ষায় প্রায় নিশ্চিত প্রশ্ন:
| স্তর (৫ স্তরের মডেল) | PDU-র নাম | যে header যোগ হয় (সাধারণ আকার) | ওপরের স্তর চেনার ঘর |
|---|---|---|---|
| Application | Message | Protocol-ভেদে (HTTP-এর লেখা header, DNS-এর ১২ বাইট…) | — |
| Transport | Segment (TCP) / datagram (UDP) | TCP ২০–৬০ বাইট, UDP ৮ বাইট | Port নম্বর |
| Network | Packet (IP datagram) | IPv4 ২০–৬০ বাইট, IPv6 ৪০ বাইট (fixed) | Protocol (IPv4) / Next Header (IPv6) |
| Link | Frame | Ethernet ১৪ header + ৪ FCS trailer (VLAN tag থাকলে +৪) | EtherType |
| Physical | Bit / symbol | Preamble ৭ + SFD ১ বাইট (Ethernet) | — |
“Datagram” শব্দটি দুই জায়গায় ব্যবহার হয় — UDP-র PDU আর IP-র PDU (RFC 791 নিজেই IP-র এককে “datagram” বলে)। আবার কথ্য ভাষায় অনেকেই সবকিছুকে “packet” বলেন। লেখার সময় স্তর উল্লেখ করে দিন: “UDP datagram”, “IP packet”, “Ethernet frame” — তাহলে কোনো বিভ্রান্তি থাকে না।
৬ · Header-এর খরচ — overhead আর efficiency-র হিসাব
প্রতিটি header বাড়তি বাইট, আর বাড়তি বাইট মানে তারে বাড়তি সময়। কাজের ডেটার (payload) সাথে মোট পাঠানো বাইটের অনুপাতকে বলে efficiency বা কার্যকারিতা, আর বাকিটা overhead:
Overhead = ১ − Efficiency
পূর্ণ সমাধান করা উদাহরণ
প্রশ্ন: একটি application ১০০০ বাইট ডেটা TCP দিয়ে IPv4-এর ওপর Ethernet-এ পাঠাচ্ছে। TCP আর IP header-এ কোনো option নেই। (ক) Frame-এর আকার কত? (খ) Frame-এর হিসাবে efficiency কত? (গ) তারের সময়ের হিসাবে (preamble আর inter-frame gap ধরে) efficiency কত?
সমাধান:
- TCP segment = ১০০০ + ২০ = ১০২০ বাইট।
- IP packet = ১০২০ + ২০ = ১০৪০ বাইট। এটি ১৫০০-র কম, তাই একটি frame-এই যাবে (Ethernet-এর MTU ১৫০০); আবার ৪৬-এর বেশি, তাই padding লাগবে না।
- (ক) Frame = ১০৪০ + ১৪ (header) + ৪ (FCS) = ১০৫৮ বাইট।
- (খ) Efficiency = ১০০০ ÷ ১০৫৮ ≈ ০.৯৪৫২ = ৯৪.৫২%; overhead ≈ ৫.৪৮%.
- (গ) তারে প্রতি frame-এর জন্য আরও ৮ (preamble + SFD) + ১২ (gap) = ২০ বাইটের সময় লাগে: ১০০০ ÷ ১০৭৮ ≈ ৯২.৭৬%.
অর্থাৎ ১ Gbit/s লিংকে এই আকারের frame দিয়ে application সর্বোচ্চ প্রায় ৯২৭.৬ Mbit/s কাজের ডেটা পাবে — বাকিটা header আর ফাঁকের দাম। (Delay আর throughput-এর পূর্ণ হিসাব পর্ব ০৫-এ।) Header যোগ হওয়ার সাথে সাথে efficiency কীভাবে কমে, ধাপে ধাপে দেখুন:
- Data
1000 Bapplication - + TCP
20 Btransport - + IP
20 Bnetwork - + ETH
14 + 4 Blink - + তারে
8 + 12 Bphysical
| কাজের ডেটা | |
| মোট আকার | |
| মোট header | |
| Efficiency |
- শুধু ডেটা। Application-এর ১০০০ বাইট। এখনো কোনো header নেই, efficiency ১০০%.
- TCP-র ২০ বাইট। মোট ১০২০ বাইট। Efficiency = ১০০০ ÷ ১০২০ ≈ ৯৮.০৪%.
- IP-র ২০ বাইট। মোট ১০৪০ বাইট — এটিই IP packet. Efficiency = ১০০০ ÷ ১০৪০ ≈ ৯৬.১৫%.
- Ethernet-এর ১৮ বাইট। ১৪ বাইট header আর ৪ বাইট FCS, মোট ১০৫৮ বাইটের frame. Efficiency ≈ ৯৪.৫২% — পরীক্ষায় সাধারণত এই উত্তরটিই চাওয়া হয়।
- তারের বাড়তি ২০ বাইট। Preamble আর SFD ৮ বাইট, inter-frame gap ১২ বাইট — frame-এর অংশ নয়, কিন্তু তারের সময় খায়। মোট ১০৭৮, efficiency ≈ ৯২.৭৬%.
- তুলনা: মাত্র ১ বাইট ডেটা। ১ + ৪০ = ৪১ বাইটের packet, ৪৬-এ পৌঁছাতে ৫ বাইট padding, frame ৬৪ বাইট, তারে ৮৪ বাইট। Efficiency মাত্র ১ ÷ ৮৪ ≈ ১.১৯%! এজন্যই ছোট ছোট অনেক packet (যেমন টাইপ করার প্রতিটি অক্ষর আলাদা পাঠানো) নেটওয়ার্কের জন্য অপচয় — TCP-র Nagle algorithm এই সমস্যা কমাতে তৈরি।
হাতে করা হিসাব যন্ত্র দিয়ে মেলানো ভালো অভ্যাস। নিচের simulator তিনটি ভিন্ন আকারের ডেটার জন্য পুরো frame-এর গঠন আর efficiency ছাপে — Run চাপুন:
// Encapsulation: wrap application data in TCP, IPv4 and Ethernet.
const TCP = 20, IP = 20, ETH_HDR = 14, FCS = 4; // header sizes in bytes (no options)
const MIN_PAYLOAD = 46; // Ethernet payload must be >= 46 bytes
const WIRE_EXTRA = 8 + 12; // preamble+SFD and inter-frame gap
function encapsulate(data) {
const segment = TCP + data; // transport adds its header
const packet = IP + segment; // network adds its header
const pad = Math.max(0, MIN_PAYLOAD - packet); // tiny packets are padded
const frame = ETH_HDR + packet + pad + FCS; // link adds header + trailer
return { segment, packet, pad, frame, wire: frame + WIRE_EXTRA };
}
for (const data of [1, 100, 1460]) {
const r = encapsulate(data);
console.log(`--- application data = ${data} bytes ---`);
console.log(`[ETH 14 [IP 20 [TCP 20 [DATA ${data}]]]` +
(r.pad ? ` PAD ${r.pad}` : "") + " FCS 4]");
console.log(`segment=${r.segment} packet=${r.packet} frame=${r.frame} on wire=${r.wire}`);
const eff = (100 * data / r.frame).toFixed(2);
const effWire = (100 * data / r.wire).toFixed(2);
console.log(`efficiency: ${eff}% of frame, ${effWire}% of wire time`);
}আউটপুট (নির্ধারিত — প্রতিবার একই):
--- application data = 1 bytes ---
[ETH 14 [IP 20 [TCP 20 [DATA 1]]] PAD 5 FCS 4]
segment=21 packet=41 frame=64 on wire=84
efficiency: 1.56% of frame, 1.19% of wire time
--- application data = 100 bytes ---
[ETH 14 [IP 20 [TCP 20 [DATA 100]]] FCS 4]
segment=120 packet=140 frame=158 on wire=178
efficiency: 63.29% of frame, 56.18% of wire time
--- application data = 1460 bytes ---
[ETH 14 [IP 20 [TCP 20 [DATA 1460]]] FCS 4]
segment=1480 packet=1500 frame=1518 on wire=1538
efficiency: 96.18% of frame, 94.93% of wire time
বন্ধনীগুলো খেয়াল করুন — প্রতিটি স্তরের মোড়ক আগের মোড়ককে ঘিরে রেখেছে, ঠিক খামের ভেতরে চিঠি, বস্তার ভেতরে খাম। ১ বাইটে padding (PAD 5) এসেছে কারণ packet মাত্র ৪১ বাইট। ১০০ বাইটে efficiency মাত্র ৬৩%. আর ১৪৬০ কেন বেছে নিলাম? কারণ ১৪৬০ + ২০ + ২০ = ১৫০০ — Ethernet-এর MTU পুরো ভরে যায়, frame হয় সর্বোচ্চ ১৫১৮ বাইট। এই ১৪৬০-ই IPv4-এর ওপর Ethernet-এ TCP-র সাধারণ MSS (maximum segment size). বড় ফাইল পাঠানোর সময় তারের হিসাবে প্রায় ৯৪.৯% সর্বোচ্চ — এর বেশি কখনো পাবেন না (jumbo frame ছাড়া)।
Efficiency সূত্রের সাধারণ রূপ: ডেটা D বাইট, সব স্তরের মোট header H বাইট হলে efficiency = D ÷ (D + H). এটি D-এর বর্ধমান ফাংশন: D → ∞ হলে ১-এর দিকে যায়, কিন্তু MTU-র কারণে D-এর একটি ঊর্ধ্বসীমা আছে। তাই সর্বোচ্চ efficiency = MSS ÷ (MSS + H). ডেটা MSS-এর চেয়ে বড় হলে একাধিক segment-এ ভাগ হয়, আর প্রতিটি segment নিজের পূর্ণ header নিয়ে যায় — অনুশীলন ১-এ এটি হিসাব করবেন।
৭ · ভেতরে উঁকি — hex থেকে স্তর আলাদা করা
Wireshark বা tcpdump (পর্ব ৫৫) একটি frame ধরলে আসলে পায় কিছু বাইট — আর কিছু না। সেই বাইট থেকে স্তরগুলো আলাদা করা যায় ঠিক এই কারণে যে প্রতিটি header-এর একটি ঘর বলে দেয় পরের অংশে কী আছে: EtherType বলে IP, IP-র protocol ঘর বলে UDP, UDP-র length বলে ডেটা কতটুকু। নিচে একটি ছোট LAN-এ (192.168.1.10 থেকে 192.168.1.20) UDP-তে “Hi” পাঠানোর একটি frame-এর hex আছে (FCS ধরা হয়নি, যেমন capture-এ সাধারণত দেখা যায়)। Decoder প্রতিটি স্তরের ঘর ছাপে আর IPv4 header-এর checksum যাচাই করে:
// Decode one captured frame: Ethernet II + IPv4 + UDP (FCS not captured).
const hex = "020000000002 020000000001 0800" + // Ethernet
"4500 001e 1c46 4000 4011 9b1a c0a8010a c0a80114" + // IPv4
"c350 2328 000a 4d89" + "4869"; // UDP + data
const b = hex.replace(/ /g, "").match(/../g).map(x => parseInt(x, 16));
const u16 = i => (b[i] << 8) | b[i + 1];
const mac = i => b.slice(i, i + 6).map(x => x.toString(16).padStart(2, "0")).join(":");
const ip = i => b.slice(i, i + 4).join(".");
const h4 = n => "0x" + n.toString(16).padStart(4, "0");
console.log(`frame length: ${b.length} bytes`);
console.log(`L2 Ethernet: dst=${mac(0)} src=${mac(6)} type=${h4(u16(12))} (IPv4)`);
const p = 14, ihl = (b[p] & 15) * 4; // IP header starts at 14
console.log(`L3 IPv4: version=${b[p] >> 4} header=${ihl}B total=${u16(p + 2)}B ` +
`ttl=${b[p + 8]} proto=${b[p + 9]} (UDP)`);
console.log(` src=${ip(p + 12)} dst=${ip(p + 16)} checksum=${h4(u16(p + 10))}`);
let sum = 0; // one's-complement sum
for (let i = p; i < p + ihl; i += 2) sum += u16(i);
while (sum > 0xffff) sum = (sum & 0xffff) + (sum >> 16);
console.log(` checksum check: sum of all 10 words = ${h4(sum)} ` +
(sum === 0xffff ? "-> OK" : "-> CORRUPT"));
const t = p + ihl; // UDP starts after IP
console.log(`L4 UDP: src port=${u16(t)} dst port=${u16(t + 2)} length=${u16(t + 4)}B`);
const data = b.slice(t + 8, t + u16(t + 4));
console.log(`L7 data: "${String.fromCharCode(...data)}" (${data.length} bytes)`);
console.log(`lengths agree: ${b.length - 14 === u16(p + 2) && u16(p + 2) - ihl === u16(t + 4)}`);আউটপুট:
frame length: 44 bytes
L2 Ethernet: dst=02:00:00:00:00:02 src=02:00:00:00:00:01 type=0x0800 (IPv4)
L3 IPv4: version=4 header=20B total=30B ttl=64 proto=17 (UDP)
src=192.168.1.10 dst=192.168.1.20 checksum=0x9b1a
checksum check: sum of all 10 words = 0xffff -> OK
L4 UDP: src port=50000 dst port=9000 length=10B
L7 data: "Hi" (2 bytes)
lengths agree: true
দৈর্ঘ্যগুলো একে অপরের সাথে মেলে: frame ৪৪ = Ethernet header ১৪ + IP total ৩০; IP total ৩০ = IP header ২০ + UDP length ১০; UDP length ১০ = UDP header ৮ + ডেটা ২। MAC ঠিকানাগুলোর প্রথম বাইট 02 — মানে “locally administered”, উদাহরণের জন্য বানানো, কোনো কোম্পানির নয়। Checksum কীভাবে বানানো হয়েছিল? প্রেরক checksum ঘর ০ রেখে header-এর দশটি ১৬-বিট word যোগ করে: 4500 + 001e + 1c46 + 4000 + 4011 + 0000 + c0a8 + 010a + c0a8 + 0114 = 0x264e3. ১৬ বিটের বাইরের অংশ (২) ঘুরিয়ে যোগ করলে 0x64e3 + 0x2 = 0x64e5, আর তার one's complement = 0x9b1a. প্রাপক checksum-সহ সব word যোগ করলে ঠিক 0xffff পায় — যেমন decoder দেখাল। একটি বিটও বদলালে যোগফল আর 0xffff থাকবে না। এই সাধারণ checksum-এর শক্তি আর দুর্বলতা পর্ব ০৯-এ, IPv4 header-এর প্রতিটি ঘর পর্ব ১৬-এ। আর তারে এই frame যাওয়ার আগে NIC ৪৪ থেকে ৬০ বাইট পর্যন্ত padding আর ৪ বাইট FCS যোগ করবে।
একই frame এবার C-তে বানিয়ে দেখি। প্রতিটি header একটি struct, ঘরগুলো নির্দিষ্ট আকারের (uint8_t, uint16_t, uint32_t) যাতে কোনো মেশিনে আকার না বদলায়। বহু-বাইটের সংখ্যা নেটওয়ার্কে যায় big-endian ক্রমে (“network byte order”), তাই htons/htonl. Buffer-এ সবচেয়ে বাইরের header আগে, ডেটা সবশেষে:
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <arpa/inet.h> /* htons, htonl: host order -> network (big-endian) order */
struct eth { uint8_t dst[6], src[6]; uint16_t type; }; /* L2 */
struct ipv4 { uint8_t ver_ihl, tos; uint16_t len, id, frag;
uint8_t ttl, proto; uint16_t csum; uint32_t src, dst; }; /* L3 */
struct udp { uint16_t sport, dport, len, csum; }; /* L4 */
static uint16_t csum16(const uint8_t *b, size_t n) { /* one's-complement sum */
uint32_t s = 0;
for (size_t k = 0; k + 1 < n; k += 2) s += (uint32_t)(b[k] << 8 | b[k + 1]);
while (s >> 16) s = (s & 0xffff) + (s >> 16);
return (uint16_t)~s;
}
int main(void) {
const char msg[] = "Hi"; /* L7 data, 2 bytes */
struct eth e = { {2, 0, 0, 0, 0, 2}, {2, 0, 0, 0, 0, 1}, htons(0x0800) };
struct ipv4 i = { 0x45, 0, htons(20 + 8 + 2), htons(0x1c46), htons(0x4000),
64, 17, 0, htonl(0xc0a8010a), htonl(0xc0a80114) };
struct udp u = { htons(50000), htons(9000), htons(8 + 2), htons(0x4d89) };
i.csum = htons(csum16((const uint8_t *)&i, sizeof i));
uint8_t buf[64]; size_t off = 0; /* outermost header first */
memcpy(buf + off, &e, sizeof e); off += sizeof e;
memcpy(buf + off, &i, sizeof i); off += sizeof i;
memcpy(buf + off, &u, sizeof u); off += sizeof u;
memcpy(buf + off, msg, 2); off += 2;
printf("sizeof eth=%zu ip=%zu udp=%zu\n", sizeof e, sizeof i, sizeof u);
printf("offsets: eth=0 ip=%zu udp=%zu data=%zu total=%zu\n",
sizeof e, sizeof e + sizeof i, off - 2, off);
printf("ip.src at byte %zu of IP header, checksum=0x%04x\n",
offsetof(struct ipv4, src), ntohs(i.csum));
for (size_t k = 0; k < off; k++) printf("%s%02x", k == 0 ? "" : k % 16 ? " " : "\n", buf[k]);
printf("\n"); return 0;
}আউটপুট:
sizeof eth=14 ip=20 udp=8
offsets: eth=0 ip=14 udp=34 data=42 total=44
ip.src at byte 12 of IP header, checksum=0x9b1a
02 00 00 00 00 02 02 00 00 00 00 01 08 00 45 00
00 1e 1c 46 40 00 40 11 9b 1a c0 a8 01 0a c0 a8
01 14 c3 50 23 28 00 0a 4d 89 48 69
তিনটি struct-এর আকার ১৪, ২০ আর ৮ — ঠিক protocol-এর header-এর মতো, কারণ ঘরগুলো এমনভাবে সাজানো যে compiler-কে কোনো ফাঁক (padding) বসাতে হয়নি: ip.src বসেছে ১২ নম্বর বাইটে, যা ৪-এর গুণিতক। Offset-গুলো encapsulation-এর ছবিই বলে: Ethernet ০ থেকে, IP ১৪ থেকে, UDP ৩৪ থেকে, ডেটা ৪২ থেকে, মোট ৪৪. Hex dump-টি JavaScript decoder-এর hex-এর সাথে বাইট-বাইট মেলে, আর C-এর হিসাব করা checksum-ও একই 0x9b1a. (UDP checksum 0x4d89 হাতে বসানো — এটি একটি “pseudo-header”-সহ হিসাব হয়, পর্ব ২৮-এ।) একটি সতর্কতা: বাস্তব কোডে buffer-এর মাঝখানে সরাসরি struct pointer বসিয়ে পড়া (casting) alignment আর byte order-এর ঝামেলা আনে; এখানে তাই memcpy ব্যবহার করা হয়েছে।
৮ · OS-এর ভেতরে স্তরগুলো কোথায় থাকে
স্তর শুধু কাগজের ছবি নয় — আপনার কম্পিউটারে এগুলো আলাদা আলাদা জায়গায় থাকে, আলাদা মানুষের লেখা কোডে। একটি সাধারণ Linux, Windows বা macOS মেশিনে:
| স্তর | কোথায় চলে | কে লেখে | উদাহরণ |
|---|---|---|---|
| Application (TLS-সহ) | User space — সাধারণ প্রোগ্রাম | অ্যাপ-নির্মাতা, library | Chrome, nginx, curl; OpenSSL বা BoringSSL library |
| Interface | System call-এর সীমানা | OS | socket API: socket, connect, send, recv |
| Transport আর Network | Kernel | OS-নির্মাতা | Linux-এর net/ipv4; Windows-এর tcpip.sys; macOS-এর XNU-তে BSD থেকে আসা stack |
| Link (সফটওয়্যার অংশ) | Kernel-এর device driver | NIC-নির্মাতা বা OS | Linux-এর e1000e, iwlwifi; Windows-এর NDIS driver |
| Link আর Physical (হার্ডওয়্যার) | NIC চিপ আর firmware | চিপ-নির্মাতা | FCS হিসাব, preamble, সংকেত তৈরি; Wi-Fi-র রেডিও |
অর্থাৎ ব্রাউজার যখন send() ডাকে, তখন একটি system call হয়: CPU user mode থেকে kernel mode-এ যায়, kernel ডেটা কপি করে নিজের buffer-এ রাখে, TCP আর IP header জোড়ে, driver-কে দেয়, আর driver NIC-কে জানায় কোন মেমরি থেকে frame নিয়ে পাঠাতে হবে (DMA আর interrupt-এর বিস্তারিত — I/O systems). প্রাপকের দিকে NIC interrupt দেয়, driver frame তুলে kernel stack-এ দেয়, আর শেষে অপেক্ষারত প্রোগ্রামের recv() ফিরে আসে। একই মেশিনের দুই প্রোগ্রাম 127.0.0.1-এ কথা বললে NIC পর্যন্ত যেতেই হয় না — kernel-এর loopback device-ই frame ফিরিয়ে দেয়; আর socket-কে IPC হিসেবে ব্যবহারের তুলনা আছে IPC পর্বে।
ঢাকার একটি বড় অফিসের কথা ভাবুন। কর্মকর্তা (application) চিঠি লিখে নিজের টেবিলে রাখেন। অফিসের ডাক-বিভাগ (kernel) খাম, ঠিকানা আর রেজিস্ট্রি নম্বর সামলায় — কর্মকর্তা সেখানে ঢুকতে পারেন না, শুধু জানালা দিয়ে চিঠি দেন (system call). আর গেটের পিয়ন (driver আর NIC) চিঠির ব্যাগ কুরিয়ারের গাড়িতে তুলে দেন। প্রতিটি ধাপ আলাদা ঘরে, আলাদা লোকের হাতে — এবং নিরাপত্তার জন্যই এই বিভাজন।
আরও গভীরে: Linux kernel-এ একটি packet থাকে struct sk_buff (সংক্ষেপে skb)-এ। Header জোড়ার সময় ডেটা বারবার কপি না করার জন্য kernel buffer-এর সামনে আগে থেকেই ফাঁকা জায়গা (headroom) রাখে, আর প্রতিটি স্তর skb_push() দিয়ে শুধু pointer পিছিয়ে নিজের header লেখে; প্রাপকের দিকে skb_pull() pointer এগিয়ে header “সরায়” — encapsulation আসলে pointer-এর খেলা। আধুনিক NIC আরও এক ধাপ এগিয়ে স্তরের কাজ নিজে করে নেয়: checksum offload, TSO/GSO (kernel একটি বড় segment দেয়, NIC বা driver সেটি MSS আকারের অনেক frame-এ কাটে) আর প্রাপকের দিকে GRO (ছোট ছোট packet জোড়া লাগিয়ে বড় করে stack-এ তোলা)। তাই tcpdump-এ কখনো MTU-র চেয়ে বড় “packet” দেখলে অবাক হবেন না — capture হয়েছে offload-এর আগে বা পরে। আর DPDK-র মতো kernel bypass প্রযুক্তি পুরো stack-টাই user space-এ নিয়ে আসে সর্বোচ্চ গতির জন্য; QUIC-ও (পর্ব ৩৩) transport-এর কাজ user space-এর library-তে করে।
৯ · স্তরের নিয়ম ভাঙা — layer violation আর সমালোচনা
এ পর্যন্ত স্তরকে প্রায় পবিত্র নিয়মের মতো দেখিয়েছি। বাস্তবের ইন্টারনেট এতটা পরিপাটি নয়। অনেক যন্ত্র আর প্রোটোকল ইচ্ছে করেই অন্য স্তরের header দেখে বা বদলায় — একে বলে layer violation. কয়েকটি গুরুত্বপূর্ণ উদাহরণ:
- NAT: বাড়ির router একটি network স্তরের যন্ত্র, কিন্তু অনেক ডিভাইসকে একটি public IP দিয়ে চালাতে সে TCP/UDP-র port নম্বর বদলায় (transport স্তর!) আর তাই TCP/UDP checksum-ও নতুন করে লেখে। FTP-র মতো protocol, যার application ডেটার ভেতরে IP ঠিকানা লেখা থাকে, NAT-এর পেছনে ঠিকমতো চলাতে router-কে application স্তরও খুলে দেখতে হয় (ALG). বিস্তারিত পর্ব ১৯-এ।
- Firewall আর DPI: “port 443 খোলা, বাকি বন্ধ” — এটি L3 যন্ত্রের L4 সিদ্ধান্ত। Deep packet inspection আরও ভেতরে application ডেটা পর্যন্ত দেখে।
- Load balancer আর proxy: L7 load balancer HTTP-র URL বা cookie দেখে কোন সার্ভারে পাঠাবে ঠিক করে — মাঝপথে বসে দুই প্রান্তের কথোপকথনে অংশ নেয়।
- MSS clamping: PPPoE বা VPN-এর মতো লিংকে MTU ছোট হলে router TCP handshake-এর MSS option বদলে দেয়, যাতে বড় packet আটকে না যায় — network যন্ত্র transport header লিখছে।
এসব যন্ত্রকে একসাথে বলে middlebox. এগুলো বাস্তব সমস্যার সমাধান করে, কিন্তু দাম আছে: ইন্টারনেট “জমে” যায় (ossification). একটি middlebox যদি শুধু চেনা TCP option-ই পাস করতে দেয়, তাহলে TCP-তে নতুন বৈশিষ্ট্য যোগ করা কার্যত অসম্ভব হয়ে পড়ে — যদিও দুই প্রান্ত দুটিই নতুন সংস্করণ বোঝে। SCTP-র মতো নতুন transport protocol বহু বছর পরেও সাধারণ ইন্টারনেটে প্রায় চলে না, কারণ অনেক NAT আর firewall শুধু TCP আর UDP চেনে। QUIC-এর নকশাকারীরা এজন্যই UDP-র ওপর বানিয়েছেন আর header-এর প্রায় সবটা encrypt করেছেন — যাতে মাঝপথের কেউ দেখে “অভ্যস্ত” হয়ে যেতে না পারে (পর্ব ৩৩)।
Layering কি সবসময় ভালো?
২০০২ সালের RFC 3439-এ একটি অংশের শিরোনামই “Layering Considered Harmful” — যুক্তি হলো, কঠোর স্তরভাগ কখনো কখনো একই কাজ একাধিক স্তরে বারবার করায় (যেমন একাধিক স্তরে ত্রুটি-যাচাই আর retransmission) আর তথ্য লুকিয়ে রেখে ভালো সিদ্ধান্ত নিতে দেয় না। বেতার নেটওয়ার্ক এর সবচেয়ে পরিচিত উদাহরণ: TCP ধরে নেয় packet হারানো মানে রাস্তায় জ্যাম (congestion), তাই গতি কমায়। কিন্তু মোবাইলের দুর্বল সিগন্যালে packet হারায় রেডিওর ত্রুটিতে — তখন গতি কমানো ভুল ওষুধ। এজন্য Wi-Fi আর মোবাইল নেটওয়ার্ক link স্তরেই দ্রুত retransmission করে, আর গবেষকেরা বহু “cross-layer” নকশা প্রস্তাব করেছেন, যেখানে এক স্তর আরেক স্তরকে ইঙ্গিত দেয়।
Layering একটি নকশার নীতি, প্রকৃতির নিয়ম নয়। এটি জটিলতা সামলায়, স্বাধীন উন্নয়ন সম্ভব করে আর সমস্যা খোঁজাকে সহজ করে (“L1 ঠিক আছে? তার লাগানো? L2 — link আলো জ্বলছে? L3 — IP আছে?”)। কিন্তু ভালো প্রকৌশলী জানেন কোথায় নিয়মটি ভাঙা হয়েছে, কেন, আর তার দাম কী।
১০ · AI-এর যুগে স্তর-চিন্তা
“OSI model কী?” — এই প্রশ্নে যেকোনো AI চোখের পলকে একটি সুন্দর টেবিল দেবে। সমস্যা হলো, সেই টেবিলে প্রায়ই সূক্ষ্ম ভুল থাকে, আর আত্মবিশ্বাসী ভঙ্গিতে লেখা বলে চোখ এড়িয়ে যায়। স্তরের ধারণা পরিষ্কার থাকলে আপনি সেগুলো ধরতে পারবেন। নেটওয়ার্কিং বিষয়ে AI-এর সাধারণ ভুল:
| AI-এর ভুল | উদাহরণ | কীভাবে যাচাই করবেন |
|---|---|---|
| স্তর বা PDU গুলিয়ে ফেলা | “Switch IP ঠিকানা দেখে frame পাঠায়”, “TCP-র PDU packet” | এই পর্বের টেবিল; device কোন ঠিকানা দেখে সিদ্ধান্ত নেয় তা জিজ্ঞেস করুন |
| Overhead বা subnet-এর ভুল হিসাব | FCS বাদ দেওয়া, padding ভুলে যাওয়া, শতাংশ ভুল | নিজে আবার হিসাব করুন বা ছোট একটি simulator চালান |
| পুরোনো কমান্ড | ifconfig, netstat, route (Linux-এ এখন ip, ss) | man ip, man ss; পর্ব ০৬ |
| Vendor-নির্দিষ্ট জিনিসকে সার্বজনীন বলা | Cisco IOS কমান্ডকে “router-এর কমান্ড” বলা | কোন OS বা vendor, স্পষ্ট জিজ্ঞেস করুন; ডকুমেন্টেশন মিলিয়ে নিন |
| অনিরাপদ পরামর্শ | “কাজ না করলে firewall বন্ধ করুন” বা “সব port খুলে দিন” | ন্যূনতম অনুমতির নীতি: শুধু দরকারি port, শুধু দরকারি উৎস |
| বানানো RFC নম্বর বা ভুল সাল | ভুল RFC-কে TCP-র মান বলা | rfc-editor.org-এ RFC নম্বর আর শিরোনাম মিলিয়ে নিন |
AI-কে স্তর নিয়ে প্রশ্ন করার সময় তাকে হিসাব দেখাতে বলুন আর অনিশ্চয়তা স্বীকার করতে বলুন:
AI-এর দেওয়া নেটওয়ার্ক-উত্তর গ্রহণের আগে — চেকলিস্ট
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- OSI-র সাতটি স্তরের নাম ও কাজ লিখুন। — Physical (bit), Data link (frame, MAC), Network (packet, IP, routing), Transport (segment, port, নির্ভরযোগ্যতা), Session, Presentation, Application.
- OSI আর TCP/IP-এর পার্থক্য? — OSI ৭ স্তর, আগে মডেল পরে protocol, তাত্ত্বিক কাঠামো; TCP/IP ৪ স্তর, আগে protocol পরে মডেল, ইন্টারনেটে চলে; ওপরের তিন স্তর মিলে application, নিচের দুই মিলে link.
- Encapsulation কী? — প্রতিটি স্তর ওপরের PDU-কে payload ধরে নিজের header (link-এ trailer-ও) যোগ করে; প্রাপক উল্টো ক্রমে খোলে।
- Switch, router আর hub কোন স্তরের? — Hub physical (L1), switch data link (L2, MAC দেখে), router network (L3, IP দেখে)।
- ১০০০ বাইট ডেটা, TCP/IP/Ethernet-এ efficiency? — ১০০০ ÷ (১০০০ + ২০ + ২০ + ১৮) = ১০০০ ÷ ১০৫৮ ≈ ৯৪.৫২%.
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১সরকার, টেলিকম কোম্পানি আর আন্তর্জাতিক মান সংস্থার সমর্থন থাকা সত্ত্বেও OSI-র protocol কেন হারল, আর TCP/IP কেন জিতল?
এটি প্রযুক্তির ইতিহাসের একটি প্রিয় কেস স্টাডি, কারণ এখানে “কাগজে ভালো” আর “বাস্তবে চলে” — এই দুইয়ের লড়াই স্পষ্ট দেখা যায়।
- কোড আগে, না কমিটি আগে: TCP/IP-এর protocol-গুলো তৈরি হয়েছিল ছোট দলে, পরীক্ষা করে, বারবার বদলে। ১৯৮৩ সালে ARPANET পুরোপুরি TCP/IP-তে চলে যায়, আর প্রায় একই সময়ে বার্কলের বিনামূল্যের BSD Unix-এ TCP/IP-এর implementation যুক্ত হয়। বিশ্ববিদ্যালয়গুলো তখন Unix workstation কিনছিল — ফলে হাজার হাজার মেশিনে কোনো আলাদা খরচ ছাড়াই TCP/IP পৌঁছে যায়। OSI-র মান তখনো কমিটিতে আলোচনায়।
- জটিলতা আর বিকল্পের ভার: OSI-র মানগুলো বহু পক্ষকে খুশি করতে গিয়ে অসংখ্য বিকল্প রেখেছিল — যেমন transport-এর পাঁচটি class (TP0–TP4). দুই কোম্পানি একই মান মেনে বানিয়েও আলাদা বিকল্প বেছে নিলে একে অপরের সাথে কথা বলতে পারত না। Tanenbaum তাঁর পাঠ্যবইয়ে OSI-র ব্যর্থতাকে খারাপ সময়, খারাপ প্রযুক্তি, খারাপ implementation আর খারাপ রাজনীতির ফল বলেছেন।
- উন্মুক্ততা: RFC যে কেউ বিনামূল্যে পড়তে পারত, আর IETF-এর সভায় যে কেউ অংশ নিতে পারত। “Rough consensus and running code” — এই দর্শনে কোনো প্রস্তাব গৃহীত হতে বাস্তবে চলে এমন একাধিক implementation দেখাতে হতো।
- নেটওয়ার্ক প্রভাব: যত বেশি মেশিন TCP/IP বলে, নতুন মেশিনের জন্য TCP/IP তত বেশি মূল্যবান। ১৯৯০-এর দশকে ওয়েবের বিস্ফোরণ এই চক্রকে চূড়ান্ত করে; মার্কিন সরকারের GOSIP-এর মতো OSI-পক্ষের নীতিও শেষে শিথিল হয়ে যায় বলে জানা যায়।
তবে “OSI পুরোপুরি ব্যর্থ” বলাও ঠিক নয়। এর স্তরের ভাষা সার্বজনীন হয়েছে, IS-IS routing আজও বড় ISP-তে চলে, আর X.509 certificate-এর ফর্ম্যাট এসেছে OSI-র X.500 পরিবার থেকে — আপনার ব্রাউজারের প্রতিটি HTTPS সংযোগে সেটি ব্যবহার হয়।
মূল উপলব্ধি: প্রযুক্তি গ্রহণে সময়, খরচ, সরলতা আর চালু কোড প্রায়ই “নিখুঁত নকশা”-র চেয়ে বেশি গুরুত্বপূর্ণ। আজও নতুন protocol নিয়ে বিতর্কে এই শিক্ষাটি বারবার ফিরে আসে।
প্র ০২OSI-তে ঠিক সাতটি স্তর কেন? Session আর presentation স্তর বাস্তবে কোথায় গেল, আর TLS কোন স্তরের?
সাত সংখ্যাটির পেছনে কোনো গাণিতিক প্রমাণ নেই; এটি নকশাকারীদের কিছু নির্দেশিকার ফল। OSI-র নথিতে স্তর ভাগের যে নীতিগুলোর কথা বলা হয়, সেগুলোর সারকথা মোটামুটি এমন: যেখানে ভিন্ন ধরনের বিমূর্ততা দরকার সেখানে নতুন স্তর; প্রতিটি স্তরের কাজ সুনির্দিষ্ট; স্তরের সীমানা এমন জায়গায়, যেখান দিয়ে তথ্যপ্রবাহ কম; আর স্তর এত বেশি নয় যে পুরো কাঠামো অচল হয়ে যায়। সমালোচকেরা যোগ করেন, তখনকার রাজনীতিও প্রভাব ফেলেছিল — যেমন IBM-এর SNA-রও সাতটি স্তর ছিল।
বাস্তবে নিচের চারটি স্তর ইন্টারনেটে খুব স্পষ্ট — physical, link, network, transport — প্রতিটির নিজস্ব protocol আর নিজস্ব যন্ত্র। কিন্তু session আর presentation-এর জন্য আলাদা, সার্বজনীন protocol তৈরি হয়নি। কারণ এই কাজগুলো এক অ্যাপ থেকে আরেক অ্যাপে এতটা আলাদা যে একটি সাধারণ সমাধান কাউকেই পুরো খুশি করে না। ফলে:
- Presentation-এর কাজ (encoding, compression) এখন application protocol নিজেই করে — HTTP-এর
Content-Type,Content-Encoding: gzip, JSON বা Protocol Buffers. - Session-এর কাজ (কথোপকথনের অবস্থা) — HTTP cookie, ডাউনলোড থেমে গেলে মাঝখান থেকে শুরু (Range request), WebSocket-এর সংযোগ।
- TLS: এটি TCP-র ওপরে আর application-এর নিচে বসে encryption, অখণ্ডতা আর পরিচয় যাচাই দেয়। Encryption presentation-এর মতো, handshake আর session resumption session-এর মতো। তাই একেক বই একেক জায়গায় রাখে; TCP/IP মডেলে এটি সাধারণত application স্তরের অংশ, আর QUIC-এ TLS 1.3 সরাসরি transport-এর ভেতরে ঢুকে গেছে।
এখান থেকে বোঝা যায়, মডেল হলো একটি মানচিত্র। মানচিত্রের সীমারেখা মাটিতে আঁকা থাকে না, কিন্তু পথ খুঁজতে মানচিত্র লাগে।
মূল উপলব্ধি: OSI-কে “ইন্টারনেট এভাবে বানানো” না ভেবে “নেটওয়ার্কের কাজ নিয়ে কথা বলার একটি সাধারণ ভাষা” হিসেবে দেখুন। কোনো protocol কোন স্তরে, তা নিয়ে মতভেদ থাকলে সেটি স্বীকার করাই প্রকৌশলীর সততা।
প্র ০৩ইন্টারনেটের মাঝখানে কেন একটিমাত্র protocol (IP), আর “end-to-end” নীতি এর সাথে কীভাবে জড়িত?
TCP/IP স্তরগুলো একটি বালিঘড়ির (hourglass) মতো আঁকা যায়। ওপরে অসংখ্য application — ওয়েব, ইমেইল, ভিডিও কল, অনলাইন গেম। নিচে অসংখ্য link প্রযুক্তি — Ethernet, Wi-Fi, 4G/5G, fiber, স্যাটেলাইট। আর ঠিক মাঝখানে, সবচেয়ে সরু জায়গায় — একটিমাত্র protocol: IP. Steve Deering ২০০১ সালের এক IETF বক্তৃতায় এই “সরু কোমর” ধারণাটিকে বিখ্যাত করেন বলে জানা যায়।
কেন সরু কোমর এত শক্তিশালী? M রকম application আর N রকম link থাকলে প্রতিটি জোড়ার জন্য আলাদা ব্যবস্থা লাগলে M × N কাজ। মাঝখানে একটি সাধারণ IP থাকলে লাগে M + N: প্রতিটি নতুন link প্রযুক্তিকে শুধু “IP বহন করা” শিখতে হয়, আর প্রতিটি নতুন application-কে শুধু IP-র ওপর চলা। ১৯৮০-র দশকে কেউ 5G বা Netflix-এর কথা ভাবেনি, তবু দুটিই কোনো router-এর মৌলিক নকশা না বদলেই ইন্টারনেটে এসেছে।
End-to-end নীতি: Saltzer, Reed আর Clark-এর ১৯৮৪ সালের প্রবন্ধ “End-to-End Arguments in System Design” যুক্তি দেয়: কিছু কাজ (যেমন ফাইলটি ঠিকঠাক পৌঁছেছে কি না নিশ্চিত হওয়া) কেবল দুই প্রান্তের application-ই পুরোপুরি করতে পারে, কারণ শুধু তারাই জানে “ঠিক” মানে কী। মাঝের নেটওয়ার্ক যতই নির্ভরযোগ্য হোক, শেষ পর্যন্ত প্রান্তকে যাচাই করতেই হবে। তাই নেটওয়ার্কের মাঝখান সরল রাখা ভালো — IP শুধু “চেষ্টা করব” (best effort) প্রতিশ্রুতি দেয়; নির্ভরযোগ্যতা, ক্রম, encryption প্রান্তে, TCP বা application-এ। মাঝের অংশে কাজ রাখা যায় শুধু performance বাড়ানোর জন্য (যেমন Wi-Fi-র link-স্তরের retransmission).
দাম: সরু কোমর বদলানো সবচেয়ে কঠিন। IPv4 থেকে IPv6-এ যাওয়া কয়েক দশক ধরে চলছে (পর্ব ২১), কারণ মাঝখানের এই একটি protocol বদলাতে হলে পৃথিবীর প্রায় প্রতিটি যন্ত্রকে বদলাতে হয়।
মূল উপলব্ধি: একটি সাধারণ, সরল মধ্যস্তর উদ্ভাবনকে দুই দিকেই মুক্ত করে দেয় — এটিই ইন্টারনেটের সাফল্যের বড় কারণ। কিন্তু যা সবাই ব্যবহার করে, তা বদলানোও সবচেয়ে কঠিন।
প্র ০৪Middlebox কীভাবে ইন্টারনেটকে “জমিয়ে” দিল, আর QUIC কেন UDP-র ওপর বানানো ও প্রায় পুরোটা encrypt করা?
স্তরের তত্ত্ব অনুযায়ী মাঝের router শুধু IP header দেখবে। কিন্তু ১৯৯০-এর দশক থেকে IPv4 ঠিকানার ঘাটতি আর নিরাপত্তার চাহিদায় ইন্টারনেট ভরে গেছে NAT, firewall, load balancer, “transparent” proxy, DPI যন্ত্রে। এগুলো TCP header পড়ে, অনেক সময় বদলায়, আর যা চেনে না তা ফেলে দেয় বা “ঠিক” করে দেয়।
ফল — ossification (জমে যাওয়া): ধরুন TCP-তে একটি নতুন option যোগ করা হলো। দুই প্রান্তের OS নতুন সংস্করণ বোঝে, কিন্তু মাঝপথের কোনো পুরোনো firewall অচেনা option দেখে packet ফেলে দেয় বা option মুছে দেয়। গবেষকেরা বাস্তব নেটওয়ার্কে মেপে দেখেছেন যে অচেনা option বা অস্বাভাবিক ঘরের মান অনেক পথে টিকে থাকে না। এজন্যই TCP Fast Open বা Multipath TCP-র মতো উন্নতি ব্যাপকভাবে চালু করা কঠিন হয়েছে, আর SCTP-র মতো সম্পূর্ণ নতুন transport সাধারণ ইন্টারনেটে প্রায় অচল — কারণ বহু NAT শুধু TCP আর UDP-র port চেনে।
QUIC-এর জবাব: Google-এর পরীক্ষা থেকে শুরু হয়ে IETF-এ মান হওয়া QUIC (২০২১ সালে RFC 9000) দুটি কৌশল নেয়। প্রথমত, এটি UDP-র ওপর চলে — যা প্রায় সব NAT আর firewall পার হতে পারে। দ্বিতীয়ত, প্রায় পুরো transport header (packet নম্বর, ACK-এর তথ্য) encrypt করা, যাতে মাঝপথের যন্ত্র দেখতেই না পায়, আর তাই এর ওপর নির্ভরশীল কোনো “অভ্যাস” গড়ে তুলতে না পারে। নকশাকারীরা একটি সংস্করণ-ঘর রেখেছেন এবং “greasing”-এর মতো কৌশলের কথাও বলেছেন — অর্থহীন মান ইচ্ছে করে পাঠানো, যাতে যন্ত্রগুলো অচেনা মান সহ্য করতে শেখে।
অন্য দিক: নেটওয়ার্ক অপারেটরদের অভিযোগ — encrypt করা transport-এ তারা সমস্যা খুঁজতে বা performance মাপতে পারেন না। QUIC-এ “spin bit” নামে একটি ঐচ্ছিক বিট রাখা হয়েছে, যা দিয়ে মাঝপথ থেকে আনুমানিক round-trip time মাপা যায় — গোপনীয়তা আর পরিচালনার মধ্যে একটি সমঝোতা।
মূল উপলব্ধি: নেটওয়ার্কে যা কিছু দেখা যায়, কেউ না কেউ তার ওপর নির্ভর করতে শুরু করে — আর তখন সেটি বদলানো যায় না। Layering-এর সীমা রক্ষার সবচেয়ে কার্যকর উপায় হয়ে দাঁড়িয়েছে cryptography.
প্র ০৫প্রতিটি স্তরের header জোড়া, কপি আর যাচাই — layering-এর performance-খরচ বাস্তবে কতটা, আর আধুনিক সিস্টেম কীভাবে তা কমায়?
খরচটা দুই রকম। একটি তারের খরচ — header-এর বাইট, যা আমরা অংশ ৬-এ হিসাব করেছি: বড় packet-এ মাত্র কয়েক শতাংশ, কিন্তু ছোট packet-এ (VoIP, অনলাইন গেম, IoT সেন্সর) অর্ধেকেরও বেশি। এজন্য মোবাইল নেটওয়ার্কে header compression (যেমন ROHC) ব্যবহার হয়, যেখানে প্রতিবার একই রকম IP/UDP/RTP header না পাঠিয়ে শুধু পরিবর্তনটুকু পাঠানো হয়।
অন্যটি CPU-র খরচ: প্রতিটি packet-এর জন্য system call, user থেকে kernel-এ ডেটা কপি, প্রতিটি স্তরে header লেখা ও পড়া, checksum হিসাব, interrupt. ১০ Gbit/s লিংকে ১৫০০ বাইটের packet প্রায় আট লাখ প্রতি সেকেন্ডে আসে — প্রতিটির জন্য গড়ে মাত্র ১.২ মাইক্রোসেকেন্ডের মতো সময়। স্তরে স্তরে সরল implementation এই গতিতে টিকতে পারে না। সমাধানগুলো সবই একভাবে “স্তরের সীমা নরম করা”:
- কপি এড়ানো: Linux-এর sk_buff-এ headroom রেখে header জোড়া, যাতে ডেটা সরাতে না হয়;
sendfileবা zero-copy send-এ ফাইলের page সরাসরি NIC-এর কাছে। - হার্ডওয়্যারে কাজ সরানো (offload): NIC-ই checksum হিসাব করে, TSO-তে বড় একটি segment কেটে অনেক frame বানায়, GRO/LRO-তে প্রাপকের দিকে ছোটগুলো জোড়া লাগায়, RSS-এ বিভিন্ন সংযোগ বিভিন্ন CPU core-এ ভাগ করে।
- পুরো stack সরানো: DPDK-র মতো kernel bypass বা RDMA (InfiniBand, RoCE), যেখানে application সরাসরি NIC-এর সাথে কথা বলে; ডেটা সেন্টারে বা উচ্চ-গতির ট্রেডিং সিস্টেমে ব্যবহৃত। আবার উল্টো দিকে, eBPF/XDP দিয়ে kernel-এর একেবারে প্রবেশমুখে ছোট প্রোগ্রাম চালিয়ে অপ্রয়োজনীয় packet আগেই ফেলে দেওয়া যায় — DDoS প্রতিরক্ষায় কাজের।
লক্ষ করুন, এর কোনোটিই protocol-এর স্তর বদলায় না — তারে যাওয়া বাইট একই থাকে। বদলায় implementation: কোন কাজ কোথায় হবে। এটিই layering-এর আরেকটি সুবিধা — মডেল ঠিক রেখে ভেতরের কাজ যত খুশি দ্রুত করা যায়।
মূল উপলব্ধি: স্তর হলো ভাবনা আর interoperability-র জন্য; গতির জন্য ইঞ্জিনিয়ারেরা implementation-এ স্তরের সীমা যত্ন করে ভাঙেন। যিনি দুটিকে আলাদা করে দেখতে পারেন, তিনিই নেটওয়ার্ক performance-এর সমস্যা ধরতে পারেন।
অনুশীলন
খাতা-কলম নিয়ে বসুন — হিসাবগুলো নিজে করে তারপর উত্তর মেলান।
-
হাতে হিসাব (MSS-এ ভাগ): একটি application ২০০০ বাইট ডেটা TCP দিয়ে IPv4-এর ওপর Ethernet-এ পাঠাবে। MSS ১৪৬০ বাইট, কোনো option নেই। কয়টি segment যাবে, প্রতিটি frame কত বাইট, frame-এর হিসাবে মোট efficiency কত?
MSS ১৪৬০, তাই ডেটা ভাগ হবে ১৪৬০ + ৫৪০ — ২টি segment.
- প্রথম frame: ১৪৬০ + ২০ + ২০ + ১৮ = ১৫১৮ বাইট (Ethernet-এর সর্বোচ্চ)।
- দ্বিতীয় frame: ৫৪০ + ৫৮ = ৫৯৮ বাইট (packet ৫৮০, ৪৬-এর বেশি, তাই padding নেই)।
- মোট ২১১৬ বাইট; efficiency = ২০০০ ÷ ২১১৬ ≈ ৯৪.৫২%. প্রতিটি segment নিজের পূর্ণ ৫৮ বাইটের header নিয়ে যায়, তাই মোট header ১১৬ বাইট।
মজার ব্যাপার, উত্তর ১০০০ বাইটের উদাহরণের সমান — কারণ ২০০০ ÷ ২১১৬ = ১০০০ ÷ ১০৫৮. প্রতি ১০০০ বাইট ডেটায় ৫৮ বাইট header, এই অনুপাত দুই ক্ষেত্রেই একই। তারের হিসাবে (প্রতি frame-এ ২০ বাইট বাড়তি) ২০০০ ÷ ২১৫৬ ≈ ৯২.৭৬%.
-
স্তর চিনুন: নিচের প্রতিটি কোন স্তরের (৫ স্তরের মডেলে)? (ক) MAC ঠিকানা (খ) port 443 (গ) TTL (ঘ) FCS (ঙ) DNS query (চ) hub (ছ) router-এর forwarding সিদ্ধান্ত (জ) preamble.
(ক) Link — frame-এর ঠিকানা, প্রতিটি hop-এ বদলায়। (খ) Transport — port ঠিক প্রোগ্রামটিকে চেনায়; 443 সাধারণত HTTPS. (গ) Network — IP header-এর ঘর, প্রতিটি router এক কমায়, ০ হলে packet বাতিল (loop ঠেকাতে)। (ঘ) Link — Ethernet-এর trailer, CRC দিয়ে frame-এর ত্রুটি ধরে। (ঙ) Application — DNS একটি application protocol, যদিও অন্য সব application এর ওপর নির্ভর করে। (চ) Physical — hub শুধু বিট এক port থেকে সব port-এ ছড়ায়, কোনো ঠিকানা দেখে না। (ছ) Network — IP গন্তব্য দেখে routing table থেকে পরের hop. (জ) Physical — প্রাপকের ঘড়ি মেলানোর বিট-নকশা, frame-এর অংশ নয়।
-
আউটপুট অনুমান করুন: অংশ ৭-এর JavaScript decoder-এর hex-এ IPv4 অংশের
4011-কে3f11করে দিন (অর্থাৎ TTL ৬৪ থেকে ৬৩), কিন্তু checksum9b1aযেমন আছে রেখে দিন। “checksum check” লাইনে কী ছাপা হবে? Router তাহলে TTL কমানোর পর কী করে?একটি word 0x4011 থেকে 0x3f11 হলো, অর্থাৎ যোগফল 0x0100 কমল। আগে মোট ছিল 0xffff, তাই এখন হবে 0xfeff:
checksum check: sum of all 10 words = 0xfeff -> CORRUPTপ্রাপক এমন packet ত্রুটিপূর্ণ ধরে ফেলে দেবে। তাই প্রতিটি router TTL কমানোর পর IPv4 checksum নতুন করে বসায় — পুরো header আবার যোগ না করে শুধু পরিবর্তনটুকু দিয়ে “incremental” হিসাবেও তা করা যায় (RFC 1624 এর পদ্ধতি বর্ণনা করে)। IPv6 এই কারণেই header checksum বাদ দিয়েছে: link স্তরের CRC আর transport-এর checksum তো আছেই, প্রতিটি hop-এ বাড়তি কাজের দরকার কী (পর্ব ২১)।
-
কোড বদলান: অংশ ৬-এর simulator-কে IPv6-এর জন্য বদলান (IPv6 header ৪০ বাইট)। ১৪৬০ বাইট ডেটা দিলে কী সমস্যা দেখবেন? IPv6-এ সর্বোচ্চ MSS কত হওয়া উচিত, আর তখন efficiency কত?
শুধু
const IP = 40করলেই চলবে। ১৪৬০ ডেটায় packet হবে ১৪৬০ + ২০ + ৪০ = ১৫২০ বাইট — Ethernet-এর MTU ১৫০০-র বেশি! Frame হবে ১৫৩৮, যা সাধারণ Ethernet-এ যেতেই পারবে না। IPv6-এ router fragmentation করে না, তাই প্রেরককেই ছোট করতে হয় (Path MTU Discovery, পর্ব ২০–২১)। সঠিক MSS = ১৫০০ − ৪০ − ২০ = ১৪৪০ বাইট; তখন frame ১৫১৮ আর efficiency = ১৪৪০ ÷ ১৫১৮ ≈ ৯৪.৮৬% (IPv4-এর ৯৬.১৮%-এর চেয়ে কম, কারণ header ২০ বাইট বড়)। ভালো simulator-এ একটি যাচাইও যোগ করুন:if (packet > 1500) console.log("exceeds MTU").
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমপ্রেরকের দিকে ডেটা কোন ক্রমে রূপ বদলায়, সাজান (▲▼ চেপে সরান)
- Application-এর message (“Hi”)
- TCP header যোগ — segment
- IP header যোগ — packet
- Ethernet header আর FCS যোগ — frame
- Preamble-সহ bit হয়ে তারে সংকেত
OSI মডেলের কোন স্তর logical ঠিকানা (IP) আর বিভিন্ন নেটওয়ার্ক পেরিয়ে routing সামলায়?
- Data link
- Network
- Transport
- Session
১০০০ বাইট application ডেটা TCP (২০ বাইট header), IPv4 (২০ বাইট header) আর Ethernet (১৪ বাইট header + ৪ বাইট FCS) দিয়ে একটি frame-এ যাচ্ছে। Frame-এর হিসাবে efficiency প্রায় কত?
- ১০০%
- ৯৬.১৫%
- ৯৪.৫২%
- ৮৫%
একটি সাধারণ (Layer 2) Ethernet switch কোন তথ্য দেখে ঠিক করে frame কোন port দিয়ে পাঠাবে?
- গন্তব্য IP ঠিকানা
- গন্তব্য MAC ঠিকানা
- TCP/UDP port নম্বর
- ওয়েবসাইটের URL
Layered নেটওয়ার্কে “peer-to-peer যোগাযোগ” বলতে কী বোঝায়?
- দুই প্রান্তের একই স্তর protocol-এর মাধ্যমে “যেন সরাসরি” কথা বলে, যদিও আসল ডেটা নিচের স্তর দিয়ে যায়
- BitTorrent-এর মতো সার্ভার ছাড়া ফাইল ভাগাভাগি
- একই মেশিনের পাশাপাশি দুই স্তর protocol দিয়ে কথা বলে
- প্রতিটি স্তর আলাদা তার দিয়ে অন্য প্রান্তে যুক্ত
বাড়ির router-এর NAT-কে প্রায়ই “layer violation” বলা হয়। কেন?
- এটি প্রতিটি frame-এ নতুন MAC ঠিকানা বসায়
- এটি application ডেটা encrypt করে
- এটি TTL কমায়
- Network স্তরের যন্ত্র হয়েও এটি transport স্তরের port আর checksum বদলায়
৫ বাইটের একটি application বার্তা TCP/IPv4 (option নেই) দিয়ে Ethernet-এ পাঠালে frame-এর আকার কত হবে? (Ethernet-এর payload কমপক্ষে ৪৬ বাইট, header ১৪, FCS ৪)
- ৪৫ বাইট
- ৬৩ বাইট
- ৬৪ বাইট
- ৭২ বাইট
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- Layering বড় সমস্যাকে স্বাধীন স্তরে ভাগ করে: স্তর ওপরের স্তরকে service দেয়, পাশের স্তরের সাথে interface দিয়ে যুক্ত, আর অন্য প্রান্তের peer-এর সাথে protocol দিয়ে কথা বলে।
- OSI ৭ স্তর: Physical, Data link, Network, Transport, Session, Presentation, Application — PDU: bit, frame, packet, segment/datagram, message.
- TCP/IP: Application, Transport, Internet, Link (পাঠ্যবইয়ে Link ভেঙে ৫ স্তর); মাঝখানে একটিই IP — “সরু কোমর”।
- Encapsulation: প্রতিটি স্তর header (link-এ trailer-ও) যোগ করে; efficiency = ডেটা ÷ মোট, যেমন ১০০০ ÷ ১০৫৮ ≈ ৯৪.৫২%; ছোট packet-এ padding আর overhead বিশাল।
- Application থাকে user space-এ, TCP/IP kernel-এ, link driver আর NIC-এ; আর NAT-এর মতো middlebox স্তরের নিয়ম ভাঙে — যার ফল ossification আর QUIC-এর নকশা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ০৪ · Circuit switching আর packet switching — ডেটা কীভাবে যায়পরবর্তী পর্বপথ বুক করা বনাম প্যাকেটে ভাগ করে পাঠানো — ইন্টারনেট কেন দ্বিতীয়টি বেছে নিল।
- কম্পিউটার নেটওয়ার্ক · কোর্স হোম৬২টি পর্বপুরো কোর্সের রোডম্যাপ — কোন স্তর কোন মডিউলে।
- Operating Systems · System callপাশের ট্র্যাক
send()ডাকলে user space থেকে kernel-এ কীভাবে যাওয়া হয়। - Operating Systems · I/O systemsগভীরে যানDriver, DMA আর interrupt — NIC কীভাবে frame পাঠায় ও আনে।
- Computer Fundamentals · ডেটা কমিউনিকেশনভিত্তি ঝালাইনেটওয়ার্কের একদম গোড়ার ধারণাগুলো সহজ ভাষায়।