Foundationপ্রথম নীতি থেকে
LEVEL 7লেসন ১৬/২২কঠিন৪০ মিনিট

DHCP — wifi join করলেই address কোথা থেকে আসে

DHCP: Dynamic Host Configuration Protocol

নতুন ডিভাইসে IP নেই, তাই সে কারো ঠিকানাও জানে না — DHCP এই paradox সমাধান করে link-layer broadcast-এর উপর DORA নাটক চালিয়ে, তারপর lease দিয়ে ঠিকানাটা ভাড়া দেয়।

এই লেসন শেষে আপনি পারবেন

  • bootstrapping paradox-টা ব্যাখ্যা করতে পারবেন — IP নেই এমন client কীভাবে 0.0.0.0:68 থেকে 255.255.255.255:67-এ broadcast করে ঠিকানা চায়, আর link-layer broadcast এখানে কেন অপরিহার্য
  • DORA-র চার ধাপ — Discover, Offer, Request, Ack — packet-by-packet trace করে বলতে পারবেন Request ধাপটা কেন broadcast-ই থাকে
  • Lease lifecycle-এর তিনটা মুহূর্ত চিনতে পারবেন — T1-এ unicast renewal, T2-তে rebroadcast, expiry-র পর release — আর প্রতিটায় client-এর behavior কী হবে তা বলতে পারবেন
  • DHCP options field-এ কী কী যায় (router, DNS, lease-time, MTU), static reservation আর dynamic pool-এর পার্থক্য, আর relay agent giaddr দিয়ে subnet-পার কাজটা কীভাবে করে তা বর্ণনা করতে পারবেন
  • Rogue DHCP server-এর ঝুঁকি আর defender-এর mitigation (DHCP snooping) — defensive mindset দিয়ে বিশ্লেষণ করতে পারবেন

আগে যা বোঝা থাকা দরকার

আগে এটা বুঝি

আপনার বন্ধুর বাসায় গেলেন, wifi password চাইলেন, phone connect করলেন — আর কয়েক সেকেন্ডে internet চলছে। মাঝখানে একটা প্রশ্ন কেউ জিজ্ঞেস করে না: আপনার phone-এর IP address এলো কোথা থেকে?

সহজ উত্তর: রাউটার দিয়েছে। কিন্তু সেই উত্তরের ভেতরে লুকিয়ে আছে networking-এর অন্যতম সুন্দর chicken-and-egg সমস্যা —

IP address ছাড়া আপনি কারো সাথে communicate করতে পারেন না। কিন্তু communicate না করে IP address চাওয়ার উপায় কী?

আপনার phone তখনো network-এ নতুন — কোন server-এর address, subnet mask, gateway কিছুই জানে না। মানুষ যেন নতুন শহরে এসে দেখল: খাবার অর্ডার করতে ফোন লাগবে, কিন্তু SIM চালু করতেই লাগবে ঠিকানা। এই deadlock ভাঙার প্রোটোকলই DHCP (RFC 2131)।

আজ দেখব সে কীভাবে ভাঙে — hint: উত্তরটা আপনার ঠিক নিচের স্তরে, link layer-এ — তারপর ঠিকানা আসলে দেওয়া হয় না, ভাড়া দেওয়া হয়, আর সেই ভাড়ার ঘড়িগুলো কীভাবে চলে। শেষে দেখব এই protocol কীভাবে অস্ত্র হতে পারে আর defender-রা কী করে।

মূল ধারণা

Bootstrapping paradox আর broadcast-এর ছুরি-মারা

Client-এর হাতে আছে শুধু: তার MAC address (factory-burned), আর একটা IP-হীন interface। UDP packet-এ source address লাগে — নেই; destination — কাকে জানে না। কিন্তু Ethernet-এ আছে জাদুকরী ঠিকানা FF:FF:FF:FF:FF:FF (broadcast MAC): এই ঠিকানায় পাঠালে segment-এর প্রতিটা ডিভাইস পায়। IP level-ও একই রকম: 255.255.255.255। Client-এর প্রথম packet-এর ঠিকানা দাঁড়ায়:

