এই পর্বে যা শিখবেন
- একটি নতুন যন্ত্রের নেটওয়ার্কে ঢোকার দুটি সমস্যা, আর static বনাম dynamic কনফিগারেশন
- DORA-র প্রতিটি বার্তার IP, MAC, port, xid আর option — কেন 0.0.0.0 আর broadcast
- Lease, T1/T2, renew, rebind, release, decline, NAK; relay agent, reservation আর APIPA
- ARP packet-এর প্রতিটি ঘর, ARP cache, gratuitous আর proxy ARP, আর অন্য subnet-এ পাঠানোর আসল নিয়ম
- ভুয়া DHCP server আর ARP spoofing-এর ধারণা, আর DHCP snooping ও Dynamic ARP Inspection দিয়ে প্রতিরক্ষা
১ · নতুন যন্ত্রের দুটি প্রশ্ন — “আমি কে?” আর “পাশের জন কোথায়?”
আপনি একটি ক্যাফেতে বসে ফোনে Wi-Fi-র password দিলেন। পর্ব ১৪-এ দেখেছেন, ফোন access point-এর সাথে association আর 4-way handshake শেষ করল — এখন সে বাতাসে encrypted frame পাঠাতে পারে। কিন্তু একটি ওয়েবসাইট খুলতে এখনো অনেক কিছু অজানা। ফোনের নিজের IP ঠিকানা কী? এই নেটওয়ার্কের subnet কত বড়, অর্থাৎ কারা “পাশের বাড়ি”? বাইরে যাওয়ার দরজা (default gateway) কোনটি? আর নাম থেকে ঠিকানা বের করার DNS server কোথায়? এই চারটি তথ্য না জানলে ফোন একটি packet-ও ঠিকমতো পাঠাতে পারবে না।
চারটি তথ্য জানার পরেও আরেকটি সমস্যা থাকে, এবং সেটি আসে প্রতিটি packet পাঠানোর সময়। পর্ব ১২-এ দেখেছেন, LAN-এ frame যায় MAC ঠিকানা ধরে, IP ঠিকানা ধরে নয়। ফোন জানে gateway-র IP 192.168.10.1, কিন্তু frame-এর গন্তব্যের ঘরে লিখতে হবে ৪৮ bit-এর একটি MAC. সেটি কোথা থেকে আসবে?
ধরুন আপনি ঢাকার একটি মেসে নতুন উঠলেন। প্রথম দিন মেসের ম্যানেজারের কাছে গেলেন — তিনি খাতায় নাম লিখে বললেন: “আপনার রুম ৩০৪, এই তলার রুম ৩০১ থেকে ৩২০ পর্যন্ত, বাইরের চিঠি দেবেন নিচের দারোয়ানকে, আর কোনো ঠিকানা না জানলে নোটিশ বোর্ড দেখবেন। এই রুম এক মাসের জন্য — মাস শেষে আবার নবায়ন।” এটাই DHCP: ম্যানেজার = server, রুম নম্বর = IP ঠিকানা, তলার পরিসর = mask, দারোয়ান = gateway, নোটিশ বোর্ড = DNS, এক মাস = lease. রাতে দারোয়ানকে চিঠি দিতে চান, কিন্তু চেনেন না কে দারোয়ান — বারান্দায় হাঁক দিলেন, সবাই শুনল, উত্তর দিলেন শুধু দারোয়ান নিজে। এটাই ARP: প্রশ্ন সবার কাছে (broadcast), উত্তর শুধু আপনাকে (unicast), আর চেহারাটা কিছুদিন মনে থাকে (ARP cache).
| তথ্য | উদাহরণ (এই পর্বের অফিস) | না থাকলে কী হয় |
|---|---|---|
| IP ঠিকানা | 192.168.10.11 | কোনো IP packet পাঠানো বা পাওয়া যায় না |
| Subnet mask (বা prefix) | 255.255.255.0 = /24 | কে পাশের বাড়ি আর কে দূরে, বোঝা যায় না |
| Default gateway | 192.168.10.1 | নিজের LAN-এর ভেতরে চলে, বাইরে (ইন্টারনেটে) নয় |
| DNS server | 192.168.10.1 (router নিজেই বা অন্য কেউ) | ঠিকানা দিয়ে চলে, কিন্তু নাম লিখলে কিছুই খোলে না |
“সংখ্যার ঠিকানায় (যেমন 203.0.113.10) ping চলে, কিন্তু কোনো সাইট খোলে না” — প্রায়ই DNS-এর সমস্যা (পর্ব ৩৫)। Mask আর subnet-এর হিসাব পর্ব ১৬–১৭-এ; এখানে শুধু এটুকু: /24-এ প্রথম তিনটি সংখ্যা মিললে দুটি যন্ত্র একই subnet-এ।
হাতে বসানো (static) বনাম স্বয়ংক্রিয় (dynamic)
চারটি তথ্য দুইভাবে দেওয়া যায়। Static কনফিগারেশন-এ প্রশাসক নিজে প্রতিটি যন্ত্রে লিখে দেন। Dynamic-এ যন্ত্র চালু হয়ে নিজেই নেটওয়ার্কের কাছে চেয়ে নেয় — আজকের প্রায় সব ফোন, ল্যাপটপ আর বাসার যন্ত্র এভাবেই চলে।
Static
Router, switch, সার্ভার, প্রিন্টার — যাদের ঠিকানা সবাইকে জানতে হয় আর কখনো বদলানো উচিত নয়। সুবিধা: DHCP server বন্ধ থাকলেও চলে। অসুবিধা: শত শত যন্ত্রে হাতে লেখা, ভুলে একই ঠিকানা দুজনকে দেওয়া (duplicate IP), আর DNS server বদলালে সব যন্ত্রে গিয়ে বদলানো।
অবকাঠামোর যন্ত্রDynamic (DHCP)
ফোন, ল্যাপটপ, অতিথির যন্ত্র। একটি জায়গায় (DHCP server) পুরো নেটওয়ার্কের নিয়ম লেখা থাকে। ঠিকানা ধার দেওয়া হয় নির্দিষ্ট সময়ের জন্য, তাই চলে যাওয়া যন্ত্রের ঠিকানা আবার অন্য কেউ পায়। অসুবিধা: server না থাকলে নতুন যন্ত্র ঠিকানাই পায় না।
ব্যবহারকারীর যন্ত্রমাঝামাঝি: reservation
DHCP দিয়েই, কিন্তু একটি MAC সবসময় একই ঠিকানা পায় — অংশ ৪-এ।
স্থির, কিন্তু কেন্দ্রীয়আর ARP সবসময় চলে, প্রতিটি IPv4 যন্ত্রে, স্বয়ংক্রিয়ভাবে — এটি বন্ধ হলে Ethernet বা Wi-Fi-তে একটি IPv4 packet-ও যায় না। ARP-এর বার্তা IP packet-এর ভেতরে যায় না, সরাসরি Ethernet frame-এর ভেতরে (EtherType 0x0806) — তাই অনেকে একে “layer 2 আর 3-এর মাঝের” protocol বলেন।
ইতিহাস — RARP থেকে DHCP: ১৯৮২ সালে RFC 826-এ David Plummer ARP বর্ণনা করেন — IP থেকে MAC. উল্টো প্রশ্ন “আমার MAC জানি, আমার IP কী?”-এর জন্য ১৯৮৪ সালে আসে RARP (RFC 903). কিন্তু RARP শুধু ঠিকানা দিত, mask বা gateway নয়, আর এটি সরাসরি Ethernet-এর ওপর চলত বলে router পার হতে পারত না — প্রতিটি নেটওয়ার্কে আলাদা server লাগত। ১৯৮৫ সালে BOOTP (RFC 951) সমস্যাটি সমাধান করে UDP-র ওপর চলে, mask-gateway-সহ বেশি তথ্য দিয়ে, আর relay agent দিয়ে router পেরিয়ে; তবে প্রতিটি MAC-এর ঠিকানা প্রশাসককে আগে থেকে টেবিলে লিখতে হতো। ১৯৯৩ সালে DHCP (প্রথমে RFC 1531) আনল আসল নতুনত্ব — একটি pool থেকে নির্দিষ্ট সময়ের জন্য ঠিকানা ধার দেওয়া। আজকের মূল বিবরণ RFC 2131 (১৯৯৭), option-এর তালিকা RFC 2132-এ (পরে অনেক RFC সংশোধন আর নতুন option যোগ করেছে)। DHCP আজও BOOTP-এর বার্তার কাঠামো আর port 67/68 ব্যবহার করে।
২ · DORA — চারটি বার্তায় ঠিকানা পাওয়া
DHCP-র মূল কথোপকথনে চারটি বার্তা, যাদের প্রথম অক্ষর মিলিয়ে নাম DORA: Discover (“কোনো DHCP server আছেন?”), Offer (“আমি আছি, এই ঠিকানাটি নিতে পারেন”), Request (“আমি এই server-এর এই ঠিকানাটিই চাই”), Ack (“ঠিক আছে, এত সময়ের জন্য আপনার”). শুরুর আগে তিনটি ধাঁধা বোঝা দরকার, কারণ পরীক্ষা আর ইন্টারভিউতে এগুলোই জিজ্ঞেস করা হয়।
ধাঁধা ১ — যার ঠিকানা নেই, সে packet পাঠায় কীভাবে?
IP packet-এ উৎস ঠিকানার ঘর খালি রাখা যায় না। তাই client লেখে 0.0.0.0 — মানে “এই নেটওয়ার্কের এই যন্ত্র, যার এখনো ঠিকানা নেই”. গন্তব্য কে, তা-ও সে জানে না — server-এর ঠিকানা তো অজানা। তাই গন্তব্য 255.255.255.255, যার নাম limited broadcast: “এই LAN-এর সবাই”. Router এমন packet কখনো অন্য নেটওয়ার্কে পাঠায় না। Ethernet frame-এর গন্তব্যও broadcast ff:ff:ff:ff:ff:ff, তাই switch এটি সব port-এ flood করে (পর্ব ১২) — VLAN থাকলে শুধু সেই VLAN-এর port-এ (পর্ব ১৩)।
ধাঁধা ২ — কেন UDP, আর কেন দুটি নির্দিষ্ট port?
TCP-তে কথা শুরুর আগে দুই পক্ষের ঠিকানা-জানা একটি সংযোগ লাগে (পর্ব ২৯) — যার ঠিকানাই নেই, সে সংযোগ বানাবে কীভাবে? তাই DHCP চলে UDP-র ওপর (UDP-র বিস্তারিত পর্ব ২৮-এ)। Server শোনে port 67-এ, client 68-এ। সাধারণ client প্রোগ্রাম অস্থায়ী ephemeral port নেয়, কিন্তু DHCP client-এর port স্থির, কারণ server-এর উত্তর প্রায়ই broadcast হয়ে সব যন্ত্রে পৌঁছায় — এলোমেলো port হলে অন্য যন্ত্রের অন্য কোনো প্রোগ্রাম ভুল বার্তা পেত। UDP reliability দেয় না, তাই উত্তর না এলে client নিজেই আবার পাঠায়, প্রতিবার অপেক্ষা প্রায় দ্বিগুণ করে।
ধাঁধা ৩ — কোন উত্তর কোন প্রশ্নের, আর উত্তর পৌঁছাবে কীভাবে?
একসাথে দশটি ল্যাপটপ খুললে দশটি কথোপকথন চলে, সব broadcast. প্রতিটি client একটি এলোমেলো ৩২ bit-এর transaction ID (xid) বাছে, server প্রতিটি উত্তরে সেটি ফেরত দেয়, আর client শুধু নিজের xid (আর chaddr-এ নিজের MAC)-ওয়ালা উত্তর নেয়। আর উত্তর পৌঁছানো: server Offer-টি client-এর নতুন ঠিকানায় unicast করতে পারে, কিন্তু অনেক TCP/IP stack ঠিকানা কনফিগার হওয়ার আগে নিজের নামে আসা unicast IP packet গ্রহণই করে না। তাই এমন client Discover-এ broadcast flag (flags ঘরের সবচেয়ে বাঁ দিকের bit, 0x8000) চালু করে বলে: “উত্তর broadcast করে পাঠাবেন।” Flag বন্ধ থাকলে server সাধারণত Offer পাঠায় নতুন ঠিকানায়, frame-এর গন্তব্য client-এর MAC দিয়ে — ARP ছাড়াই, কারণ MAC তো Discover-এই লেখা ছিল।
এবার পুরো কথোপকথন। অফিসের LAN 192.168.10.0/24, router R1 নিজেই DHCP server (বাসার Wi-Fi router-এর মতো): ঠিকানা 192.168.10.1, MAC 02:aa:00:00:00:01. নতুন ল্যাপটপের MAC 02:aa:00:00:00:0a. টেবিলে MAC-এর শেষ byte-টুকুই দেখানো হয়েছে।
- ল্যাপটপ
0.0.0.0INIT - Discover
68 → 67broadcast - Offer
.11R1 থেকে - Request
opt 50, 54broadcast - Ack
3600 slease - BOUND
192.168.10.11/24ঠিকানা চালু
| বার্তা | |
| Src → Dst IP | |
| Src → Dst MAC | |
| UDP port | |
| xid | |
| মূল তথ্য | |
| ল্যাপটপের অবস্থা |
- শুরু: ঠিকানা নেই। তার লাগানো হলো বা Wi-Fi-র association শেষ হলো (পর্ব ১৪)। ল্যাপটপের DHCP client একটি এলোমেলো xid বাছল —
0x5a1c2e7b. অবস্থা INIT; নিজের IP ঠিকানা এখনো কিছুই নয়। - Discover: “কোনো server আছেন?” উৎস 0.0.0.0:68, গন্তব্য 255.255.255.255:67, frame-এর গন্তব্য ff:ff:ff:ff:ff:ff. ভেতরে নিজের MAC (chaddr), broadcast flag, আর option 55-এ একটি তালিকা: “আমার mask (1), router (3), DNS (6) আর lease time (51) লাগবে।” Switch এটি LAN-এর সব port-এ flood করল।
- Offer: “এই ঠিকানাটি নিন।” R1 নিজের pool থেকে 192.168.10.11 খালি পেল আর অল্প সময়ের জন্য আলাদা করে রাখল। উত্তরের
yiaddr(your IP address) ঘরে .11, সাথে mask, gateway, DNS, lease ৩,৬০০ সেকেন্ড আর option 54-এ নিজের পরিচয় (server identifier). xid একই, তাই ল্যাপটপ চিনল এটি তার উত্তর। Flag চালু ছিল বলে Offer broadcast-এ এলো। - Request: “আমি এটাই চাই।” LAN-এ দুটি server থাকলে দুটি Offer আসতে পারে; client সাধারণত প্রথমটি নেয়। Request এখনো broadcast, উৎস এখনো 0.0.0.0 — কারণ client এখনো ঠিকানাটি পায়নি, আর broadcast করলে সব server শোনে কাকে বাছা হলো। option 54 = 192.168.10.1 দেখে অন্য server বোঝে তার Offer বাতিল, আর নিজের আলাদা করা ঠিকানা আবার pool-এ ফেরত নেয়।
- Ack: “আপনার, ৩,৬০০ সেকেন্ডের জন্য।” R1 নিজের খাতায় লিখল: MAC …:0a → 192.168.10.11, মেয়াদ এক ঘণ্টা। ACK-এ lease time, আর T1 (option 58) = ১,৮০০, T2 (option 59) = ৩,১৫০ সেকেন্ড। ঠিকানাটি দেওয়া সম্ভব না হলে (যেমন অন্য কেউ নিয়ে ফেলেছে) R1 পাঠাত DHCPNAK, আর client আবার Discover থেকে শুরু করত।
- শেষ পরীক্ষা, তারপর BOUND. RFC 2131 পরামর্শ দেয় ঠিকানা ব্যবহারের আগে client যাচাই করুক কেউ আগে থেকেই এটি ব্যবহার করছে কি না। ল্যাপটপ একটি ARP probe পাঠাল: “192.168.10.11 কার?” (উৎস IP 0.0.0.0, অংশ ৭)। কেউ উত্তর দেয়নি — ঠিকানা মুক্ত। কেউ উত্তর দিলে ল্যাপটপ server-কে DHCPDECLINE পাঠিয়ে নতুন ঠিকানা চাইত। এখন অবস্থা BOUND: 192.168.10.11/24, gateway .1, DNS .1.
DHCP বার্তার ভেতরে — BOOTP-এর কাঠামো আর option
প্রতিটি DHCP বার্তার শুরুতে BOOTP-এর একটি স্থির অংশ (২৩৬ byte), তারপর একটি চার byte-এর “magic cookie” 63 82 53 63, তারপর option-গুলো। Option-এর গঠন সরল: ১ byte কোড, ১ byte দৈর্ঘ্য, তারপর মান — শেষে কোড 255 (end).
DHCP বার্তা (UDP payload) (bytes)
┌────┬──────┬──────┬──────┬──────────────┬──────┬──────────────┐
│ op │htype │ hlen │ hops │ xid (4) │ secs │ flags │ op: 1 = request, 2 = reply
│ 1 │ 1 │ 1 │ 1 │ │ 2 │ 2 (B bit) │
├────┴──────┴──────┴──────┼──────────────┴──────┴──────────────┤
│ ciaddr (4) client-এর বর্তমান IP │ yiaddr (4) “আপনার” নতুন IP │
├─────────────────────────┼────────────────────────────────────┤
│ siaddr (4) পরের server │ giaddr (4) relay agent-এর IP │
├─────────────────────────┴────────────────────────────────────┤
│ chaddr (16) client-এর MAC + padding │
│ sname (64) + file (128) — BOOTP-এর পুরোনো ঘর, প্রায়ই শূন্য │
├──────────────────────────────────────────────────────────────┤
│ magic cookie 63 82 53 63 │ options: কোড │ দৈর্ঘ্য │ মান … 255 │
└──────────────────────────────────────────────────────────────┘
| Option | নাম | কাজ |
|---|---|---|
| 1 | Subnet Mask | যেমন 255.255.255.0 |
| 3 | Router | Default gateway-এর তালিকা |
| 6 | Domain Name Server | DNS server-এর তালিকা |
| 15 | Domain Name | যেমন office.example |
| 50 | Requested IP Address | Request-এ “আমি এই ঠিকানাটি চাই” |
| 51 | IP Address Lease Time | Lease, সেকেন্ডে |
| 53 | DHCP Message Type | 1 Discover, 2 Offer, 3 Request, 4 Decline, 5 Ack, 6 Nak, 7 Release, 8 Inform |
| 54 | Server Identifier | কোন server উত্তর দিল / কাকে বাছা হলো |
| 55 | Parameter Request List | Client কোন কোন option চায় |
| 58 / 59 | Renewal (T1) / Rebinding (T2) Time | না দিলে client ধরে নেয় lease-এর ৫০% আর ৮৭.৫% |
| 61 | Client Identifier | MAC-এর বদলে অন্য কোনো পরিচয় দিয়ে lease চিনতে |
| 82 | Relay Agent Information | Relay বা switch যোগ করে: কোন port, কোন VLAN থেকে এসেছে |
নম্বরগুলো RFC 2132 আর পরের কয়েকটি RFC অনুযায়ী (option 82 এসেছে RFC 3046 থেকে); পরীক্ষায় সাধারণত 1, 3, 6, 51, 53 আর 54 জিজ্ঞেস হয়। প্রতিটি option-এর পুরো, হালনাগাদ তালিকা IANA-র “BOOTP and DHCP Parameters” রেজিস্ট্রিতে থাকে — কোনো বই বা AI নতুন কোনো নম্বর বললে সেখানে মিলিয়ে নেওয়াই নিরাপদ।
৩ · Lease — ঠিকানা ভাড়া, নবায়ন আর ফেরত
DHCP-র সবচেয়ে চতুর ধারণা হলো lease: ঠিকানা চিরদিনের জন্য দেওয়া হয় না, নির্দিষ্ট সময়ের জন্য ভাড়া দেওয়া হয়। কেন? কারণ যন্ত্র প্রায়ই বিদায় না বলে চলে যায় — ফোনের চার্জ শেষ, ল্যাপটপ বন্ধ করে ব্যাগে। ঠিকানা স্থায়ী হলে কিছুদিনের মধ্যেই pool ফুরিয়ে যেত। Lease-এর মেয়াদ শেষ হলে server নিশ্চিন্তে ঠিকানাটি অন্য কাউকে দিতে পারে।
কিন্তু যে যন্ত্রটি এখনো আছে, তার সংযোগ যেন মাঝপথে না কাটে। তাই client মেয়াদ শেষের অনেক আগেই নবায়ন শুরু করে, দুটি টাইমার ধরে:
T1 = lease-এর ৫০% → RENEWING: client যে server ঠিকানা দিয়েছিল, শুধু তাকেই unicast-এ DHCPREQUEST পাঠায় (উৎস এখন নিজের আসল IP, ciaddr-এ সেই ঠিকানা)। ACK এলে lease নতুন করে শুরু। T2 = lease-এর ৮৭.৫% → REBINDING: নিজের server সাড়া দিচ্ছে না, তাই এবার DHCPREQUEST broadcast — LAN-এর যেকোনো server, যার কাছে এই client-এর তথ্য আছে, নবায়ন করতে পারে। মেয়াদ শেষ: কেউ সাড়া না দিলে client ঠিকানা ব্যবহার বন্ধ করে, আবার INIT থেকে Discover. দুটি টাইমার server option 58/59-এ অন্যভাবেও দিতে পারে; না দিলে এই ডিফল্ট।
একটি হাতে-কলমে হিসাব
একটি ল্যাপটপ সকাল ৯:০০-এ ৮ ঘণ্টার lease পেল (২৮,৮০০ সেকেন্ড)। T1 = ২৮,৮০০ × ০.৫ = ১৪,৪০০ সেকেন্ড = ৪ ঘণ্টা → দুপুর ১:০০-এ প্রথম নবায়নের চেষ্টা। T2 = ২৮,৮০০ × ০.৮৭৫ = ২৫,২০০ সেকেন্ড = ৭ ঘণ্টা → বিকেল ৪:০০-এ rebinding. মেয়াদ শেষ বিকেল ৫:০০-এ। দুপুর ১:০০-এ server সাড়া দিলে নতুন lease শুরু ১:০০ থেকে, আর পরের T1 বিকেল ৫:০০-এ। অর্থাৎ সব ঠিক থাকলে client প্রতি ৪ ঘণ্টায় একবার server-এর সাথে কথা বলে, আর তার ঠিকানা কখনো বদলায় না।
T1 আর T2-এর মাঝে client বারবার চেষ্টা করে। RFC 2131-এর পরামর্শ: প্রতিবার পরের সীমা (T2 বা মেয়াদ শেষ) পর্যন্ত বাকি সময়ের অর্ধেক অপেক্ষা, তবে ৬০ সেকেন্ডের কম নয়। নিচের simulator প্রথমে পুরো DORA ছাপে, তারপর ৩,৬০০ সেকেন্ডের একটি lease-এর সময়রেখা চালায়, যেখানে server ৩,০০০ সেকেন্ডে বন্ধ হয়ে যায়।
// DHCP DORA on one LAN, then the lease timeline (T1 = 50%, T2 = 87.5%).
const CMAC = "02:aa:00:00:00:0a", SIP = "192.168.10.1", SMAC = "02:aa:00:00:00:01";
const BIP = "255.255.255.255", BMAC = "ff:ff:ff:ff:ff:ff", xid = "0x5a1c2e7b";
const lease = 3600, ip = "192.168.10.11";
function msg(type, sIP, sp, dIP, dp, sMAC, dMAC, opts) {
console.log(`${type.padEnd(8)} IP ${sIP}:${sp} -> ${dIP}:${dp} xid=${xid}`);
console.log(` MAC ${sMAC} -> ${dMAC}`);
console.log(` ${opts}`);
}
msg("DISCOVER", "0.0.0.0", 68, BIP, 67, CMAC, BMAC, "opt53=1 opt55=[1,3,6,51] flags=0x8000 (broadcast)");
msg("OFFER", SIP, 67, BIP, 68, SMAC, BMAC, `opt53=2 yiaddr=${ip} opt1=255.255.255.0 opt3=${SIP} opt6=${SIP} opt51=${lease} opt54=${SIP}`);
msg("REQUEST", "0.0.0.0", 68, BIP, 67, CMAC, BMAC, `opt53=3 opt50=${ip} opt54=${SIP}`);
msg("ACK", SIP, 67, BIP, 68, SMAC, BMAC, `opt53=5 yiaddr=${ip} opt51=${lease} opt58=${lease / 2} opt59=${lease * 7 / 8}`);
console.log("\n--- lease timeline (server goes down at t=3000 s) ---");
const up = t => t < 3000;
const log = (t, s) => console.log(String(t).padStart(5) + " s " + s);
let t0 = 0; log(0, `BOUND: ${ip}, lease ${lease} s`);
while (true) {
const T1 = t0 + lease / 2, T2 = t0 + lease * 7 / 8, end = t0 + lease;
let t = T1, renewed = false;
for (const [phase, until, how] of [["RENEWING", T2, "unicast REQUEST to " + SIP],
["REBINDING", end, "broadcast REQUEST to any server"]]) {
for (; t < until; t += Math.max(60, Math.floor((until - t) / 2))) {
if (up(t)) { log(t, `${phase}: ${how} -> ACK, new lease`); renewed = true; break; }
log(t, `${phase}: ${how} -> no reply`);
}
if (renewed) break;
t = until;
}
if (renewed) { t0 = t; continue; }
log(end, `EXPIRED: stop using ${ip}, back to INIT -> new DISCOVER`); break;
}আউটপুট:
DISCOVER IP 0.0.0.0:68 -> 255.255.255.255:67 xid=0x5a1c2e7b
MAC 02:aa:00:00:00:0a -> ff:ff:ff:ff:ff:ff
opt53=1 opt55=[1,3,6,51] flags=0x8000 (broadcast)
OFFER IP 192.168.10.1:67 -> 255.255.255.255:68 xid=0x5a1c2e7b
MAC 02:aa:00:00:00:01 -> ff:ff:ff:ff:ff:ff
opt53=2 yiaddr=192.168.10.11 opt1=255.255.255.0 opt3=192.168.10.1 opt6=192.168.10.1 opt51=3600 opt54=192.168.10.1
REQUEST IP 0.0.0.0:68 -> 255.255.255.255:67 xid=0x5a1c2e7b
MAC 02:aa:00:00:00:0a -> ff:ff:ff:ff:ff:ff
opt53=3 opt50=192.168.10.11 opt54=192.168.10.1
ACK IP 192.168.10.1:67 -> 255.255.255.255:68 xid=0x5a1c2e7b
MAC 02:aa:00:00:00:01 -> ff:ff:ff:ff:ff:ff
opt53=5 yiaddr=192.168.10.11 opt51=3600 opt58=1800 opt59=3150
--- lease timeline (server goes down at t=3000 s) ---
0 s BOUND: 192.168.10.11, lease 3600 s
1800 s RENEWING: unicast REQUEST to 192.168.10.1 -> ACK, new lease
3600 s RENEWING: unicast REQUEST to 192.168.10.1 -> no reply
4275 s RENEWING: unicast REQUEST to 192.168.10.1 -> no reply
4612 s RENEWING: unicast REQUEST to 192.168.10.1 -> no reply
4781 s RENEWING: unicast REQUEST to 192.168.10.1 -> no reply
4865 s RENEWING: unicast REQUEST to 192.168.10.1 -> no reply
4925 s RENEWING: unicast REQUEST to 192.168.10.1 -> no reply
4950 s REBINDING: broadcast REQUEST to any server -> no reply
5175 s REBINDING: broadcast REQUEST to any server -> no reply
5287 s REBINDING: broadcast REQUEST to any server -> no reply
5347 s REBINDING: broadcast REQUEST to any server -> no reply
5400 s EXPIRED: stop using 192.168.10.11, back to INIT -> new DISCOVER
DORA অংশ: চারটি বার্তাতেই xid একই — এটিই চারটিকে একটি কথোপকথনে বাঁধে। Client-এর দুটি বার্তার উৎস 0.0.0.0:68, server-এর দুটির উৎস 192.168.10.1:67; চারটিরই গন্তব্য broadcast, কারণ Discover-এ flags = 0x8000. Option 53-এর মান 1 → 2 → 3 → 5 বার্তার ধরন বলে; ACK-এ option 58 = ১,৮০০ = ৩,৬০০-এর ৫০%, option 59 = ৩,১৫০ = ৩,৬০০ × ৭/৮.
সময়রেখা: ১,৮০০ সেকেন্ডে (প্রথম T1) server চালু ছিল, তাই নবায়ন সফল — নতুন lease শুরু ১,৮০০ থেকে, ফলে নতুন T1 = ৩,৬০০, T2 = ১,৮০০ + ৩,১৫০ = ৪,৯৫০, মেয়াদ শেষ = ৫,৪০০. কিন্তু server ৩,০০০-এ বন্ধ হয়েছে। ৩,৬০০-এ ব্যর্থ, তারপর অপেক্ষা (৪,৯৫০ − ৩,৬০০) ÷ ২ = ৬৭৫ → ৪,২৭৫; তারপর ৩৩৭ → ৪,৬১২; ১৬৯ → ৪,৭৮১; ৮৪ → ৪,৮৬৫; অর্ধেক ৪২ হলেও সর্বনিম্ন ৬০ → ৪,৯২৫. এরপর T2 (৪,৯৫০)-এ broadcast rebinding, একই অর্ধেক-অর্ধেক নিয়মে ৫,১৭৫, ৫,২৮৭, ৫,৩৪৭. কেউ সাড়া দেয়নি, তাই ৫,৪০০-এ ঠিকানা ছাড়তে হলো। Server বন্ধ হওয়ার পরও client প্রায় ৪০ মিনিট নির্বিঘ্নে চলল — lease-ই এই বাফার। নিজে চেষ্টা করুন: up-এ ৩,০০০-এর বদলে ৫,০০০ দিন — rebinding-এর প্রথম চেষ্টাতেই কি নবায়ন হবে?
বাকি চারটি বার্তা — Release, Decline, Nak, Inform
| বার্তা | কে পাঠায় | কখন |
|---|---|---|
| DHCPRELEASE (7) | Client → server, unicast | “আর লাগবে না” — যেমন Windows-এ ipconfig /release. বেশিরভাগ যন্ত্র সাধারণ shutdown-এ release পাঠায় না, lease নিজে ফুরায়। |
| DHCPDECLINE (4) | Client → server | ACK পাওয়ার পর ARP probe-এ দেখা গেল ঠিকানাটি অন্য কেউ ব্যবহার করছে। Server ঠিকানাটিকে কিছুক্ষণ “সমস্যাযুক্ত” চিহ্নিত রাখে। |
| DHCPNAK (6) | Server → client | Client যে ঠিকানা চাইছে তা এই নেটওয়ার্কে চলে না — যেমন বাসার 192.168.0.x নিয়ে অফিসে এসে নবায়ন চাইলে। Client সঙ্গে সঙ্গে ঠিকানা ছেড়ে Discover থেকে শুরু করে। |
| DHCPINFORM (8) | Client → server | Static ঠিকানা আছে, শুধু বাকি তথ্য (যেমন DNS) চাই। |
ল্যাপটপ আবার চালু হলে বা Wi-Fi আবার যুক্ত হলে client সাধারণত পুরো DORA না করে আগের ঠিকানার জন্য সরাসরি broadcast Request পাঠায় (INIT-REBOOT): server রাজি হলে ACK, অন্য নেটওয়ার্কে এলে NAK. এজন্যই বাসার Wi-Fi-তে ফোন প্রায়ই প্রতিদিন একই ঠিকানা পায়।
৪ · অনেক VLAN, একটি server — relay agent, reservation আর APIPA
পর্ব ১৩-এর অফিসে মনে করুন: হিসাব VLAN 10 (192.168.10.0/24), HR VLAN 20 (192.168.20.0/24), সার্ভারগুলো VLAN 99 (192.168.99.0/24). এখন DHCP server একটিই, 192.168.99.10, সার্ভারের VLAN-এ। সমস্যা: VLAN 20-এর একটি ল্যাপটপের Discover একটি broadcast, আর broadcast নিজের VLAN-এর (broadcast domain-এর) বাইরে যায় না; router 255.255.255.255 কখনো অন্য নেটওয়ার্কে পাঠায় না। তাহলে কি প্রতিটি VLAN-এ আলাদা DHCP server লাগবে?
না — সমাধান DHCP relay agent. যে router বা layer-3 switch VLAN 20-এর gateway (পর্ব ১৩-এর SVI বা subinterface), সেটিই relay-র কাজ করে। সে VLAN 20-এর broadcast Discover ধরে, তাতে নিজের সেই VLAN-এর ঠিকানাটি giaddr ঘরে লিখে, server-এর কাছে সাধারণ unicast packet হিসেবে route করে পাঠায়। giaddr দুটি কাজ করে: server বোঝে কোন subnet-এর pool থেকে ঠিকানা দিতে হবে, আর উত্তর কোথায় ফেরত পাঠাতে হবে।
- ল্যাপটপ
VLAN 20ঠিকানা নেই - L3 switch
Vlan20 .1relay agent - DHCP server
192.168.99.10VLAN 99 - L3 switch
→ VLAN 20ফেরত - BOUND
192.168.20.50gw .1
| কোথায় | |
| বার্তা | |
| Src → Dst IP | |
| UDP port | |
| giaddr | |
| hops | |
| ফল |
- Discover আটকে আছে VLAN 20-এ। ল্যাপটপ সাধারণ Discover পাঠাল: 0.0.0.0:68 → 255.255.255.255:67, giaddr 0.0.0.0, hops 0. Switch এটি শুধু VLAN 20-এর port-গুলোতে flood করল — তার মধ্যে আছে layer-3 switch-এর নিজের Vlan20 interface (SVI), কিন্তু কোনো DHCP server নেই।
- Relay: broadcast থেকে unicast. SVI 192.168.20.1-এ relay চালু, server-এর ঠিকানা কনফিগার করা আছে 192.168.99.10. Relay বার্তাটির giaddr-এ লিখল নিজের ঠিকানা 192.168.20.1, hops এক বাড়াল, আর নতুন একটি UDP packet বানাল: 192.168.20.1:67 → 192.168.99.10:67. এটি এখন সাধারণ unicast, তাই অন্য যেকোনো packet-এর মতো route হয়ে VLAN 99-এ গেল। DHCP snooping চালু থাকলে switch এখানে option 82-এ লিখে দিতে পারে কোন port আর কোন VLAN থেকে বার্তাটি এসেছে।
- Server giaddr দেখে pool বাছল। Server-এ কয়েকটি pool (scope): 192.168.10.0/24, 192.168.20.0/24 … giaddr 192.168.20.1 পড়েছে 192.168.20.0/24-এ, তাই সেখান থেকে খালি ঠিকানা .50 নিল, gateway (option 3) দিল 192.168.20.1. Offer-টি পাঠাল সরাসরি relay-কে: 192.168.99.10:67 → 192.168.20.1:67, কারণ giaddr শূন্য নয়।
- Relay ফেরত দিল VLAN 20-এ। Relay Offer পেয়ে giaddr দেখে বুঝল কোন interface-এ পাঠাতে হবে — Vlan20. Client-এর broadcast flag চালু ছিল বলে পাঠাল broadcast-এ: 192.168.20.1:67 → 255.255.255.255:68 (flag বন্ধ থাকলে yiaddr আর chaddr-এ unicast). ল্যাপটপের কাছে মনে হলো উত্তরটি এসেছে তার নিজের LAN থেকেই।
- Request আর Ack একই পথে। ল্যাপটপের broadcast Request আবার relay হয়ে server-এ, ACK আবার relay হয়ে ল্যাপটপে। ফল: 192.168.20.50/24, gateway 192.168.20.1. পুরো প্রতিষ্ঠানের জন্য একটিমাত্র DHCP server (বাস্তবে বিভ্রাট এড়াতে সাধারণত দুটি) — শুধু প্রতিটি VLAN-এর gateway-এ relay চালু রাখতে হয়।
interface Vlan20
ip address 192.168.20.1 255.255.255.0
ip helper-address 192.168.99.10 ! এই VLAN-এর DHCP broadcast এই server-এ যাবে
!
interface Vlan10
ip address 192.168.10.1 255.255.255.0
ip helper-address 192.168.99.10এটি একটি উদাহরণ, চালানোর কোড নয়। Cisco-তে ip helper-address ডিফল্টে DHCP ছাড়াও আরও কয়েকটি UDP broadcast সেবা forward করে (তালিকা মডেলভেদে আলাদা); অন্য vendor আর Linux-এ নাম ভিন্ন, ধারণা একই। Relay না থাকলে সাধারণ লক্ষণ: একটি নির্দিষ্ট VLAN-এর সবাই 169.254.x.x পাচ্ছে, অন্য VLAN ঠিক আছে।
Reservation — DHCP দিয়েই স্থির ঠিকানা
অফিসের প্রিন্টারের ঠিকানা প্রতি সপ্তাহে বদলালে সবার কম্পিউটারে প্রিন্টার “অফলাইন” দেখাবে। আবার প্রিন্টারে হাতে ঠিকানা বসালে কেউ ভুলে সেই ঠিকানা DHCP pool-এও রেখে দিতে পারে। Reservation দুই দিকের সুবিধা দেয়: server-এ লেখা থাকে “MAC 02:aa:00:00:00:50 সবসময় 192.168.10.50 পাবে”. প্রিন্টার সাধারণ DORA-ই করে, কিন্তু সবসময় এই ঠিকানাটিই পায়; বাসার router-এর পাতায় এর নাম প্রায়ই “Address Reservation”. একটি সাবধানতা: আধুনিক ফোন প্রতিটি Wi-Fi-তে আলাদা এলোমেলো MAC ব্যবহার করতে পারে (MAC randomization, পর্ব ১২), তাই ফোনের জন্য reservation সবসময় কাজ করে না।
কেউ সাড়া না দিলে — APIPA আর 169.254.x.x
DHCP server বন্ধ, তার ঢিলা, বা relay ভুল — client বারবার Discover পাঠিয়েও কোনো Offer পেল না। তখন কী? Windows, macOS আর অনেক প্রিন্টার নিজে নিজে একটি link-local ঠিকানা বেছে নেয় 169.254.0.0/16 থেকে (RFC 3927; প্রথম আর শেষ /24 সংরক্ষিত, তাই আসলে 169.254.1.0 থেকে 169.254.254.255). Microsoft এর নাম দিয়েছে APIPA (Automatic Private IP Addressing). যন্ত্রটি এলোমেলো একটি ঠিকানা বাছে, ARP probe দিয়ে দেখে কেউ সেটি ব্যবহার করছে কি না, তারপর নেয়। এতে একই তারের দুটি যন্ত্র router ছাড়াই কথা বলতে পারে, কিন্তু gateway নেই, তাই ইন্টারনেট নেই; আর পটভূমিতে DHCP-র চেষ্টা চলতেই থাকে। Linux-এ এই আচরণ বিতরণভেদে আলাদা — অনেক ব্যবস্থায় ডিফল্টে চালু থাকে না।
সমস্যা খোঁজার সূত্র: কোনো কম্পিউটারে 169.254.x.x ঠিকানা দেখলে প্রায় নিশ্চিত বলা যায় — DHCP থেকে কোনো উত্তর আসেনি। এটি নিজে কোনো ত্রুটি নয়, ত্রুটির লক্ষণ। দেখার জায়গা: তার/Wi-Fi সংযোগ, switch port-এর VLAN, gateway-এ relay, DHCP server চালু কি না, আর pool খালি আছে কি না।
নিজের যন্ত্রে DHCP দেখা
নিচের কমান্ডগুলো একটি সাধারণ ল্যাপটপের, এই পাতায় চলবে না। Windows-এ ipconfig /all দেখায় “DHCP Enabled”, “DHCP Server”, “Lease Obtained” আর “Lease Expires”; /release আর /renew দিয়ে নিজে Release আর নতুন DORA করানো যায়:
PS> ipconfig /all # DHCP Server, Lease Obtained, Lease Expires
PS> ipconfig /release # DHCPRELEASE পাঠায়, ঠিকানা ছেড়ে দেয়
PS> ipconfig /renew # নতুন করে ঠিকানা চায়
PS> Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress, PrefixOriginLinux-এ DHCP client বিতরণভেদে আলাদা (NetworkManager, systemd-networkd, dhcpcd, পুরোনো dhclient). পর্ব ৬-এ দেখেছেন, ip addr-এর dynamic আর valid_lft বলে ঠিকানাটি DHCP-র আর lease-এর কত সেকেন্ড বাকি; ip route-এর proto dhcp বলে gateway-ও DHCP দিয়েছে।
৫ · ARP — IP জানা, MAC অজানা
এবার দ্বিতীয় প্রশ্ন। ল্যাপটপটি এখন BOUND — এখন থেকে এর নাম PC-A: 192.168.10.11, MAC 02:aa:00:00:00:0a. একই LAN-এ আছে PC-B (192.168.10.12, MAC …:0b) আর router R1 (192.168.10.1, MAC …:01). PC-A এখন PC-B-র একটি ফাইল শেয়ারে packet পাঠাতে চায়। IP header লেখা সহজ, কিন্তু Ethernet বা Wi-Fi-তে frame পাঠাতে গন্তব্য MAC লাগবে। IP ঠিকানা আর MAC-এর মধ্যে কোনো গাণিতিক সম্পর্ক নেই — MAC নির্মাতা কারখানায় বসায় (পর্ব ১২), IP দেয় নেটওয়ার্ক। তাই জিজ্ঞেস করে জানতেই হবে। এই জিজ্ঞাসার নিয়মই ARP (Address Resolution Protocol, RFC 826).
- ARP request — broadcast: “192.168.10.12 কার? 192.168.10.11-কে (MAC …:0a) জানান।” Frame-এর গন্তব্য ff:ff:ff:ff:ff:ff, তাই LAN-এর (VLAN-এর) সবাই শোনে।
- ARP reply — unicast: যার ঠিকানা 192.168.10.12, শুধু সে উত্তর দেয়, সরাসরি প্রশ্নকারীর MAC-এ: “192.168.10.12 আমার, আমার MAC …:0b.” বাকিরা request দেখে চুপচাপ ফেলে দেয়।
- দুই দিকেই শেখা: request-এর ভেতরেই প্রশ্নকারীর IP আর MAC থাকে, তাই উত্তরদাতাও তাকে cache-এ লিখে রাখে; অন্যরা (RFC 826 অনুযায়ী) শুধু আগে থেকে থাকা entry হালনাগাদ করে।
ARP packet-এর প্রতিটি ঘর
ARP নকশা করা হয়েছিল সাধারণভাবে — যেকোনো hardware ঠিকানা আর যেকোনো protocol ঠিকানার জন্য। তাই packet-এর শুরুতেই বলা থাকে কোন ধরনের ঠিকানা আর তাদের দৈর্ঘ্য কত। Ethernet আর IPv4-এর জন্য পুরো packet ২৮ byte:
ARP packet (Ethernet frame-এর payload, EtherType 0x0806) (bytes)
┌─────────────────────────┬─────────────────────────┐
│ htype = 1 (Ethernet) 2 │ ptype = 0x0800 (IPv4) 2 │
├────────────┬────────────┼─────────────────────────┤
│ hlen = 6 1│ plen = 4 1│ oper: 1 request, 2 reply 2│
├────────────┴────────────┴─────────────────────────┤
│ sender hardware address (SHA) 6 │
│ sender protocol address (SPA) 4 │
│ target hardware address (THA) 6 │ request-এ শূন্য
│ target protocol address (TPA) 4 │
└───────────────────────────────────────────────────┘
মোট 28 byte; Ethernet-এর ন্যূনতম payload 46 byte, তাই বাকিটা padding
নিচের simulator একটি ARP request আর একটি DHCP Discover-কে byte ধরে বানায়, প্রতিটি ঘরের offset আর hex মান ছাপে। Wireshark-এর নিচের hex প্যানেলে ঠিক এই byte-গুলোই দেখবেন।
// Build an ARP request and a DHCP DISCOVER as bytes; print offset, field and hex.
const mac = s => s.split(":").map(h => parseInt(h, 16));
const ip4 = s => s.split(".").map(Number);
const u16 = n => [n >> 8, n & 255];
const u32 = n => [n >>> 24, (n >>> 16) & 255, (n >>> 8) & 255, n & 255];
const hex = a => a.length > 16 ? `00 x ${a.length}` : a.map(b => b.toString(16).padStart(2, "0")).join(" ");
function dump(title, fields) {
console.log(title);
let off = 0;
for (const [name, bytes] of fields) {
console.log(` ${String(off).padStart(3)} ${name.padEnd(22)} ${hex(bytes)}`);
off += bytes.length;
}
console.log(` total: ${off} bytes`);
}
const A = "02:aa:00:00:00:0a";
dump("ARP request (Ethernet payload, EtherType 0x0806)", [
["htype (1=Ethernet)", u16(1)], ["ptype (IPv4)", u16(0x0800)], ["hlen, plen", [6, 4]],
["oper (1=request)", u16(1)], ["sender MAC", mac(A)], ["sender IP", ip4("192.168.10.11")],
["target MAC (unknown)", mac("00:00:00:00:00:00")], ["target IP", ip4("192.168.10.1")],
]);
dump("\nDHCP DISCOVER (UDP payload, port 68 -> 67)", [
["op (1=BOOTREQUEST)", [1]], ["htype, hlen, hops", [1, 6, 0]], ["xid", u32(0x5a1c2e7b)],
["secs", u16(0)], ["flags (broadcast)", u16(0x8000)], ["ciaddr", ip4("0.0.0.0")],
["yiaddr", ip4("0.0.0.0")], ["siaddr", ip4("0.0.0.0")], ["giaddr", ip4("0.0.0.0")],
["chaddr (16 bytes)", [...mac(A), ...Array(10).fill(0)]], ["sname + file", Array(192).fill(0)],
["magic cookie", [0x63, 0x82, 0x53, 0x63]], ["opt 53 (DISCOVER)", [53, 1, 1]],
["opt 55 (want 1,3,6,51)", [55, 4, 1, 3, 6, 51]], ["opt 255 (end)", [255]],
]);আউটপুট (এখানে ARP request-টি PC-A-র, gateway R1-এর খোঁজে):
ARP request (Ethernet payload, EtherType 0x0806)
0 htype (1=Ethernet) 00 01
2 ptype (IPv4) 08 00
4 hlen, plen 06 04
6 oper (1=request) 00 01
8 sender MAC 02 aa 00 00 00 0a
14 sender IP c0 a8 0a 0b
18 target MAC (unknown) 00 00 00 00 00 00
24 target IP c0 a8 0a 01
total: 28 bytes
DHCP DISCOVER (UDP payload, port 68 -> 67)
0 op (1=BOOTREQUEST) 01
1 htype, hlen, hops 01 06 00
4 xid 5a 1c 2e 7b
8 secs 00 00
10 flags (broadcast) 80 00
12 ciaddr 00 00 00 00
16 yiaddr 00 00 00 00
20 siaddr 00 00 00 00
24 giaddr 00 00 00 00
28 chaddr (16 bytes) 02 aa 00 00 00 0a 00 00 00 00 00 00 00 00 00 00
44 sname + file 00 x 192
236 magic cookie 63 82 53 63
240 opt 53 (DISCOVER) 35 01 01
243 opt 55 (want 1,3,6,51) 37 04 01 03 06 33
249 opt 255 (end) ff
total: 250 bytes
ARP: ১৯২.১৬৮.১০.১১ hex-এ c0 a8 0a 0b (১৯২ = 0xc0, ১৬৮ = 0xa8, ১০ = 0x0a, ১১ = 0x0b). সব সংখ্যা network byte order-এ — বড় অংশ আগে — তাই htype 1 লেখা হয় 00 01. Request-এ target MAC শূন্য, কারণ ঠিক সেটাই অজানা। Reply-তে oper হতো 00 02, আর sender-target জায়গা বদলাত। মোট ২৮ byte, কিন্তু Ethernet-এর ন্যূনতম payload ৪৬ byte, তাই তারে frame-এ আরও ১৮ byte শূন্য padding যোগ হয়।
DHCP: option 53-এর কোড ৫৩ = 0x35, দৈর্ঘ্য ১, মান ১ (Discover); option 55-এর কোড ৫৫ = 0x37, আর ৫১ = 0x33. স্থির অংশ ২৩৬ byte-এর মধ্যে ১৯২ byte শুধু BOOTP-এর পুরোনো sname আর file ঘর — আজ প্রায় সবসময় শূন্য, তবু প্রতিটি বার্তায় থাকে, কারণ কাঠামো বদলালে পুরোনো relay আর server ভেঙে যেত। মোট ২৫০ byte; বাস্তবে অনেক client BOOTP-যুগের পুরোনো relay-এর সাথে সামঞ্জস্যের জন্য বার্তাটি অন্তত ৩০০ byte পর্যন্ত padding দিয়ে বাড়িয়ে পাঠায়। নিজে চেষ্টা করুন: ARP-এর oper 2 আর target MAC 02:aa:00:00:00:01 করে একটি reply বানান।
৬ · অন্য subnet-এ পাঠানো — ARP হয় gateway-র জন্য
এটি নেটওয়ার্কিংয়ের সবচেয়ে প্রচলিত ইন্টারভিউ প্রশ্নগুলোর একটি: “আপনার PC 192.168.10.11/24, gateway 192.168.10.1. আপনি 203.0.113.80-এর একটি ওয়েব সার্ভার খুললেন। PC কার MAC-এর জন্য ARP করবে?” অনেকে বলেন “ওয়েব সার্ভারের” — ভুল। ARP-এর request broadcast, আর broadcast router পার হয় না; ওয়েব সার্ভার হাজার কিলোমিটার দূরে, সে এই প্রশ্ন কখনো শুনবেই না। সঠিক উত্তর: PC ARP করে default gateway 192.168.10.1-এর MAC-এর জন্য। Frame-এর গন্তব্য MAC হয় router-এর, কিন্তু ভেতরের IP packet-এর গন্তব্য থাকে 203.0.113.80.
রাজশাহী থেকে চট্টগ্রামে কুরিয়ারে একটি পার্সেল পাঠাবেন। আপনি কি চট্টগ্রামের প্রাপকের বাড়ি খুঁজতে বের হন? না — পাড়ার কুরিয়ার অফিসটি কোথায়, শুধু সেটুকু জানলেই চলে। পার্সেলের গায়ে লেখা থাকে চট্টগ্রামের ঠিকানা (IP), কিন্তু আপনি হাতে তুলে দেন পাড়ার অফিসের কাউন্টারে (gateway-র MAC). পরের প্রতিটি হাব আবার নিজের পরের হাবের কাউন্টার খোঁজে। গন্তব্যের ঠিকানা পুরো পথে একই থাকে, “কার হাতে দিলাম” বদলায় প্রতিটি ধাপে।
সিদ্ধান্তটি host নেয় একটি সরল হিসাবে: নিজের ঠিকানা আর গন্তব্য — দুটোকেই নিজের subnet mask দিয়ে bit-ধরে AND করে। ফল মিললে গন্তব্য একই subnet-এ (সরাসরি পাঠানো), না মিললে বাইরে (gateway-র কাছে)। বাস্তবে Linux এই কাজটি করে routing table দেখে (পর্ব ২২-এর longest prefix match), কিন্তু একটি সাধারণ host-এর জন্য ফল একই:
নিজের ঠিকানা 192.168.10.11 AND 255.255.255.0 = 192.168.10.0
গন্তব্য ১ 192.168.10.12 AND 255.255.255.0 = 192.168.10.0 → মিলেছে: ARP করুন 192.168.10.12-এর জন্য
গন্তব্য ২ 203.0.113.80 AND 255.255.255.0 = 203.0.113.0 → মেলেনি: ARP করুন gateway 192.168.10.1-এর জন্য
- PC-A
.11/24গন্তব্য দূরে - AND
≠ 192.168.10.0বাইরে - Route
via .1next hop - ARP request
who has .1?broadcast - R1 reply
is-at …:01unicast - Frame
MAC R1, IP .80পাঠানো হলো - R1 → বাইরে
TTL 63নতুন frame
| কাজ | |
| ফল | |
| PC-A-র ARP cache | |
| Frame: Dst │ Src MAC | |
| IP: Src → Dst, TTL |
- গন্তব্য ঠিক হলো। DNS আগেই নামটিকে 203.0.113.80-এ রূপ দিয়েছে (পর্ব ৩৫)। ব্রাউজার kernel-কে বলল HTTPS-এর port 443-এ সংযোগ খুলতে। এখন kernel-এর প্রশ্ন: এই packet-এর পরের hop কে?
- Mask দিয়ে AND. 192.168.10.11 আর 203.0.113.80 — দুটোকেই 255.255.255.0 দিয়ে AND: 192.168.10.0 বনাম 203.0.113.0. মেলেনি, তাই গন্তব্য নিজের subnet-এর বাইরে। সরাসরি পাঠানো যাবে না।
- Routing table: default route. কোনো নির্দিষ্ট route নেই, তাই
default via 192.168.10.1— DHCP-র option 3 থেকে আসা সেই gateway. Next hop = 192.168.10.1. এই মুহূর্ত থেকে ARP-এর প্রশ্ন ওয়েব সার্ভার নিয়ে নয়, gateway নিয়ে। - Cache-এ নেই → ARP request. PC-A-র cache-এ 192.168.10.1 নেই। Kernel packet-টি একটু অপেক্ষায় রাখল (entry-র অবস্থা INCOMPLETE) আর broadcast করল: “who has 192.168.10.1? tell 192.168.10.11”. Switch এটি VLAN-এর সব port-এ দিল; PC-B-ও শুনল, কিন্তু প্রশ্নটি তার নয়।
- R1-এর unicast উত্তর। R1 দেখল target IP তার নিজের, তাই সরাসরি PC-A-র MAC-এ উত্তর দিল: “192.168.10.1 is-at 02:aa:00:00:00:01”. সাথে R1 নিজেও PC-A-র IP-MAC লিখে রাখল — উত্তরের packet ফেরত দিতে লাগবে। PC-A-র entry এখন REACHABLE.
- Frame পাঠানো। অপেক্ষার packet বেরোল: frame-এর গন্তব্য MAC = R1, উৎস = PC-A; ভেতরে IP-র উৎস 192.168.10.11, গন্তব্য 203.0.113.80, TTL 64. খামের ওপর পাড়ার কুরিয়ার অফিস, ভেতরের চিঠিতে আসল প্রাপক।
- R1-এর পালা। R1 frame খুলে IP packet বের করল, TTL ১ কমিয়ে ৬৩ করল, নিজের routing table থেকে পরের hop ঠিক করল, আর ISP-র দিকের link-এর জন্য নতুন frame বানাল — দরকার হলে সেখানেও ARP (বা সেই link-এর নিজের নিয়ম)। বাসার router এখানে NAT-ও করে, উৎস ঠিকানা বদলে নিজের public ঠিকানা বসায় (পর্ব ১৯)। প্রতিটি hop-এ MAC বদলায়, IP-র গন্তব্য থাকে একই।
একটি ভুল mask কী করে: PC-A-তে mask ভুলে /8 দিলে অন্য VLAN-এর 192.168.20.12-কেও সে পাশের বাড়ি ভাবে আর সরাসরি ARP করে — উত্তর আসে না, অথচ ইন্টারনেট চলে। “কিছু ঠিকানায় যায়, কিছুতে যায় না” লক্ষণে প্রথমে mask দেখুন।
ARP cache — মনে রাখা, আর সময়মতো ভুলে যাওয়া
প্রতিটি packet-এর আগে ARP করলে LAN broadcast-এ ভরে যেত। তাই উত্তর জমা থাকে ARP cache-এ (Linux-এ নাম neighbour table). কিন্তু চিরদিন নয় — PC-B-র network card বদলালে, বা অন্য একটি যন্ত্র একই ঠিকানা পেলে, পুরোনো MAC-এ পাঠানো frame হারিয়ে যাবে। তাই entry-র একটি মেয়াদ থাকে, যা OS-ভেদে অনেক আলাদা:
| সিস্টেম | সাধারণ ডিফল্ট আচরণ |
|---|---|
| Linux | নিশ্চিত হওয়ার পর entry REACHABLE থাকে মোটামুটি ১৫–৪৫ সেকেন্ড (ভিত্তি base_reachable_time ৩০ সেকেন্ড), তারপর STALE; STALE entry ব্যবহার চলে, কিন্তু পরের packet-এর সময় kernel আবার যাচাই করে (DELAY → PROBE). অনেকক্ষণ অব্যবহৃত entry মুছে যায়। |
| Windows (Vista থেকে) | একই ধরনের নকশা — reachable time সাধারণত ১৫–৪৫ সেকেন্ডের মধ্যে এলোমেলো; Get-NetNeighbor-এ Reachable, Stale ইত্যাদি অবস্থা দেখা যায়। |
| Cisco IOS router | ডিফল্ট ARP timeout অনেক বড় — ৪ ঘণ্টা; interface-এ arp timeout দিয়ে বদলানো যায়। |
সংখ্যাগুলো ডিফল্ট আর সংস্করণভেদে বদলাতে পারে — নিজের যন্ত্রে দেখে নিন। নিচের simulator ছোট একটি LAN চালায়: PC-A প্রথমে PC-B-কে পাঠায়, তারপর ইন্টারনেটের সার্ভারে, তারপর অনেক পরে আবার PC-B-কে। সরল রাখতে প্রতিটি entry শেখার ৬০ সেকেন্ড পরে মেয়াদোত্তীর্ণ ধরা হয়েছে।
// One LAN 192.168.10.0/24 with router R1 (.1). Simplified: entries expire 60 s after learning.
const H = [["PC-A", "192.168.10.11", "0a"], ["PC-B", "192.168.10.12", "0b"], ["R1", "192.168.10.1", "01"]]
.map(([name, ip, m]) => ({ name, ip, mac: "02:aa:00:00:00:" + m, cache: {} }));
const AGE = 60, GW = "192.168.10.1", onLink = ip => ip.startsWith("192.168.10.");
function arp(me, ip, t) {
const e = me.cache[ip];
if (e && t - e.t < AGE) { console.log(` cache hit: ${ip} -> ${e.mac}`); return; }
if (e) { console.log(` entry for ${ip} is ${t - e.t} s old -> expired`); delete me.cache[ip]; }
console.log(` ARP request ${me.mac} -> ff:ff:ff:ff:ff:ff who has ${ip}? tell ${me.ip}`);
const owner = H.find(h => h.ip === ip);
owner.cache[me.ip] = { mac: me.mac, t }; // the target learns the asker
console.log(` ARP reply ${owner.mac} -> ${me.mac} ${ip} is-at ${owner.mac}`);
me.cache[ip] = { mac: owner.mac, t };
}
function send(name, dst, t) {
const me = H.find(h => h.name === name), hop = onLink(dst) ? dst : GW;
console.log(`t=${t}s ${name} -> ${dst}: ` +
(hop === dst ? "same subnet, ARP for the host itself" : `other subnet, ARP for gateway ${GW}`));
arp(me, hop, t);
console.log(` frame: dst MAC ${me.cache[hop].mac}, dst IP ${dst}`);
}
function show(t) {
for (const h of H) console.log(` [${h.name}] ` + (Object.entries(h.cache)
.map(([ip, e]) => `${ip} ${e.mac} age ${t - e.t}s`).join("; ") || "empty"));
}
send("PC-A", "192.168.10.12", 0);
send("PC-A", "192.168.10.12", 5);
send("PC-A", "203.0.113.80", 10);
console.log("caches at t=10s:"); show(10);
send("PC-A", "203.0.113.80", 40);
send("PC-A", "192.168.10.12", 75);
console.log("caches at t=75s:"); show(75);আউটপুট:
t=0s PC-A -> 192.168.10.12: same subnet, ARP for the host itself
ARP request 02:aa:00:00:00:0a -> ff:ff:ff:ff:ff:ff who has 192.168.10.12? tell 192.168.10.11
ARP reply 02:aa:00:00:00:0b -> 02:aa:00:00:00:0a 192.168.10.12 is-at 02:aa:00:00:00:0b
frame: dst MAC 02:aa:00:00:00:0b, dst IP 192.168.10.12
t=5s PC-A -> 192.168.10.12: same subnet, ARP for the host itself
cache hit: 192.168.10.12 -> 02:aa:00:00:00:0b
frame: dst MAC 02:aa:00:00:00:0b, dst IP 192.168.10.12
t=10s PC-A -> 203.0.113.80: other subnet, ARP for gateway 192.168.10.1
ARP request 02:aa:00:00:00:0a -> ff:ff:ff:ff:ff:ff who has 192.168.10.1? tell 192.168.10.11
ARP reply 02:aa:00:00:00:01 -> 02:aa:00:00:00:0a 192.168.10.1 is-at 02:aa:00:00:00:01
frame: dst MAC 02:aa:00:00:00:01, dst IP 203.0.113.80
caches at t=10s:
[PC-A] 192.168.10.12 02:aa:00:00:00:0b age 10s; 192.168.10.1 02:aa:00:00:00:01 age 0s
[PC-B] 192.168.10.11 02:aa:00:00:00:0a age 10s
[R1] 192.168.10.11 02:aa:00:00:00:0a age 0s
t=40s PC-A -> 203.0.113.80: other subnet, ARP for gateway 192.168.10.1
cache hit: 192.168.10.1 -> 02:aa:00:00:00:01
frame: dst MAC 02:aa:00:00:00:01, dst IP 203.0.113.80
t=75s PC-A -> 192.168.10.12: same subnet, ARP for the host itself
entry for 192.168.10.12 is 75 s old -> expired
ARP request 02:aa:00:00:00:0a -> ff:ff:ff:ff:ff:ff who has 192.168.10.12? tell 192.168.10.11
ARP reply 02:aa:00:00:00:0b -> 02:aa:00:00:00:0a 192.168.10.12 is-at 02:aa:00:00:00:0b
frame: dst MAC 02:aa:00:00:00:0b, dst IP 192.168.10.12
caches at t=75s:
[PC-A] 192.168.10.1 02:aa:00:00:00:01 age 65s; 192.168.10.12 02:aa:00:00:00:0b age 0s
[PC-B] 192.168.10.11 02:aa:00:00:00:0a age 0s
[R1] 192.168.10.11 02:aa:00:00:00:0a age 65s
t = ০: PC-B একই subnet-এ, তাই ARP সরাসরি তার জন্য — request broadcast, reply unicast (…:0b -> …:0a). t = ৫: cache hit, কোনো ARP নেই। t = ১০: 203.0.113.80 বাইরে, তাই ARP হলো gateway 192.168.10.1-এর জন্য; frame-এর গন্তব্য MAC R1-এর (…:01), অথচ গন্তব্য IP ওয়েব সার্ভারের — ঠিক stepper-এর ছবি। ১০ সেকেন্ডের cache-এ দেখুন: PC-B আর R1 দুজনেই PC-A-কে শিখে ফেলেছে, কারণ প্রশ্নকারীর তথ্য request-এর ভেতরেই ছিল; কিন্তু R1 PC-B-কে চেনে না — PC-B কখনো R1-কে কিছু জিজ্ঞেস করেনি। t = ৪০: gateway-এর entry ৩০ সেকেন্ডের, তাই hit — ইন্টারনেটের প্রতিটি packet আর ARP চায় না। t = ৭৫: PC-B-র entry ৭৫ সেকেন্ডের, ৬০-এর বেশি, তাই মুছে আবার ARP.
শেষের cache-এ একটি সূক্ষ্ম জিনিস: PC-A-র gateway entry আর R1-এর entry ৬৫ সেকেন্ডের — মেয়াদ পেরিয়েছে, তবু টেবিলে আছে। এই simulator মেয়াদ দেখে শুধু ব্যবহারের মুহূর্তে। Linux-ও অনেকটা এভাবে চলে: মেয়াদ পেরোনো entry মুছে না দিয়ে STALE চিহ্ন দেয়, আর পরের ব্যবহারে যাচাই করে। নিজে চেষ্টা করুন: AGE ১০০ করলে t = ৭৫-এ কী ছাপা হবে, আগে অনুমান করুন।
এই container-এর neighbour table
এবার এই পাতার কোড যে container-এ চলে, তার আসল Linux kernel-এর ARP টেবিল। ip neigh আর /proc/net/arp একই টেবিলের দুটি জানালা (পর্ব ৬)। এখান থেকে বাইরে কিছু পাঠানো হচ্ছে না, তাই টেবিল খালি থাকতেই পারে — খালি মানে “এখনো কারও MAC জানার দরকার হয়নি”.
echo "== 1. neighbour (ARP) table: ip neigh =="
if command -v ip >/dev/null; then
out=$(ip neigh show 2>/dev/null)
if [ -n "$out" ]; then echo "$out"; else echo "(empty - no neighbour entries yet)"; fi
else
echo "ip: not installed"
fi
echo "== 2. the same table from /proc/net/arp =="
cat /proc/net/arp
echo "rows after the header: $(tail -n +2 /proc/net/arp | wc -l)"
echo "== 3. routes: ip route =="
if command -v ip >/dev/null; then ip route show; else echo "ip: not installed"; fi
echo "== 4. default gateway decoded from /proc/net/route =="
while read -r ifc dst gw flags _; do
[ "$dst" = "00000000" ] || continue
printf 'default via %d.%d.%d.%d dev %s flags=%s\n' \
"0x${gw:6:2}" "0x${gw:4:2}" "0x${gw:2:2}" "0x${gw:0:2}" "$ifc" "$flags"
done < <(tail -n +2 /proc/net/route)
echo "== 5. neighbour timers (Linux defaults can be tuned) =="
d=/proc/sys/net/ipv4/neigh/default
for f in base_reachable_time_ms gc_stale_time delay_first_probe_time; do
[ -r "$d/$f" ] && echo "$f = $(cat "$d/$f")" || echo "$f: not readable"
doneআসল রানের আউটপুট:
== 1. neighbour (ARP) table: ip neigh ==
fe80::2 dev tap0 lladdr 52:56:00:00:00:02 router STALE
== 2. the same table from /proc/net/arp ==
IP address HW type Flags HW address Mask Device
rows after the header: 0
== 3. routes: ip route ==
default via 10.0.2.2 dev tap0
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.100
== 4. default gateway decoded from /proc/net/route ==
default via 10.0.2.2 dev tap0 flags=0003
== 5. neighbour timers (Linux defaults can be tuned) ==
base_reachable_time_ms: not readable
gc_stale_time: not readable
delay_first_probe_time: not readable
১–২: IPv4-এর ARP টেবিল একেবারে খালি — /proc/net/arp-এ শুধু শিরোনাম, সারি ০টি; container-টি এখনো কোনো IPv4 প্রতিবেশীর MAC খোঁজেনি। ip neigh-এ একটিমাত্র entry, আর সেটি IPv6-এর: fe80::2, একটি link-local router, অবস্থা STALE — kernel সম্ভবত IPv6-এর NDP বার্তা (পর্ব ২১) থেকেই router-টিকে চিনেছে। লক্ষ করুন, /proc/net/arp শুধু IPv4 দেখায়, ip neigh দুটোই। ৩–৪: gateway 10.0.2.2, নিজের ঠিকানা 10.0.2.100/24 — rootless container-এর কাল্পনিক LAN (পর্ব ৬)। এই container প্রথম IPv4 packet বাইরে পাঠালে ARP হতো 10.0.2.2-এর জন্য, কোনো দূরের সার্ভারের জন্য নয়। ৫: এই container-এ /proc/sys-এর neighbour ফাইলগুলো পড়া যায়নি, তাই guard-টি সৎভাবে “not readable” লিখেছে; সাধারণ Linux মেশিনে base_reachable_time_ms সাধারণত 30000.
একটি সাধারণ বাসার ল্যাপটপে একই কমান্ডের ফল দেখতে এমন (উদাহরণ, ঠিকানাগুলো এই পর্বের অফিসের মতো করে):
$ ip neigh
192.168.10.1 dev wlp2s0 lladdr 02:aa:00:00:00:01 REACHABLE
192.168.10.12 dev wlp2s0 lladdr 02:aa:00:00:00:0b STALE
192.168.10.30 dev wlp2s0 FAILED
$ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.10.1 0x1 0x2 02:aa:00:00:00:01 * wlp2s0
192.168.10.12 0x1 0x2 02:aa:00:00:00:0b * wlp2s0
192.168.10.30 0x1 0x0 00:00:00:00:00:00 * wlp2s0REACHABLE = সম্প্রতি নিশ্চিত, STALE = পুরোনো কিন্তু ব্যবহারযোগ্য, FAILED = কোনো উত্তর আসেনি (কেউ নেই, বা অন্য VLAN-এ)। /proc/net/arp-এ Flags 0x2 = সম্পূর্ণ, 0x0 = অসম্পূর্ণ। Windows-এ arp -a বা Get-NetNeighbor.
৭ · ARP-এর বিশেষ রূপ — probe, gratuitous আর proxy ARP
ARP probe — “এই ঠিকানা কি কারও?”
DORA-র শেষ ধাপে দেখেছেন, নতুন ঠিকানা ব্যবহারের আগে client একবার যাচাই করে। এর নিয়ম RFC 5227-এ: ARP probe একটি সাধারণ ARP request, কিন্তু sender IP 0.0.0.0 — কারণ ঠিকানাটি এখনো নিজের নয়, অন্যদের cache-এ ভুল তথ্য ঢোকানো চলবে না। Target IP = যে ঠিকানাটি নিতে চাই। কেউ উত্তর দিলে ঠিকানাটি ব্যস্ত (DHCP হলে DHCPDECLINE). APIPA-ও ঠিক এভাবেই এলোমেলো 169.254 ঠিকানা যাচাই করে।
Gratuitous ARP — না চাইতেই ঘোষণা
Gratuitous ARP হলো এমন ARP বার্তা যা কেউ জিজ্ঞেস করেনি: একটি যন্ত্র নিজের IP-র জন্যই ARP পাঠায় (sender IP = target IP = নিজের ঠিকানা), সাধারণত broadcast-এ। এর তিনটি কাজ:
- ঘোষণা (ARP announcement): “এখন থেকে 192.168.10.11 আমি, MAC …:0a.” যাদের cache-এ এই IP-র পুরোনো MAC আছে, তারা হালনাগাদ করে নেয় — যেমন network card বদলানোর পরে।
- Duplicate ঠিকানা ধরা: ঘোষণার পর অন্য কেউ যদি একই IP দাবি করে উত্তর দেয়, তাহলে দুজনের ঠিকানা এক — Windows তখন “IP address conflict” সতর্কবার্তা দেখায়।
- Failover: দুটি router মিলে একটি “virtual gateway” ঠিকানা 192.168.10.1 রাখে (VRRP, Cisco-র HSRP-এর মতো protocol). মূল router বন্ধ হলে backup সেই ঠিকানা নিয়ে gratuitous ARP পাঠায়, আর switch ও host-রা কয়েক মুহূর্তে নতুন MAC শিখে নেয় — সংযোগ প্রায় কাটে না।
Proxy ARP — অন্যের হয়ে উত্তর
Proxy ARP-এ (RFC 1027, ১৯৮৭) একটি router অন্য নেটওয়ার্কের কোনো ঠিকানার জন্য আসা ARP request-এর উত্তর দেয় নিজের MAC দিয়ে — “এটি আমাকে দিন, আমি পৌঁছে দেব।” এর ইতিহাস ভাবনার প্রশ্ন ৫-এ। এটি ভুল mask-এর মতো কনফিগারেশন-ভুল লুকিয়ে রাখে, তাই অনেক প্রশাসক এটি বন্ধ রাখেন; কিছু vendor-এর ডিফল্টে এটি চালু থাকে — নিজের যন্ত্রে দেখে নিন।
IPv6-এ ARP নেই। IPv6-এ একই কাজ করে NDP (Neighbor Discovery), যা ICMPv6-এর বার্তা দিয়ে চলে আর broadcast-এর বদলে multicast ব্যবহার করে; আর ঠিকানা পাওয়ার জন্য আছে SLAAC আর DHCPv6. এসব পর্ব ২১-এর বিষয়। Linux-এর ip neigh দুটোই একসাথে দেখায় — IPv6 প্রতিবেশীও সেখানে থাকে।
৮ · বিশ্বাসের দুর্বলতা — ভুয়া DHCP, ARP spoofing আর প্রতিরক্ষা
DHCP আর ARP দুটোই বিশ্বস্ত LAN-এর যুগের নকশা: উত্তরদাতার পরিচয় যাচাইয়ের কোনো ব্যবস্থা নেই। এখানে ঝুঁকিগুলো শুধু ধারণা হিসেবে আর প্রতিরক্ষাসহ দেখব, যাতে নিজের নেটওয়ার্ক রক্ষা করতে পারেন; অনুমতি ছাড়া অন্যের নেটওয়ার্কে এমন কিছু পরীক্ষা করা বেআইনি ও অনৈতিক।
ঝুঁকি ১ — ভুয়া (rogue) DHCP server
LAN-এ দ্বিতীয় কোনো DHCP server চালু হলে কিছু client তার Offer আগে পেয়ে সেটিই নেবে। প্রায়ই এটি নিরীহ ভুল — কেউ বাসার Wi-Fi router এনে অফিসের তারে লাগিয়েছেন, আর সেটি নিজের 192.168.0.x বিলি করছে; ফলে কিছু কর্মীর ইন্টারনেট “হঠাৎ” বন্ধ। কিন্তু ইচ্ছাকৃত হলে বিপদ বড়: একটি rogue DHCP server gateway বা DNS হিসেবে নিজের ঠিকানা দিতে পারে, তখন সব traffic বা সব নামের উত্তর তার হাত দিয়ে যায়। আরেকটি ঝুঁকি হলো DHCP starvation: অসংখ্য ভুয়া MAC দিয়ে pool-এর সব ঠিকানা দখল করে আসল ব্যবহারকারীদের ঠিকানা-শূন্য রাখা।
প্রতিরক্ষা — DHCP snooping
DHCP snooping switch-এর একটি বৈশিষ্ট্য (প্রায় সব managed switch-এ কোনো না কোনো নামে আছে)। প্রশাসক বলে দেন কোন port trusted — যেদিকে আসল DHCP server বা relay আছে (uplink). বাকি সব port untrusted. নিয়ম:
- Untrusted port থেকে আসা server-এর বার্তা (OFFER, ACK, NAK) switch ফেলে দেয় — ব্যবহারকারীর port-এ লাগানো কোনো router আর ঠিকানা বিলি করতে পারে না।
- প্রতিটি সফল ACK দেখে switch একটি binding table বানায়: MAC, IP, VLAN, port, lease-এর মেয়াদ। এই টেবিল পরের প্রতিরক্ষাগুলোর ভিত্তি।
- Untrusted port-এ প্রতি সেকেন্ডে কতটি DHCP বার্তা চলবে তার সীমা (rate limit) বসানো যায় — starvation কঠিন হয়। সাথে port security (পর্ব ১২) একটি port-এ MAC-এর সংখ্যা সীমিত করে।
ঝুঁকি ২ — ARP spoofing (ARP poisoning)
ARP-এ কেউ জিজ্ঞেস না করলেও reply পাঠানো যায়, আর অনেক OS সেই তথ্য cache-এ নিয়ে নেয় — gratuitous ARP-এর সুবিধাই এখানে দুর্বলতা। ARP spoofing-এ একটি যন্ত্র বারবার মিথ্যা ঘোষণা দেয়: “192.168.10.1 (gateway)-এর MAC আমার।” যাদের cache বিষিয়ে গেল, তাদের বাইরের সব packet এখন gateway-র বদলে সেই যন্ত্রে যায়। সে চাইলে packet ফেলে দিয়ে নেটওয়ার্ক বন্ধ করতে পারে, বা দেখে-বদলে আসল gateway-তে পাঠিয়ে দিতে পারে — একে বলে man-in-the-middle. শর্ত একটিই: আক্রমণকারীকে একই LAN-এ (একই VLAN-এ) থাকতে হয়; ARP router পার হয় না। তাই ক্যাফে, হোস্টেল বা হোটেলের খোলা নেটওয়ার্কে এই ঝুঁকি বেশি।
প্রতিরক্ষা — স্তরে স্তরে
| প্রতিরক্ষা | কী করে | সীমা |
|---|---|---|
| Dynamic ARP Inspection (DAI) | Untrusted port-এ আসা প্রতিটি ARP-এর sender IP-MAC জোড়া DHCP snooping-এর binding table-এর সাথে মেলায়; না মিললে ফেলে দেয় আর log করে | Static ঠিকানার যন্ত্রের জন্য আলাদা নিয়ম (ARP ACL) লিখতে হয়; switch-এর সমর্থন লাগে |
| IP Source Guard (নাম vendor-ভেদে আলাদা) | একই binding table দিয়ে port-এ ভুয়া উৎস IP-র packet আটকায় | শুধু managed switch-এ |
| Static ARP entry | সংবেদনশীল যন্ত্রে gateway-র MAC হাতে স্থায়ীভাবে বসানো | শত শত যন্ত্রে রক্ষণাবেক্ষণ কঠিন; gateway বদলালে সব জায়গায় বদলাতে হয় |
| IEEE 802.1X | Port বা Wi-Fi-তে ঢোকার আগেই যন্ত্র বা ব্যবহারকারীর পরিচয় যাচাই — অচেনা যন্ত্র LAN-এ ঢুকতেই পারে না | RADIUS server আর ব্যবস্থাপনা লাগে (পর্ব ১৪) |
| Segmentation আর client isolation | ছোট VLAN, অতিথিদের আলাদা VLAN; Wi-Fi-তে একই SSID-র ক্লায়েন্টদের সরাসরি কথা বন্ধ | আক্রমণের পরিসর ছোট করে, পুরো বন্ধ করে না |
| End-to-end encryption | HTTPS/TLS, SSH, VPN: কেউ মাঝখানে বসলেও বিষয়বস্তু পড়তে বা চুপচাপ বদলাতে পারে না; certificate যাচাই ভুয়া সার্ভার ধরিয়ে দেয় (পর্ব ৪৮, ৪৯) | Certificate সতর্কবার্তা উপেক্ষা করলে সুরক্ষা থাকে না |
| নজরদারি | ARP টেবিলে হঠাৎ gateway-র MAC বদল, বা একই MAC-এ অনেক IP — এমন পরিবর্তনে সতর্কবার্তা দেওয়ার টুল আর IDS (পর্ব ৫০) | শুধু জানায়, ঠেকায় না |
ip dhcp snooping
ip dhcp snooping vlan 10,20
ip arp inspection vlan 10,20 ! DAI, snooping-এর binding table ব্যবহার করে
!
interface GigabitEthernet1/0/48
description Uplink to core / DHCP relay
ip dhcp snooping trust ! শুধু এই দিক থেকে OFFER/ACK চলবে
ip arp inspection trust
!
interface range GigabitEthernet1/0/1 - 46
ip dhcp snooping limit rate 15 ! প্রতি সেকেন্ডে সর্বোচ্চ 15টি DHCP বার্তাএটি একটি উদাহরণ, চালানোর কোড নয়; rate-এর সংখ্যা শুধু নমুনা। Trust ভুল port-এ দিলে আসল DHCP-ই আটকে যায়, আর static যন্ত্রের নিয়ম না লিখে DAI চালু করলে প্রিন্টার বা সার্ভার হঠাৎ হারিয়ে যায় — তাই আগে পরিকল্পনা আর log দেখা।
আরও গভীরে: Linux kernel-এর neighbour subsystem ARP আর IPv6 NDP-কে একই অবস্থা-যন্ত্র (NUD: INCOMPLETE, REACHABLE, STALE, DELAY, PROBE, FAILED) দিয়ে চালায়; ip -s neigh প্রতিটি entry-র ব্যবহার আর নিশ্চিতকরণের সময় দেখায়, আর /proc/sys/net/ipv4/neigh/-এর ফাইলগুলো interface-ধরে সময় বদলাতে দেয়। বড় cloud-এর virtual নেটওয়ার্কে সাধারণত আসল broadcast চলেই না — ARP আর DHCP-র উত্তর virtualization স্তর নিজেই দেয়, কারণ কোন VM-এর কোন ঠিকানা তা আগে থেকেই জানা (পর্ব ৫৪)। DHCP server-এর দিকে ISC-র পুরোনো ISC DHCP-র রক্ষণাবেক্ষণ বন্ধ ঘোষিত হয়েছে, আর তার উত্তরসূরি Kea; ছোট নেটওয়ার্কে dnsmasq বহুল ব্যবহৃত।
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- DORA কী, কোন transport আর port? — Discover, Offer, Request, Ack; UDP, server 67, client 68.
- DHCP Discover-এর উৎস আর গন্তব্য IP? — 0.0.0.0 থেকে 255.255.255.255, কারণ client-এর ঠিকানা নেই আর server অজানা।
- অন্য subnet-এর host-এ পাঠাতে PC কার MAC-এর জন্য ARP করে? — Default gateway-র; frame-এর গন্তব্য MAC router-এর, IP-র গন্তব্য আসল host-এর।
- ARP request আর reply কীভাবে যায়? — Request broadcast (ff:ff:ff:ff:ff:ff), reply unicast; ARP চলে সরাসরি Ethernet-এ, EtherType 0x0806.
- অন্য VLAN-এ DHCP server থাকলে client ঠিকানা পায় কীভাবে, আর 169.254.x.x মানে কী? — Gateway-এ relay agent (giaddr, যেমন ip helper-address); 169.254 মানে DHCP-র কোনো উত্তর আসেনি (APIPA).
৯ · AI-এর যুগে DHCP আর ARP-এর সমস্যা খোঁজা
“অফিসের কিছু কম্পিউটার 169.254 পাচ্ছে, কী করব?” — AI দ্রুত একটি তালিকা দেবে, কিন্তু DHCP আর ARP-এ কিছু ভুল বারবার দেখা যায়, আর switch-এ একটি ভুল কমান্ড পুরো VLAN-কে ঠিকানাহীন করে দিতে পারে:
| AI-এর ভুল | কেন ভুল | কীভাবে যাচাই করবেন |
|---|---|---|
| “দূরের সার্ভারের MAC পেতে ARP হয়” | ARP router পার হয় না; অন্য subnet-এর জন্য ARP হয় gateway-র | ip neigh-এ দেখুন — ইন্টারনেট ব্যবহারের পরেও শুধু gateway থাকে |
| Port উল্টো (client 67, server 68) বা “DHCP চলে TCP-তে” | UDP; server 67, client 68 | নিজের ল্যাবে packet capture করে দেখুন (পর্ব ৫৫), RFC 2131 মিলিয়ে নিন |
| Option নম্বর গুলিয়ে ফেলা বা বানানো | যেমন DNS-কে option 3 বলা (আসলে 6; 3 হলো router) | IANA-র BOOTP/DHCP Parameters রেজিস্ট্রি দেখুন |
পুরোনো কমান্ড: ifconfig, arp -a, dhclient সবখানে | আধুনিক Linux-এ ip neigh, ip addr; DHCP client বিতরণভেদে আলাদা | man ip-neighbour, নিজের বিতরণের ডকুমেন্টেশন |
| এক vendor-এর কমান্ড “সব switch-এর” বলে দেওয়া | ip helper-address, snooping, DAI-এর ভাষা vendor-ভেদে আলাদা | নিজের মডেল আর firmware উল্লেখ করে ডকুমেন্টেশনে মেলান |
| “সমস্যা হলে DHCP snooping বা DAI বন্ধ করে দিন” | লক্ষণ লুকায়, নিরাপত্তা খোলে; আসল কারণ সাধারণত ভুল trust port বা static যন্ত্রের নিয়ম | Switch-এর log আর binding table দেখে আসল কারণ খুঁজুন |
| বানানো RFC নম্বর | বিশ্বাসযোগ্য শোনালেও অস্তিত্ব নাও থাকতে পারে | rfc-editor.org-এ খুলে শিরোনাম মেলান: ARP 826, DHCP 2131, option 2132, APIPA 3927, conflict detection 5227 |
AI-কে সমস্যা খোঁজার কাজ দিলে তথ্য, সীমা আর যাচাইয়ের শর্তসহ দিন:
AI-এর পরামর্শ প্রয়োগের আগে — চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১ARP-এ কোনো পরিচয় যাচাই নেই কেন? চল্লিশ বছর পরেও কেন এটি “ঠিক” করা হয়নি?
১৯৮২ সালে RFC 826 যখন লেখা হয়, তখন একটি Ethernet মানে ছিল একটি বিশ্ববিদ্যালয়ের ল্যাব বা একটি কোম্পানির কয়েকটি মিনিকম্পিউটার — সবাই পরিচিত, তার টানা নিজের ভবনে। নকশার লক্ষ্য ছিল সরলতা আর সাধারণতা: যেকোনো hardware ঠিকানা, যেকোনো protocol ঠিকানা, ছোট্ট একটি packet. ইচ্ছাকৃত মিথ্যা উত্তরের কথা তখন নকশার আলোচনায় প্রায় ছিলই না। তার ওপর cryptographic যাচাই সেই যুগের যন্ত্রে ব্যয়বহুল ছিল, আর চাবি বিলি করার কোনো অবকাঠামো ছিল না।
পরে কেন বদলানো যায়নি? প্রথম কারণ, ARP প্রতিটি IPv4 যন্ত্রে আছে — প্রিন্টার, ক্যামেরা, কারখানার যন্ত্র, পুরোনো সার্ভার। প্রোটোকল বদলালে সবাইকে একসাথে বদলাতে হবে, যা অসম্ভব। দ্বিতীয় কারণ, যাচাইয়ের জন্য চাবি লাগে, আর একটি নতুন যন্ত্র নেটওয়ার্কে ঢুকেই কোন চাবি বিশ্বাস করবে — এই “প্রথম বিশ্বাস” সমস্যার কোনো সহজ সমাধান নেই। IPv6-এর NDP-ও শুরুতে একই দুর্বলতা নিয়ে এসেছিল; এর জন্য SEND (RFC 3971, ২০০৫) নামে একটি cryptographic সংস্করণ মানও হয়েছিল, কিন্তু জটিলতার কারণে বাস্তবে প্রায় কোথাও ব্যবহার হয় না।
তাই শিল্পজগৎ অন্য পথ নিল: protocol না বদলে তার চারপাশে পাহারা। Switch নিজেই জানে কোন port-এ কোন MAC আর DHCP কোন IP দিয়েছে — DHCP snooping-এর binding table — আর সেই জ্ঞান দিয়ে Dynamic ARP Inspection মিথ্যা ARP ফেলে দেয়। 802.1X নিশ্চিত করে LAN-এ শুধু পরিচিত যন্ত্র ঢোকে। আর সবচেয়ে মৌলিক উত্তর এসেছে ওপরের স্তর থেকে: TLS, SSH, VPN ধরে নেয় নেটওয়ার্ক অবিশ্বস্ত, তাই কেউ মাঝখানে বসলেও বিষয়বস্তু পড়তে বা চুপচাপ বদলাতে পারে না। আধুনিক “zero trust” চিন্তা এরই সম্প্রসারণ — LAN-এ আছেন বলেই কাউকে বিশ্বাস নয়।
মূল উপলব্ধি: বহুল প্রচলিত protocol একবার ছড়িয়ে পড়লে তার নকশা প্রায় স্থির হয়ে যায়; তখন নিরাপত্তা আসে protocol-এর ভেতর থেকে নয়, চারপাশের অবকাঠামো আর ওপরের স্তরের encryption থেকে।
প্র ০২DHCP-তে Request বার্তাটি কেন broadcast? Offer পাওয়ার পর তো client server-এর ঠিকানা জানে — সরাসরি unicast করলে কী সমস্যা হতো?
প্রথম কারণটি সবচেয়ে সরল: client-এর এখনো নিজের ঠিকানা নেই। Offer-এ ঠিকানা প্রস্তাব করা হয়েছে মাত্র, দেওয়া হয়নি। ACK আসার আগে client সেই ঠিকানাকে উৎস হিসেবে ব্যবহার করলে, আর ঠিক তখন অন্য কেউ সেটি ব্যবহার করতে থাকলে, অন্যদের ARP cache-এ ভুল তথ্য ঢুকে যেত। তাই উৎস থাকে 0.0.0.0. আর server-এর ঠিকানা জানা থাকলেও, unicast-এর জন্য client-কে server-এর MAC জানতে ARP করতে হতো — ঠিকানাহীন অবস্থায় যা নিজেই সমস্যাজনক।
দ্বিতীয় কারণটি নকশার মূল চিন্তা: একটি LAN-এ একাধিক DHCP server থাকতে পারে — বিভ্রাট এড়াতে প্রায়ই দুটি রাখা হয়। Discover broadcast বলে দুজনেই Offer দেয়, আর দুজনেই নিজের pool থেকে একটি ঠিকানা অল্প সময়ের জন্য আলাদা করে রাখে। Client একটি বেছে নিলে বাকি server-কে জানানো দরকার, যাতে তারা আলাদা করা ঠিকানা ফেরত নেয়। Broadcast Request ঠিক এই কাজটি করে — option 54 (server identifier)-এ লেখা থাকে কাকে বাছা হলো; যার নাম নেই, সে বুঝে যায় তার Offer বাতিল। Unicast হলে হেরে যাওয়া server কিছুই জানত না, আর ঠিকানাটি তার timeout পর্যন্ত আটকে থাকত।
মজার বিষয়, পরে নবায়নের সময় (RENEWING) client unicast করে, কারণ তখন তার ঠিকানা আছে আর server-ও নির্দিষ্ট। REBINDING-এ আবার broadcast, কারণ তখন প্রশ্নটি হয়ে যায় “যেকোনো server”. অর্থাৎ broadcast না unicast — সিদ্ধান্তটি প্রতিটি অবস্থায় নির্ভর করে দুটি প্রশ্নে: আমার ঠিকানা আছে কি? আর কাকে জানানো দরকার? RFC 2131-এর টেবিলে প্রতিটি অবস্থায় কোন ঘর কী থাকবে, তা এই যুক্তিতেই সাজানো।
মূল উপলব্ধি: Broadcast শুধু “ঠিকানা জানি না” বলে নয় — অনেক সময় এটি একটি ঘোষণা, যাতে সংশ্লিষ্ট সবাই একসাথে একই সিদ্ধান্ত জানে। একাধিক server-এর সমন্বয় এই একটি বার্তায় হয়ে যায়।
প্র ০৩ক্যাফের অতিথি Wi-Fi-তে lease ২৪ ঘণ্টা রাখা হয়েছে, আর বিকেলে নতুন কেউ ঠিকানা পাচ্ছে না। হিসাব দিয়ে ব্যাখ্যা করুন, lease কত হওয়া উচিত।
ধরুন pool 192.168.30.100 থেকে 192.168.30.250 — মোট ২৫০ − ১০০ + ১ = ১৫১টি ঠিকানা। ক্যাফে খোলে সকাল ১০টায়, ঘণ্টায় গড়ে ৫০ জন নতুন অতিথি আসেন, প্রত্যেকে প্রায় এক ঘণ্টা থাকেন। অনেক ফোন যাওয়ার সময় DHCPRELEASE পাঠায় না — Wi-Fi-র সীমার বাইরে চলে যায়, ব্যস। তাই server-এর চোখে একটি ঠিকানা ব্যস্ত থাকে lease-এর মেয়াদ শেষ হওয়া পর্যন্ত।
২৪ ঘণ্টার lease: প্রথম ২৪ ঘণ্টায় কোনো lease-ই শেষ হয় না, তাই t ঘণ্টা পরে ব্যস্ত ঠিকানা = ৫০ × t. ১৫১ পূর্ণ হয় t = ১৫১ ÷ ৫০ ≈ ৩.০২ ঘণ্টায় — দুপুর একটার একটু পরেই pool শেষ, অথচ ক্যাফেতে তখন হয়তো ৫০ জনই আছেন। নতুন অতিথিরা Discover পাঠান, কোনো Offer আসে না, ফোন দেখায় “connected, no internet” বা 169.254.
১ ঘণ্টার lease: অতিথি আসার সময় lease পেলেন এক ঘণ্টার; ৩০ মিনিটে (T1) নবায়ন, তাই নতুন মেয়াদ আসার ১.৫ ঘণ্টা পর পর্যন্ত। এক ঘণ্টা পরে চলে গেলেন, আর নবায়ন হলো না। অর্থাৎ প্রতিটি ঠিকানা গড়ে প্রায় ১.৫ ঘণ্টা ব্যস্ত। Little's law (গড় সংখ্যা = আগমনের হার × গড় অবস্থানকাল) অনুযায়ী স্থির অবস্থায় ব্যস্ত ঠিকানা ≈ ৫০ × ১.৫ = ৭৫, যা ১৫১-এর অর্ধেক — আরামসে চলবে।
তাহলে খুব ছোট lease, যেমন ৫ মিনিট? তখন প্রতিটি ফোন প্রতি আড়াই মিনিটে নবায়ন করবে — server-এ আর বাতাসে অপ্রয়োজনীয় traffic, আর server কয়েক মিনিট বন্ধ থাকলেই সবার ঠিকানা হারাবে। তাই অতিথি নেটওয়ার্কে সাধারণত ৩০ মিনিট থেকে কয়েক ঘণ্টা, অফিসের স্থায়ী কর্মীদের নেটওয়ার্কে এক দিন বা বেশি, আর সার্ভারের মতো যন্ত্রে reservation. আরেকটি সমাধান pool বড় করা — /24-এর বদলে /23 (পর্ব ১৭)।
মূল উপলব্ধি: Lease-এর দৈর্ঘ্য একটি trade-off: লম্বা lease মানে কম traffic আর server-বিভ্রাটে বেশি সহনশীলতা, ছোট lease মানে চলে যাওয়া যন্ত্রের ঠিকানা দ্রুত ফেরত। যন্ত্রগুলো কতক্ষণ থাকে আর pool কত বড়, তা দিয়ে হিসাব করে ঠিক করুন।
প্র ০৪একটি বিশ্ববিদ্যালয়ে ৪০টি VLAN. প্রতিটি gateway-এ আলাদা DHCP server চালানো ভালো, নাকি একটি কেন্দ্রীয় server আর relay? কেন্দ্রীয় server বন্ধ হলে কী হবে?
ছোট অফিসে router-এর ভেতরের DHCP-ই যথেষ্ট — বাসার Wi-Fi router যেমন করে। কিন্তু ৪০টি VLAN-এ প্রতিটি gateway-এ আলাদা server মানে ৪০ জায়গায় আলাদা কনফিগারেশন: DNS server বদলালে ৪০ জায়গায় বদল, কোন ঠিকানা কাকে দেওয়া হয়েছে তা জানতে ৪০টি log দেখা, reservation-এর তালিকা ৪০ ভাগে ছড়ানো। ভুল আর অসামঞ্জস্য সময়ের ব্যাপার মাত্র।
কেন্দ্রীয় নকশায় একটি (বা দুটি) DHCP server সব pool রাখে, আর প্রতিটি VLAN-এর gateway-এ শুধু একটি লাইন: relay-র ঠিকানা। giaddr দেখে server বোঝে কোন pool. সুবিধা অনেক: এক জায়গায় নীতি, এক জায়গায় log (কোন সময় কোন MAC কোন IP পেয়েছিল — নিরাপত্তা-তদন্তে খুব দরকারি), DNS-এর সাথে স্বয়ংক্রিয় যুক্তি, আর option 82 দিয়ে “কোন ভবনের কোন switch port” পর্যন্ত জানা। এজন্যই BOOTP-এর যুগেই, ১৯৮০-এর দশকে, relay-র ধারণা এসেছিল, আর RFC 1542 এর নিয়ম স্পষ্ট করে।
দুর্বলতা: কেন্দ্রীয় server একটি single point of failure. তবে lease-এর নকশাই প্রথম রক্ষাকবচ — server বন্ধ হলে চলমান যন্ত্রগুলোর কিছুই হয় না যতক্ষণ lease বাকি; সমস্যা হয় শুধু নতুন যন্ত্রের আর যাদের মেয়াদ ফুরাচ্ছে। এক দিনের lease-এ কয়েক ঘণ্টার বিভ্রাট প্রায় কেউ টেরই পায় না (অংশ ৩-এর simulator মনে করুন)। দ্বিতীয় রক্ষাকবচ redundancy: দুটি server, প্রতিটি gateway-এ দুটি helper ঠিকানা। পুরোনো সহজ কৌশল “split scope” — pool-এর প্রায় ৮০% এক server-এ, ২০% অন্যটিতে, যাতে দুজন একই ঠিকানা কখনো না দেয়। আধুনিক server-গুলো (যেমন Kea-র high-availability ব্যবস্থা বা Windows Server-এর DHCP failover) দুই server-এর lease-এর তথ্য মিলিয়ে রাখে, একজন বন্ধ হলে অন্যজন পুরো দায়িত্ব নেয়।
আরেকটি বাস্তব বিষয়: relay-র পথের firewall-এ দুই দিকে UDP 67 খোলা, আর DHCP snooping-এ relay-এর দিকের port trusted রাখতে হয়।
মূল উপলব্ধি: নেটওয়ার্ক বড় হলে কনফিগারেশন কেন্দ্রীভূত করা আর তথ্য বহন করা (relay) আলাদা করা হয়। Single point of failure-এর উত্তর redundancy, আর DHCP-র lease নিজেই একটি বিল্ট-ইন বাফার।
প্র ০৫Host কেন দূরের গন্তব্যের জন্য সরাসরি ARP না করে gateway-র জন্য ARP করে? Proxy ARP-এর ইতিহাস এই প্রশ্নে কী আলো ফেলে?
ARP-এর request একটি broadcast, আর broadcast নিজের broadcast domain-এর বাইরে যায় না — router-এর কাজই হলো LAN-গুলোকে আলাদা রাখা। তার ওপর MAC ঠিকানা শুধু একটি link-এর ভেতরে অর্থবহ: দূরের সার্ভারের MAC জানলেও লাভ নেই, কারণ frame সেই link-এ কখনো পৌঁছাবে না। প্রতিটি hop-এ frame নতুন করে বানানো হয়, আর প্রতিটি link-এ শুধু পরের hop-এর MAC লাগে। তাই host-এর কাজ একটাই — ঠিক করা পরের hop কে: গন্তব্য নিজের subnet-এ হলে গন্তব্য নিজেই, নইলে gateway. এই সিদ্ধান্তের জন্যই host-কে subnet mask জানতে হয়।
কিন্তু শুরুর দিকে সবসময় এমন ছিল না। IP-র প্রথম যুগে ঠিকানা ছিল শ্রেণিভিত্তিক (class A, B, C — পর্ব ১৬), আর একটি class B নেটওয়ার্ক মানে ৬৫ হাজারের বেশি ঠিকানা। বিশ্ববিদ্যালয়গুলো এক নেটওয়ার্ক নম্বরকে কয়েকটি ভৌত LAN-এ ভাগ করতে চাইল, কিন্তু তখনকার অনেক host-এর সফটওয়্যার mask বুঝতই না — তারা ভাবত পুরো class B-ই এক তারে। সমাধান হিসেবে router-গুলো এমন host-এর ARP প্রশ্নের উত্তর নিজের MAC দিয়ে দিতে শুরু করল: “ওই ঠিকানা আমি, আমাকে দিন।” এটিই proxy ARP, যার বর্ণনা RFC 1027 (১৯৮৭)-এ। প্রায় একই সময়ে RFC 950 (১৯৮৫) subnetting-এর মান ঠিক করে, আর ধীরে ধীরে সব host mask বুঝতে শিখল।
আজ host নিজেই হিসাব করে, তাই proxy ARP সাধারণত দরকার নেই, আর এর কিছু অসুবিধাও আছে: ভুল mask-এর host-ও “ঠিকঠাক” চলে, ফলে ভুল ধরা পড়ে না; প্রতিটি দূরের ঠিকানার জন্য আলাদা ARP entry জমে; আর কেউ অন্যের হয়ে উত্তর দিতে পারে — এই ধারণাটিই অপব্যবহারে ARP spoofing. তবু কিছু বিশেষ ক্ষেত্রে, যেমন কিছু VPN বা মোবাইল-ধাঁচের নকশায়, এটি এখনো কাজে লাগে।
মূল উপলব্ধি: “ARP হয় পরের hop-এর জন্য” — এই নিয়মটি layer 2 আর layer 3-এর পরিষ্কার ভাগের ফল: IP ঠিক করে শেষ গন্তব্য, link layer শুধু পরের লাফ। Proxy ARP সেই ভাগ মুছে দিয়ে পুরোনো সমস্যা ঢাকত, তাই আধুনিক নকশায় এটি ব্যতিক্রম।
অনুশীলন
খাতা-কলম নিন — সময়, mask আর MAC হাতে হিসাব করে তারপর উত্তর মেলান।
-
হিসাব (lease): একটি ফোন রাত ৮:০০-এ DHCP থেকে ৬ ঘণ্টার lease পেল, server option 58/59 পাঠায়নি। (ক) T1, T2 আর মেয়াদ শেষ কখন, আর সেকেন্ডে কত? (খ) T1-এ server চুপ থাকলে, RFC 2131-এর “বাকি সময়ের অর্ধেক, সর্বনিম্ন ৬০ সেকেন্ড” নিয়মে RENEWING-এর দ্বিতীয় চেষ্টা কখন?
(ক) Lease = ৬ × ৩,৬০০ = ২১,৬০০ সেকেন্ড। T1 = ২১,৬০০ × ০.৫ = ১০,৮০০ সেকেন্ড = ৩ ঘণ্টা → রাত ১১:০০. T2 = ২১,৬০০ × ০.৮৭৫ = ১৮,৯০০ সেকেন্ড = ৫ ঘণ্টা ১৫ মিনিট → রাত ১:১৫. মেয়াদ শেষ রাত ২:০০.
(খ) T1 (১০,৮০০) থেকে T2 (১৮,৯০০) পর্যন্ত বাকি ৮,১০০ সেকেন্ড; অর্ধেক ৪,০৫০ সেকেন্ড = ১ ঘণ্টা ৭ মিনিট ৩০ সেকেন্ড। তাই দ্বিতীয় চেষ্টা ১০,৮০০ + ৪,০৫০ = ১৪,৮৫০ সেকেন্ডে, অর্থাৎ রাত ১২:০৭:৩০-এ। আসল client-এ সামান্য এলোমেলো দেরি যোগ হতে পারে।
-
হাতে trace: PC-A-র ঠিকানা 192.168.10.11, gateway 192.168.10.1. নিচের প্রতিটি ক্ষেত্রে PC-A কোন IP-র জন্য ARP করবে, আর frame-এর গন্তব্য MAC কার হবে? (ক) mask /24, গন্তব্য 192.168.10.200; (খ) mask /24, গন্তব্য 192.168.11.5; (গ) mask /25 (255.255.255.128), গন্তব্য 192.168.10.200; (ঘ) গন্তব্য 127.0.0.1.
(ক) 192.168.10.200 AND 255.255.255.0 = 192.168.10.0 = নিজের subnet → ARP 192.168.10.200-এর জন্য, frame যাবে তারই MAC-এ।
(খ) 192.168.11.5 → 192.168.11.0 ≠ 192.168.10.0 → বাইরে → ARP gateway 192.168.10.1-এর জন্য, frame R1-এর MAC-এ। (তৃতীয় সংখ্যায় মাত্র ১-এর পার্থক্যই যথেষ্ট।)
(গ) /25-এ শেষ সংখ্যার ওপরের bit-টিও নেটওয়ার্কের অংশ। ১১ =
0000 1011, AND 128 = 0 → নেটওয়ার্ক 192.168.10.0; ২০০ =1100 1000, AND 128 = 128 → নেটওয়ার্ক 192.168.10.128. আলাদা! তাই ARP gateway 192.168.10.1-এর জন্য — যদিও প্রথম তিনটি সংখ্যা একই। “প্রথম তিন সংখ্যা মিললেই এক subnet” — এই শর্টকাট শুধু /24-এ খাটে।(ঘ) 127.0.0.1 হলো loopback — packet কোনো তারে যায়ই না, kernel-এর ভেতরেই ফেরে। তাই কোনো ARP নেই, কোনো Ethernet frame নেই।
-
আউটপুট অনুমান করুন: অংশ ৬-এর
arp_lan.js-এ শুধুconst AGE = 60বদলেconst AGE = 100করা হলো। শেষের দিকেt=75sথেকে শুরু করে কী ছাপা হবে?t=75s PC-A -> 192.168.10.12: same subnet, ARP for the host itself cache hit: 192.168.10.12 -> 02:aa:00:00:00:0b frame: dst MAC 02:aa:00:00:00:0b, dst IP 192.168.10.12 caches at t=75s: [PC-A] 192.168.10.12 02:aa:00:00:00:0b age 75s; 192.168.10.1 02:aa:00:00:00:01 age 65s [PC-B] 192.168.10.11 02:aa:00:00:00:0a age 75s [R1] 192.168.10.11 02:aa:00:00:00:0a age 65sPC-B-র entry শেখা হয়েছিল t = ০-তে; ৭৫ < ১০০, তাই এখন cache hit — কোনো ARP request নেই, আর entry-র সময় নতুন হয়নি বলে বয়স দেখায় ৭৫. PC-B-র cache-এও PC-A-র entry আর হালনাগাদ হয়নি (৭৫ সেকেন্ড), কারণ কোনো ARP হয়নি। লম্বা মেয়াদ মানে কম broadcast, কিন্তু কোনো যন্ত্রের MAC বদলালে পুরোনো entry ভুল জায়গায় frame পাঠাবে আরও বেশিক্ষণ — এই trade-off-ই OS-গুলোকে REACHABLE/STALE-এর মতো যাচাইয়ের নকশায় নিয়ে গেছে।
-
কমান্ড লিখুন: (ক) Windows-এ বর্তমান lease ছেড়ে নতুন করে ঠিকানা নিন, তারপর ARP টেবিল দেখুন। (খ) Linux-এ gateway কোনটি আর তার MAC cache-এ আছে কি না দেখুন। (গ) Cisco IOS-style একটি layer-3 switch-এর
Vlan30interface-এ (192.168.30.1/24) DHCP relay চালু করুন, server 192.168.99.10.# (ক) Windows (PowerShell বা cmd) ipconfig /release ipconfig /renew arp -a # বা: Get-NetNeighbor -AddressFamily IPv4 # (খ) Linux ip route show default # default via 192.168.10.1 dev ... ip neigh show 192.168.10.1 # lladdr ... REACHABLE/STALE, বা কিছুই না ! (গ) উদাহরণ — Cisco IOS-style interface Vlan30 ip address 192.168.30.1 255.255.255.0 ip helper-address 192.168.99.10(খ)-তে
ip neighকিছু না দেখালে ভয়ের কিছু নেই — হয়তো কিছুক্ষণ কোনো traffic যায়নি। কোনো ঠিকানায় একবার যোগাযোগ করলে (যেমন gateway-তে ping) entry দেখা দেবে। (গ)-তে মনে রাখুন: server-এ 192.168.30.0/24-এর pool থাকতে হবে, gateway option-এ 192.168.30.1, আর DHCP snooping চালু থাকলে relay-র দিকের port trusted.
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি নতুন ল্যাপটপ চালু হয়ে ইন্টারনেটের একটি সার্ভারে প্রথম packet পাঠাচ্ছে — ঘটনাগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- DHCPDISCOVER broadcast: 0.0.0.0 থেকে 255.255.255.255
- Server-এর DHCPOFFER-এ প্রস্তাবিত ঠিকানা, mask, gateway আর DNS
- DHCPREQUEST broadcast, option 54-এ বাছাই করা server
- DHCPACK — lease শুরু, ল্যাপটপ BOUND
- Gateway-র MAC জানতে ARP request broadcast
- Frame পাঠানো: গন্তব্য MAC gateway-র, গন্তব্য IP সার্ভারের
একটি নতুন ল্যাপটপের DHCPDISCOVER বার্তায় IP header-এর উৎস আর গন্তব্য ঠিকানা কী থাকে?
- ল্যাপটপের নিজের IP থেকে DHCP server-এর IP-তে
- 0.0.0.0 থেকে 255.255.255.255
- 169.254.0.1 থেকে 255.255.255.255
- 0.0.0.0 থেকে default gateway-এ
একটি PC-র ঠিকানা 192.168.10.11/24, default gateway 192.168.10.1. PC-টি 203.0.113.80-এর একটি ওয়েব সার্ভারে প্রথম packet পাঠাবে, ARP cache খালি। PC কোন ঠিকানার জন্য ARP request পাঠাবে?
- 203.0.113.80
- 255.255.255.255
- 192.168.10.1
- DNS server-এর ঠিকানা
একটি ক্লায়েন্ট ৮ ঘণ্টার DHCP lease পেয়েছে; server T1 বা T2 আলাদা করে দেয়নি। কত সময় পরে ক্লায়েন্ট প্রথমবার নিজের server-কে unicast-এ নবায়নের অনুরোধ পাঠাবে?
- ৪ ঘণ্টা
- ৭ ঘণ্টা
- ৮ ঘণ্টা
- ২ ঘণ্টা
একটি অফিসে DHCP server আছে শুধু VLAN 99-এ (192.168.99.10). VLAN 20-এর ক্লায়েন্টরা ঠিকানা পায় কীভাবে, আর server কীভাবে বোঝে কোন pool থেকে দিতে হবে?
- Router সব VLAN-এর broadcast নিজে থেকেই সব VLAN-এ পাঠায়
- Server ক্লায়েন্টের MAC ঠিকানা দেখে pool বাছে
- Trunk port-এর কারণে VLAN 20-এর broadcast VLAN 99-এ পৌঁছে যায়
- VLAN 20-এর gateway relay agent হয়ে Discover server-এ unicast করে, আর giaddr-এ নিজের ঠিকানা লেখে
একটি switch-এ DHCP snooping চালু; uplink port trusted, ব্যবহারকারীদের port untrusted. একজন কর্মী নিজের port-এ একটি বাসার Wi-Fi router লাগালেন, যার DHCP server চালু। কী ঘটবে?
- সহকর্মীদের কেউ কেউ ওই router থেকে ঠিকানা পাবেন
- ওই port থেকে আসা DHCPOFFER আর DHCPACK switch ফেলে দেবে
- Switch port-টিকে স্বয়ংক্রিয়ভাবে অতিথি VLAN-এ সরিয়ে দেবে
- সব ক্লায়েন্টের DHCPDISCOVER আটকে যাবে
IPv4 over Ethernet-এর একটি ARP request সম্পর্কে কোন কথাটি সঠিক?
- Frame broadcast, EtherType 0x0806, ভেতরে oper = 1 আর target MAC শূন্য
- ARP request UDP port 67-এ যায়
- Request সবসময় unicast, reply broadcast
- ARP packet-এর IP header-এ TTL 1 থাকে, তাই router পার হয় না
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- DHCP দেয় চারটি তথ্য — ঠিকানা, mask, gateway, DNS — DORA-য়: Discover আর Request client-এর broadcast (0.0.0.0 → 255.255.255.255, UDP 68 → 67), Offer আর Ack server-এর; xid চারটিকে জোড়ে।
- Lease: T1 = ৫০%-এ unicast renew, T2 = ৮৭.৫%-এ broadcast rebind, মেয়াদ শেষে ঠিকানা ছেড়ে INIT. Release, Decline (ARP probe-এ দ্বন্দ্ব), Nak (ভুল নেটওয়ার্ক)।
- VLAN পেরোতে relay (giaddr দেখে server pool বাছে); reservation দেয় স্থির ঠিকানা; 169.254.x.x মানে DHCP-র উত্তর আসেনি (APIPA).
- ARP: request broadcast, reply unicast, EtherType 0x0806, ২৮ byte; উত্তর থাকে cache-এ কিছুক্ষণ। অন্য subnet-এর গন্তব্যে ARP হয় gateway-র জন্য — MAC বদলায় প্রতি hop-এ, IP থাকে একই।
- দুটিই যাচাইহীন: rogue DHCP আর ARP spoofing-এর বিরুদ্ধে DHCP snooping, Dynamic ARP Inspection, 802.1X, segmentation আর end-to-end encryption.
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ১৯ · NAT আর private ঠিকানা — এক public IP-তে পুরো অফিসপরবর্তী পর্বDHCP যে private ঠিকানা দিল, তা নিয়ে ইন্টারনেটে যাওয়া।
- পর্ব ১৩ · VLAN আর trunking — এক switch-এ অনেক নেটওয়ার্কআগের ভিত্তিBroadcast domain আর SVI — relay agent কোথায় বসে।
- কম্পিউটার নেটওয়ার্ক · কোর্স হোম৬২টি পর্বপুরো কোর্সের রোডম্যাপ — IPv6-এর NDP আর SLAAC (পর্ব ২১), নিরাপত্তা (পর্ব ৫০) পর্যন্ত।
- অপারেটিং সিস্টেম · OS নিরাপত্তাপাশের ট্র্যাকবিশ্বাস, পরিচয় যাচাই আর স্তরে স্তরে প্রতিরক্ষা — যন্ত্রের ভেতরের দিক থেকে।
- DSA · Hash tableপাশের ট্র্যাকARP cache আর DHCP-র binding table আসলে দ্রুত lookup টেবিল।