Fieldমানকেন
Source IP0.0.0.0‘অজানা’-র symbol — আমার IP নেই
Destination IP255.255.255.255কাকে জানি না, সবাই শোনো
Ports68 → 67DHCP client → server-এর fixed পোর্ট
TransportUDPপ্রশ্ন-উত্তর একবারই; reliability দরকার নেই

DORA — চার ধাপের নাটক

Exchange-টার নাম তার চার ধাপের আদ্যক্ষরে DORA:

Client                                    Server(s)
  │── DISCOVER (broadcast) ───────────────▶│  'কেউ আছো? IP দাও'
  │◀───────────────── OFFER ───────────────│  'এই নাও: 192.168.1.105'
  │── REQUEST (broadcast!) ───────────────▶│  'alpha-রটা চাই'
  │◀──────────────────────────────── ACK ──│  'নিশ্চিত, lease ১ ঘণ্টা'

প্রতিটা message আসলে option 53-এ type-নম্বর বহন করে: DISCOVER=1, OFFER=2, REQUEST=3, ACK=5।

Lease — ঠিকানা না, ভাড়া

Server ঠিকানা দেয় না — নির্দিষ্ট সময়ের ভাড়া দেয় (option 51, lease time)। মেয়াদের সাথে দুইটা alarm:

মাইলফলককখনClient-এর কাজ
T1 renewallease-এর ৫০%যে server দিয়েছিল তাকেই unicast REQUEST; ACK এলে মেয়াদ বাড়ল
T2 rebindinglease-এর ৮৭.৫%old server নীরব হলে broadcast REQUEST — যে-কোনো server উত্তর দিতে পারে
Expiry১০০%ঠিকানা surrender — সব traffic বন্ধ, fresh DISCOVER

Graceful degradation-এর পাঠ: প্রথমে সবচেয়ে সস্তা রাস্তা (unicast), তারপর ব্যাপক (broadcast), শেষে reset — client কখনো চুপচাপ ঠিকানা হারায় না, প্রতি ধাপে জোরে চেষ্টা করে।

Options — ACK-এর pocket থেকে যা বেরোয়

Packet-এর শেষাংশে variable-length TLV options — IP ছাড়াও পুরো configuration-kit:

Optionনম্বরদেয় কী
Subnet Mask1255.255.255.0
Router3192.168.1.1 — default gateway
DNS Servers61.1.1.1, 8.8.8.8
Lease Time513600 সেকেন্ড
Message Type53DORA-র কোন ধাপ

Client নিজেও DISCOVER-এ Parameter Request List (option 55) পাঠিয়ে চাইতে পারে: ‘আমাকে 1, 3, 6, 15, 28 দাও’।

ভেতরে কী ঘটছে

Packet-এর ভেতরে — একটা আসল DISCOVER খোলস করা

Ethernet frame
┌──────────────────────────────────────────────────────────────┐
│ dst: ff ff ff ff ff ff          ← broadcast MAC              │
│ src: a4 83 e7 1c 4d 92          ← client-এর নিজের MAC        │
│ type: 08 00                     ← ভেতরে IPv4                 │
└──────────────────────────────────────────────────────────────┘
IPv4 header (20 byte)
┌──────────────────────────────────────────────────────────────┐
│ proto=11(hex)=17 → UDP                                        │
│ src: 00 00 00 00                ← 0.0.0.0                    │
│ dst: ff ff ff ff ff              ← 255.255.255.255           │
└──────────────────────────────────────────────────────────────┘
UDP header: src port 00 44 (=68)   dst port 00 43 (=67)
BOOTP/DHCP payload
┌──────────────────────────────────────────────────────────────┐
│ op=01(request) htype=01(Ethernet) hlen=06 hops=00            │
│ xid: 3a 1f b2 07                ← transaction id             │
│ flags=80 00                     ← broadcast flag সেট!        │
│ ciaddr/yiaddr/siaddr/giaddr = সব 0.0.0.0                     │
│ chaddr: a4 83 e7 1c 4d 92 (+10 byte zero padding)            │
│ sname (64B) + file (128B) zero                               │
│ magic cookie: 63 82 53 63        ← 'এরপর options'            │
│ option 53 len 1: 01             ← DHCPDISCOVER              │
│ option 61 len 7: 01 a4 83 e7 1c 4d 92   ← client identifier │
│ option 55 len 4: 01 03 06 0f    ← চাই: mask, router, DNS…  │
│ option 255                       ← END                       │
└──────────────────────────────────────────────────────────────┘

তিনটা জিনিস: এক, flags=80 00 — client বলছে ‘উত্তর-ও broadcast করো’, কারণ unicast গ্রহণের ব্যবস্থা এখনো নেই। দুই, chaddr-এ MAC-ই পরিচয় — IP তো সে-ই চাইছে। তিন, magic cookie 63 82 53 63 — BOOTP legacy-র fingerprint; DHCP আসলে BOOTP-র সম্প্রসারণ, options field-টাই নতুন।

Reservation, pool আর relay agent

Server-side allocation দুই মোড: dynamic pool — range (.100–.200) প্রথম-আসা-প্রথম-পাওয়া, MAC মনে রেখে একই IP ফেরত দেওয়ার চেষ্টা কিন্তু guarantee নেই। Static reservation — নির্দিষ্ট MAC-এর জন্য নির্দিষ্ট IP pre-booked; printer/NAS/server-এর জন্য আদর্শ।

Subnet-এর বাইরে server থাকলে? Broadcast router পার হয় না — broadcast domain-এর সীমা। সমাধান: প্রতি subnet-এ relay agent (সাধারণত router-এই)। Agent broadcast শুনে unicast করে আসল server- এ পাঠায়, আর giaddr field-এ বসায় নিজের subnet-facing IP:

Subnet A (10.4.0.0/24)                 Data center
client ──broadcast──▶ relay(giaddr=10.4.0.1) ──unicast──▶ DHCP server
                                                            │
                          giaddr দেখে: 'এই client 10.4.x.x  ◀┘
                          pool থেকে পাবে'
server ──unicast-to-giaddr──▶ relay ──▶ client

giaddr-ই server-এর একমাত্র location-clue — এক central server এভাবে শত subnet serve করে। (X-Forwarded-For header-এর সাথে তুলনা করুন: proxy-এর পেছনে context preserve করার একই pattern।)

উদাহরণ

পূর্ণ DORA trace — দুই server, এক client

Network-এ দুই server: alpha (pool .100–.199) আর beta (.150–.249) — overlap intentional, বাস্তব misconfiguration-এর মতো:

t=0.000  client   DISCOVER  xid=0x3a1fb207  (0.0.0.0:68 → 255.255.255.255:67)
t=0.001  alpha    OFFER  yiaddr=192.168.1.101  lease=3600
t=0.002  beta     OFFER  yiaddr=192.168.1.152  lease=7200   ← দুটোই!

t=0.005  client   REQUEST  siaddr=alpha, req-ip=192.168.1.101  (broadcast)
t=0.006  alpha    ACK  yiaddr=192.168.1.101, opts=(mask, router, dns, lease)
t=0.007  beta     (siaddr নিজের না — নীরব, লকিত IP মুক্ত করল)

Decision-point: দুই OFFER-এর মধ্যে client সাধারণত প্রথমটা নেয় — simplicity over cleverness। এরপর gratuitous ARP (‘এই IP আগে কেউ নিয়েছে?’) শেষ-মুহূর্তের verification, তারপর 192.168.1.101/24-এ বসে যাওয়া, gateway-DNS পকেটে। Conflict হলে (দুই server ACK করে ভিন্ন IP দিলে) ARP-ই ধরে — client আবার DISCOVER দেয়। প্রতিটা ধাপে verification-এর সুতো; protocol কোথাও perfection assume করে না।

ছবিতে

Lease lifecycle state machine — জন্ম থেকে মৃত্যু

                 power-on / link-up
                        │
                        ▼
                  ┌───────────┐   DISCOVER (broadcast)
                  │   INIT    │ ─────────────────▶  OFFER অপেক্ষা
                  └───────────┘                          │
                        │ SELECTING                      ▼
                        │                         ┌────────────┐
                        ▼                         │  REQUESTING│
                  ┌───────────┐        ACK        └─────┬──────┘
                  │  BOUND    │ ◀────────────────────────┘
                  │ ip,T1,T2  │
                  └─────┬─────┘
              T1 (50%)  │                 T2 (87.5%)
                        ▼                        ▼
                  ┌───────────┐ unicast REQ  ┌───────────┐
                  │ RENEWING  │ ──▶ old srv  │ REBINDING │ broadcast REQ
                  └─────┬─────┘              └─────┬─────┘
                        │ ACK                      │ ACK
                        └────▶ BOUND ◀──ACK────────┘
                                 │
                   কোথাও সাড়া নেই, lease শেষ
                                 ▼
                        INIT (নতুন DISCOVER)

Shutdown-এ ভদ্র client RELEASE (type 7) unicast করে যায় — pool-এ সঙ্গে-সঙ্গে ফেরত। কিন্তু RELEASE optional: laptop sleep হলে কেউ জানায় না — মেয়াদ ফুরোলে server নিজেই IP মুক্ত করে; lease-ই একমাত্র সত্য।

DHCP client-এর পূর্ণ জীবনচক্র — প্রতিটা তীরে trigger আর message। T1/T2 দুইটা আলাদা alarm clock।

নিজে চালিয়ে দেখুন

EXPERIMENT

নিজের lease খুঁজে বের করুন, renew করুন

macOS / Linux / Windows (কিছু ধাপে sudo/admin)· ১৫ মিনিট

⚠️ SSH session-এ release নয় — সংযোগ নিজেই মরবে। Local machine, নিজের network।

ধাপ ১ — বর্তমান lease পড়া:

# macOS:
ipconfig getpacket en0
# yiaddr = 192.168.1.101     siaddr = 192.168.1.1 (server)
# DHCP router: 192.168.1.1   domain_name_server: 1.1.1.1, 8.8.8.8
# lease_time (uint32_value): 0xe10   ← hex! = 3600 সেকেন্ড

ls /var/db/dhcpclient/leases/ && cat /var/db/dhcpclient/leases/*
# LeaseIPAddress, LeaseStartDate, LeaseDuration — ফাইলে লেখা

# Linux:
cat /var/lib/dhcp/dhclient.enp3s0.leases
# প্রতিটা block-এ renew/rebind/expire timestamp — T1/T2 চোখের সামনে

ধাপ ২ — release + renew (DORA live):

# Linux:
sudo dhclient -r -v enp3s0     # RELEASE — 'ভাড়া ফেরত'
sudo dhclient -v enp3s0        # পুরো DORA stdout-এ

# macOS:
sudo ipconfig set en0 BOOTP && sudo ipconfig set en0 DHCP

# Windows (admin cmd):
ipconfig /release && ipconfig /renew

dhclient -v output-এ খোঁজুন: DISCOVER, OFFER from ..., REQUEST, ACK from ... — diagram-এর হুবহু চার লাইন। আর lease মাঝপথে (dhclient -v আবার) চালালে দেখবেন শুধু unicast REQUEST+ACK — DISCOVER নেই: T1-পথের live প্রমাণ।

ধাপ ৩: আপনার lease_time ÷ ২ — T1 কত সেকেন্ডে আঘাত হানবে?

এটা কী প্রমাণ করে

আপনার device-এর ঠিকানা আসলেই সময়-সীমিত lease — server, মেয়াদ, options সব পড়া যায়, আর renew/release কমান্ডে DORA live ঘটে।

নিজে বানান

BUILD IT

Toy DHCP — দুই server, এক client, আসল UDP multicast segment-এ DORA

Python · ●●○○○
  1. UDP multicast group = broadcast segment simulation — সব peer group join করে
  2. Server class: pool manager (range allocation, MAC→IP leases dict)
  3. Client state machine: DISCOVER → প্রথম OFFER → REQUEST broadcast → ACK-এ BOUND
  4. দুই server instance — client যে OFFER প্রথম পায় তার siaddr REQUEST-এ জানায়
  5. Timeline print-এ DORA-র প্রতিটা ধাপ চোখে
import json, socket, threading, time

GROUP, PORT = '239.255.0.67', 6767      # simulation segment

def tx(msg):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF,
                 socket.inet_aton('127.0.0.1'))
    s.sendto(json.dumps(msg).encode(), (GROUP, PORT)); s.close()

class Peer(threading.Thread):
    def __init__(self, name):
        super().__init__(daemon=True)
        self.name = name
        self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
        self.s.bind(('', PORT))
        self.s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
                          socket.inet_aton(GROUP) + socket.inet_aton('127.0.0.1'))
    def log(self, text):
        print(f'[{time.strftime("%H:%M:%S")}] {self.name:<7} {text}')

class Server(Peer):
    def __init__(self, name):
        super().__init__(name)
        self.pool_next, self.leases = 101, {}   # 192.168.1.101 … .199
        self.opts = {'mask': '255.255.255.0', 'router': '192.168.1.1',
                     'dns': ['1.1.1.1'], 'lease': 3600}
        threading.Thread(target=self.loop, daemon=True).start()
    def loop(self):
        while True:
            msg = json.loads(self.s.recvfrom(4096)[0])
            if msg['type'] == 'DISCOVER':
                ip = self.allocate(msg['chaddr'])
                self.log(f"OFFER  {ip} → {msg['chaddr']}")
                tx({'type': 'OFFER', 'siaddr': self.name, 'yiaddr': ip,
                    'xid': msg['xid'], 'opts': self.opts})
            elif msg['type'] == 'REQUEST':
                if msg['siaddr'] != self.name:
                    continue                    # client অন্য server নিয়েছে
                self.leases[msg['chaddr']] = msg['yiaddr']
                self.log(f"ACK    {msg['yiaddr']} → {msg['chaddr']}")
                tx({'type': 'ACK', 'yiaddr': msg['yiaddr'], 'xid': msg['xid'],
                    'opts': self.opts})
    def allocate(self, mac):
        if mac in self.leases: return self.leases[mac]
        used = set(self.leases.values())
        while f'192.168.1.{self.pool_next}' in used: self.pool_next += 1
        return f'192.168.1.{self.pool_next}'

class Client(Peer):
    def __init__(self, mac):
        super().__init__('client'); self.mac = mac
    def recv_matching(self, typ, xid):
        while True:
            m = json.loads(self.s.recvfrom(4096)[0])
            if m['type'] == typ and m['xid'] == xid: return m
    def dora(self):
        xid = '3a1fb207'
        self.log("DISCOVER  0.0.0.0:68 → 255.255.255.255:67")
        tx({'type': 'DISCOVER', 'chaddr': self.mac, 'xid': xid})
        o = self.recv_matching('OFFER', xid)
        self.log(f"OFFER {o['yiaddr']} ({o['siaddr']}) — REQUEST broadcast")
        tx({'type': 'REQUEST', 'chaddr': self.mac, 'xid': xid,
            'siaddr': o['siaddr'], 'yiaddr': o['yiaddr']})
        a = self.recv_matching('ACK', xid)
        self.log(f"BOUND  {a['yiaddr']}/24  router={a['opts']['router']} "
                 f"dns={a['opts']['dns']} lease={a['opts']['lease']}s")

if __name__ == '__main__':
    Server('alpha'); Server('beta')
    time.sleep(0.3)
    Client('aa:bb:cc:dd:ee:01').dora()
    time.sleep(0.3)

Output (server-race ভেদে alpha/beta বদলাতে পারে — বাস্তবের মতো):

[client]     DISCOVER  0.0.0.0:68 → 255.255.255.255:67
[alpha]      OFFER  192.168.1.101 → aa:bb:cc:dd:ee:01
[beta]       OFFER  192.168.1.101 → aa:bb:cc:dd:ee:01
[client]     OFFER 192.168.1.101 (alpha) — REQUEST broadcast
[alpha]      ACK    192.168.1.101 → aa:bb:cc:dd:ee:01
[client]     BOUND  192.168.1.101/24  router=192.168.1.1 ...

নিজে বাড়ান: (১) rogue-server (ভিন্ন gateway offer) যোগ করে দেখুন siaddr-match logic-ই একমাত্র রক্ষা; (২) T1 renewal — half-lease-এ ‘unicast’ simulation; (৩) pool-exhaustion handling — ৯৯ client নামান।

বাস্তব সিস্টেমে

DHCP যেখানে প্রতিদিন চুপচাপ চলে

Home routers। OpenWrt-এ dnsmasq, pfSense-এ dhcpd — বাসার রাউটারেই পূর্ণ DHCP server, reservation UI-সহ। ISP-রা CGNAT deployment-এও subscriber-কে private IP DHCP দিয়েই।

Enterprise। Microsoft DHCP, Infoblox, Cisco ip helper-address (relay agent!) — campus-এ এক central server, প্রতি floor-এ relay। VoIP phones option 66/150 দিয়ে call-server-এর address পায় — options না থাকলে desk-phone বুঝতই না কাকে ফোন দেবে। PXE boot (option 66/67) diskless machine-কে boot-image-এর ঠিকানাও দেয়।

Rogue DHCP incident — defensive lens। Conference/hotel network-এ attacker-laptop দ্রুত OFFER পাঠিয়ে gateway-DNS নিজের দিকে টেনে নেয়; victim-রা bank-site mirror-এ যায়। Defender-দের পাল্টা অস্ত্র DHCP snooping: switch port trusted/untrusted ভাগ করে untrusted-port-এর OFFER/ACK drop:

ip dhcp snooping
ip dhcp snooping vlan 10
interface gi0/1
 ip dhcp snooping trust     ← শুধু আসল server-এর port

IPv6-র RA Guard একই family — bootstrap protocol যত, spoofing-door তত।

Cloud। AWS VPC-র 169.254.169.254 metadata-service-ও DHCP-ই advertise করে। Bootstrap-protocol datacenter-এও একই কাজ: নতুন মেশিন, নতুন ঠিকানা, শূন্য hand-written config।

যে ভুলগুলো সবাই করে

“DHCP server আমার IP assign করে দেয় — permanent মালিকানা।”

না — lease, সময়-সীমিত ভাড়া; মেয়াদ শেষে ব্যবহারের অধিকার নেই, server IP অন্যকে দিতে পারে। কারণটা scarcity: বাসার রাউটারে ২৫৪ ঠিকানা, মাসে ৫০ ডিভাইস আসা-যাওয়া — permanent assignment হলে pool শেষ। আপনার phone বারবার একই IP পায় server-এর courtesy-তে (একই MAC → পুরনো lease মনে করে), অধিকার হিসেবে নয়।

“DORA-র প্রতিটা ধাপই broadcast হয়।”

প্রথম দুই ধাপ অনিবার্যভাবে broadcast (client-এর কোনো IP-ই নেই)। কিন্তু RENEWING-phase-এর REQUEST আর ACK unicast — দুই পক্ষেরই তখন বৈধ ঠিকানা। Broadcast কেবল zero-config মুহূর্তে, বা T2-তে old-server হারালে। Capture-তে তাই join-এ broadcast-ঝড়, পরে ঘণ্টায় দুইটা নিঃশব্দ unicast।

“DHCP শুধু IP দেয়।”

IP তো ছোট অংশ — নামের ‘Configuration’-ই আসল: mask, gateway, DNS, domain suffix, NTP, MTU, PXE boot-image, VoIP config — সব options-ই। Enterprise admin-রা DHCP-কে দেখেন options-distribution-system হিসেবে; IP দেওয়া by-product।

“WiFi connect মানেই সব ঠিক — DHCP fail বলে আলাদা কিছু নেই।”

উল্টো প্রায়ই সত্যি: WiFi association (link layer) সফল, DHCP fail — ফলে সেই বিখ্যাত APIPA/self-assigned অবস্থা (169.254.x.x): client অপেক্ষায় থাকতে থাকতে link-local ঠিকানা নিজেই নেয়, যা router পার করতে পারে না — ‘connected, no internet’ icon-এর জন্ম। Symptom দেখলে প্রথম সন্দেহ DHCP server (সাধারণত রাউটার)।

বুঝেছেন কি না দেখুন

1

Protocol-designer-রা যদি বাধ্য করতেন ‘আগে link-local temporary IP নাও, তারপর DHCP-তে যোগাযোগ করো’ — কোন সমস্যা সমাধান হতো, কোনটা নতুন জন্ম নিত?

যুক্তি

সমাধান: unicast-এর সব সুবিধা — reply সরাসরি আসে, broadcast-flag লাগে না। নতুন সমস্যা: temporary IP collision-free বেছে নিতে হয় — অর্থাৎ একটা mini-negotiation তো লাগবেই (APIPA ঠিক এটাই করে, fallback হিসেবে)। আর complexity: bootstrap-protocol-এর সৌন্দর্য তার minimal-assumption — শুধু MAC + broadcast দিয়েই পুরোটা চলে। Design lesson: weakest moment-এ (zero config) protocol ততটুকুই assume করতে পারে।

2

Lease ৮ ঘণ্টার network-এ T1 আর T2 কোন মুহূর্তে? T1-এ old server সাড়া না দিলে T2-এর আগে client কী করে — ঠিকানা ব্যবহার চালিয়ে যায়, নাকি থামে?

প্রয়োগ

T1 = ৪ ঘণ্টা, T2 = ৭ ঘণ্টা। T1-fail-এ client backoff-এ old-server-কেই retry করতে থাকে — কিন্তু ঠিকানা ব্যবহার চালু থাকে, lease তো বৈধ। T2-তে কৌশল switch: broadcast REQUEST, যে-কোনো server eligible। ৮ ঘণ্টা পূর্ণে ACK না এলে surrender → ব্যবহার বন্ধ → fresh DISCOVER। Graceful-degradation-এর তিন ধাপ।

3

Relay agent ছাড়া server কেন multi-subnet enterprise serve করতে পারে না? giaddr না থাকলে server ঠিক কোন তথ্যের অভাবে অসহায়?

যুক্তি

Broadcast router-পার হয় না — server শুধু নিজের subnet শোনে; মানে শতাধিক subnet = শতাধিক server। giaddr ছাড়া server জানত না client কোন subnet-এ: packet relay-র মাধ্যমে এসেছে, source-address = relay-এর — physical-location clue শূন্য। giaddr-ই proxy-of-location: ‘যে interface, সেই subnet-pool’। General pattern: intermediary-র পেছনে original-context preserve করতে explicit field (X-Forwarded-For-এর echo!)।

4

Cafe wifi hardening করছেন। Rogue-DHCP-র বিরুদ্ধে তিন স্তরের defense — switch feature, monitoring, client-side — সীমাবদ্ধতাসহ propose করুন। (Defensive framing: নিজের authorized network.)

ডিজাইন

Switch: DHCP snooping — untrusted access-port-এর OFFER/ACK drop; সীমা: cheap hardware-এ feature-ই নেই, misconfig-এ আসল server-ও blocked। Monitoring: spoof/starve detection — same-chaddr-হাজার-DISCOVER বা gateway-siaddr-change alert; সীমা: reactive — প্রথম victim-এর আগে না। Client: 802.1X (network-entry-র আগে credential) বা VPN-over-untrusted; সীমা: infra-cost, throughput। Defense-in-depth-ই উত্তর: একটাও perfect নয়, তিনটা মিলে খুব কঠিন target।

5

DORA-র চার ধাপ: sender কে, option 53 value কত?

স্মরণ

Discover (client→broadcast, 1) — server খোঁজা। Offer (server→client, 2) — proposed IP+options। Request (client→ broadcast, 3) — ‘এই server-এরটা নিলাম’ (বাকি-server notification সহ)। Ack (server→client, 5) — confirmed lease + full option-set। Sūtra: জিজ্ঞেস, প্রস্তাব, সম্মতি, সিলমোহর।

এরপর কী

এরপর কী

Network-এ পা রাখলেন — ঠিকানা, gateway, DNS সব পকেটে। এখন browser-এ https:// লেখা মাত্র padlock-এর পিছনে crypto-নাটক শুরু হয়: TLS handshake — certificate-chain যাচাই, key-exchange, সব এক round-trip- এ। পরের লেসনে প্রতিটা দৃশ্য packet-level-এ খুলব, আর দেখব TLS 1.3 কীভাবে দুই round-trip-কে একটায় নামাল।

আরও পড়ুন

  • RFC 2131 — Dynamic Host Configuration Protocol — R. Droms · DHCP-র মূল specification — DORA exchange, lease timer (T1/T2), relay agent behavior সব এখানেই
  • RFC 2132 — DHCP Options and BOOTP Vendor Extensions — S. Alexander, R. Droms · Options field-এর পূর্ণ তালিকা — router, DNS, lease-time, MTU option নম্বরগুলো এখান থেকে
  • TCP/IP Illustrated, Volume 1 (2nd Edition), Chapter 6 — DHCP — Kevin R. Fall, Richard W. Stevens · Packet-level trace আর timing diagram-এর প্রামাণ্য উৎস