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

Software-defined networking আর NFV

Software-Defined Networking and NFV — OpenFlow, Controllers, Programmable Data Planes, SD-WAN, VNFs and Service Chains

Taught in Bangla, this lesson explains software-defined networking and NFV: why closed boxes limit networks, SDN's core ideas and architecture, OpenFlow flow tables, messages and table-miss, controller path computation with Dijkstra and link-failure handling, match-plus-action and P4 programmable data planes, SDN in practice with B4 and SD-WAN, network function virtualisation and service chains, cloud-native 5G cores and network automation.

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

  • প্রচলিত “বাক্সে বন্দি” নেটওয়ার্কের কোন সমস্যা থেকে SDN এলো, আর তার চারটি মূল ধারণা
  • SDN-এর স্থাপত্য — southbound API, controller, northbound API আর network application
  • OpenFlow-এর flow table, timeout, counter আর PACKET_IN / FLOW_MOD / PACKET_OUT বার্তা; proactive বনাম reactive নিয়ম
  • Controller কীভাবে Dijkstra দিয়ে পথ হিসাব করে নিয়ম বসায় আর link নষ্ট হলে নতুন পথ বানায় — নিজে simulator চালিয়ে
  • NFV, ETSI-র VNF / NFVI / MANO কাঠামো, service function chaining, CNF আর 5G-র service-based core, আর intent-based networking ও automation

১ · সমস্যা — বাক্সে বন্দি নেটওয়ার্ক

পর্ব ১৫-এ দেখেছেন, প্রতিটি router-এর ভেতরে দুটি কাজ: forwarding (প্রতিটি packet-কে টেবিল দেখে সঠিক port-এ পাঠানো) আর routing (পুরো নেটওয়ার্ক মিলিয়ে সেই টেবিল বানানো)। প্রচলিত নেটওয়ার্কে এই দুটি কাজ একই বাক্সে, একই কোম্পানির বানানো hardware আর software-এ। মডিউল ৪-এর OSPF আর BGP প্রতিটি router-এ আলাদাভাবে চলে, প্রতিবেশীদের সাথে কথা বলে, আর প্রত্যেকে নিজে নিজের টেবিল হিসাব করে। এই নকশা ইন্টারনেটকে টিকিয়ে রেখেছে কয়েক দশক। তবু বড় নেটওয়ার্ক চালানো প্রকৌশলীরা ২০০০-এর দশকে কয়েকটি সমস্যায় আটকে যাচ্ছিলেন।

ঢাকার প্রতিটি মোড়ে একজন ট্রাফিক পুলিশ, আর প্রত্যেকে শুধু পাশের মোড়ের পুলিশের কাছে শুনে ঠিক করেন কোন দিকে গাড়ি ছাড়বেন। কোথাও বড় দুর্ঘটনা হলে খবর মোড় থেকে মোড়ে ছড়ায়, সবাই নিজের মতো সিদ্ধান্ত নেন। এখন ভাবুন একটি কেন্দ্রীয় ট্রাফিক নিয়ন্ত্রণ কক্ষ, যার পর্দায় পুরো শহরের CCTV আর প্রতিটি সিগন্যাল বাতি দূর থেকে বদলানোর ক্ষমতা। মোড়ের বাতি শুধু নির্দেশ মানে — লাল, সবুজ, ডানে ঘোরা। মোড়ের বাতি হলো data plane, নিয়ন্ত্রণ কক্ষ হলো SDN controller. নিয়ন্ত্রণ কক্ষ পুরো শহর একসাথে দেখে বলে সিদ্ধান্ত ভালো হয় — কিন্তু সেই কক্ষ অচল হলে কী হবে, সেটিও আগে থেকে ভাবতে হয়।

প্রচলিত নেটওয়ার্কের পাঁচটি ব্যথা

সমস্যাবাস্তবে কেমন দেখায়SDN-এর উত্তর
উল্লম্বভাবে জোড়া বাক্স (vertical integration)Chip, OS, routing software আর CLI — সব এক vendor-এর; একটি বদলাতে চাইলে পুরো বাক্স বদলাতে হয়খোলা southbound API: যেকোনো controller যেকোনো মানসম্মত switch চালাতে পারে
প্রতিটি যন্ত্রে আলাদা CLI কনফিগারেশননতুন একটি VLAN বা ACL ২০০টি switch-এ হাতে হাতে বসানো; একটি টাইপের ভুলে পুরো শাখা অফলাইননীতি একবার লেখা হয় controller-এ; সে সব যন্ত্রে নিয়ম বসায়
ধীর উদ্ভাবননতুন একটি routing ধারণা পরীক্ষা করতে vendor-এর পরের software সংস্করণের জন্য বছরের পর বছর অপেক্ষানতুন বৈশিষ্ট্য = controller-এ নতুন application, সাধারণ software-এর মতো
বিতরণকৃত protocol বোঝা কঠিনশত শত router নিজের মতো হিসাব করে; একটি বদলের পর convergence-এর সময় ক্ষণস্থায়ী loop বা black hole (পর্ব ২৩–২৪) — কেন ঘটল তা বোঝা কঠিনপুরো topology এক জায়গায়; পথের হিসাব একটি সাধারণ graph algorithm
Middlebox-এর ভিড়Firewall, NAT, load balancer, IDS, WAN optimizer — প্রতিটি আলাদা বাক্স, আলাদা vendor, আলাদা দক্ষতা; অনেক প্রতিষ্ঠানে router-এর সমান বা বেশিMatch-plus-action-এ অনেক আচরণ এক কাঠামোয়; বাকিগুলো NFV-তে software

কীভাবে এলো SDN: ২০০৫ সালের দিকে কয়েকজন গবেষকের “4D” প্রকল্প (A Clean Slate 4D Approach to Network Control and Management) প্রস্তাব দেয় — নেটওয়ার্কের সিদ্ধান্ত নেওয়ার অংশকে packet পাঠানোর অংশ থেকে আলাদা করে কেন্দ্রীয় একটি “decision plane”-এ রাখা হোক। ২০০৭ সালের SIGCOMM-এ Stanford-এর Martin Casado ও সহকর্মীদের Ethane দেখায়, একটি কেন্দ্রীয় controller পুরো প্রতিষ্ঠানের নিরাপত্তা-নীতি ঠিক করতে পারে, আর সাধারণ switch শুধু তার বসানো flow নিয়ম মেনে চলে। এর পরের বছর, ২০০৮ সালে, Nick McKeown-সহ কয়েকজনের ছোট প্রবন্ধ “OpenFlow: Enabling Innovation in Campus Networks” একটি খোলা protocol-এর প্রস্তাব দেয়, যাতে গবেষকেরা বাণিজ্যিক switch-এর flow table বাইরে থেকে লিখতে পারেন। ২০১১ সালে কয়েকটি বড় প্রযুক্তি ও টেলিকম কোম্পানি মিলে Open Networking Foundation (ONF) গঠন করে, যা OpenFlow-এর মান রক্ষা করে। খেয়াল করুন: OpenFlow কোনো IETF RFC নয়, ONF-এর specification. আর “SDN” শব্দটি এই সময়েই জনপ্রিয় হয়।

২ · SDN-এর চারটি মূল ধারণা আর স্থাপত্য

বিভিন্ন বই আর গবেষণাপত্র SDN-কে একটু আলাদাভাবে সংজ্ঞায়িত করে, কিন্তু প্রায় সবাই এই চারটি ধারণায় একমত:

১. Flow-ভিত্তিক forwarding

Switch শুধু গন্তব্য IP বা MAC দেখে না; header-এর অনেক ঘর (port, ঠিকানা, VLAN, protocol) মিলিয়ে কাজ করে — match-plus-action. পর্ব ১৫-এ যার নাম দিয়েছিলাম generalised forwarding.

অনেক ঘর মিলিয়ে সিদ্ধান্ত

২. Data plane আর control plane আলাদা

Switch-এর hardware শুধু টেবিল মানে। টেবিল কী হবে, সেই হিসাব আলাদা সার্ভারে চলে — আলাদা নেটওয়ার্ক বা আলাদা সংযোগ দিয়ে যুক্ত।

হাত আর মস্তিষ্ক আলাদা

৩. নিয়ন্ত্রণ switch-এর বাইরে, যৌক্তিকভাবে কেন্দ্রে

Controller পুরো নেটওয়ার্কের ছবি রাখে। বাস্তবে এটি কয়েকটি সার্ভারের একটি দল — নির্ভরযোগ্যতার জন্য প্রতিলিপি — তাই “যৌক্তিকভাবে” কেন্দ্রীভূত, ভৌতভাবে নয়।

এক জায়গা থেকে পুরো ছবি

৪. প্রোগ্রাম করা যায় এমন নেটওয়ার্ক

Routing, firewall, load balancing, traffic engineering — প্রতিটি controller-এর ওপর চলা একটি application. নতুন নীতি মানে নতুন কোড, নতুন বাক্স নয়।

নেটওয়ার্ক = software

স্থাপত্য — তিন স্তর, দুই API

 ┌──────────────────────────────────────────────────────────┐
 │  Network applications: routing │ firewall │ LB │ TE │ ... │
 └──────────────────────────┬───────────────────────────────┘
          northbound API (REST/gRPC, intent) ▲▼
 ┌──────────────────────────┴───────────────────────────────┐
 │  SDN controller (replicated: C1 C2 C3)                   │
 │  topology graph │ host table │ flow rules │ statistics   │
 └──────────────────────────┬───────────────────────────────┘
   southbound API (OpenFlow, P4Runtime, NETCONF/gNMI) ▲▼
 ┌────────┐      ┌────────┐      ┌────────┐      ┌────────┐
 │ switch │──────│ switch │──────│ switch │──────│ switch │
 │ flow   │      │ flow   │      │ flow   │      │ flow   │
 │ table  │      │ table  │      │ table  │      │ table  │
 └────────┘      └────────┘      └────────┘      └────────┘
 ◀───────────── data plane: packets never visit the controller
                (except PACKET_IN) ─────────────────────────▶
  • Southbound API — controller আর switch-এর মাঝের ভাষা। সবচেয়ে পরিচিত OpenFlow (সাধারণত TCP port 6653-এ, নিরাপত্তার জন্য TLS-এর ওপর)। P4 দিয়ে বানানো data plane-এর জন্য P4Runtime; আর কনফিগারেশন ও অবস্থা পড়ার জন্য NETCONF (RFC 6241) বা gRPC-ভিত্তিক gNMI, যারা YANG মডেলে লেখা ডেটা বিনিময় করে।
  • Controller — নেটওয়ার্কের “operating system”. Switch-এর সাথে সংযোগ রাখে, LLDP জাতীয় বার্তা পাঠিয়ে কোন switch-এর কোন port কোথায় যুক্ত তা খুঁজে topology graph বানায়, host-দের অবস্থান মনে রাখে, counter জমায়। মুক্ত-উৎসের পরিচিত controller-এর মধ্যে আছে ONOS আর OpenDaylight (দুটিই ২০১৩–২০১৪ সালের দিকে শুরু, বড় নেটওয়ার্কের জন্য নকশা করা), আর শেখার জন্য Python-এর ছোট controller যেমন Ryu বা POX. বাণিজ্যিক নেটওয়ার্কে প্রায়ই vendor-এর নিজস্ব controller.
  • Northbound API — application আর controller-এর মাঝের ভাষা; সাধারণত REST বা gRPC. এখানে application বলে “h1 থেকে h2-তে একটি পথ চাই” বা “এই subnet থেকে port 23 বন্ধ”, আর controller সেটিকে প্রতিটি switch-এর নিয়মে অনুবাদ করে।
  • Application — shortest-path routing, firewall, load balancer, traffic engineering, নজরদারি। একই নেটওয়ার্কে কয়েকটি application একসাথে চললে তাদের নিয়মে সংঘাত হতে পারে — controller-কে সেটিও সামলাতে হয়।
মূল ধারণা

SDN-এ controller packet-এর পথে থাকে না, টেবিলের পথে থাকে। প্রায় সব packet switch-এর hardware-এ টেবিল দেখে পার হয়; controller শুধু টেবিল লেখে আর ব্যতিক্রম (table-miss) সামলায়। “সব packet controller দিয়ে যায়” — এটি SDN নিয়ে সবচেয়ে প্রচলিত ভুল ধারণা।

৩ · OpenFlow-এর ভেতরে — flow table, বার্তা আর table-miss

OpenFlow-ধাঁচের switch-এর হৃদয় তার flow table. প্রতিটি সারিকে বলে flow entry, আর তাতে থাকে:

অংশকী রাখেউদাহরণ
Match fieldsকোন packet এই সারির: in_port, Ethernet (উৎস/গন্তব্য MAC, EtherType), VLAN id, IP (উৎস/গন্তব্য, prefix-সহ), IP protocol, TCP/UDP port. যে ঘর লেখা নেই তা wildcard — যা-ই হোক মেলেip_proto=tcp, tp_dst=23
Priorityএকাধিক সারি মিললে বড় সংখ্যার সারি জেতে৩০০
Countersকতগুলো packet আর কত byte মিলেছে, সারিটি কতক্ষণ আছে২ packet / ১২০ byte
Actions / instructionsForward (একটি port, সব port বা flood), drop, ঘর বদল (set-field: VLAN, MAC, IP), TTL কমানো, controller-কে পাঠানো, পরের টেবিলে যাওয়াoutput:2, drop
Timeoutsidle timeout: এতক্ষণ কোনো packet না মিললে সারি মুছে যায়; hard timeout: যা-ই হোক এতক্ষণ পরে মুছে যায়idle ১০ s, hard ৩০০ s
CookieController-এর নিজের চিহ্ন — কোন application সারিটি বসিয়েছে0x53

আধুনিক OpenFlow-এ (১.৩ সংস্করণ, যা সবচেয়ে বেশি ব্যবহৃত বলে ধরা হয়) একাধিক টেবিলের একটি pipeline থাকে, আর goto-table দিয়ে packet এক টেবিল থেকে আরেক টেবিলে যায় — যেমন প্রথম টেবিলে ACL, দ্বিতীয়টিতে MAC, তৃতীয়টিতে IP. সাথে আছে group table, যেখানে একটি “fast-failover” group-এ কয়েকটি বিকল্প port রাখা যায় — প্রথমটি নষ্ট হলে switch নিজেই দ্বিতীয়টি নেয়, controller-কে জিজ্ঞেস না করে।

Controller আর switch-এর কথোপকথন

বার্তাদিককাজ
HELLO, FEATURES_REQUEST/REPLYদুই দিকেসংযোগ শুরু, সংস্করণ মেলানো, switch-এর id আর ক্ষমতা জানা
PACKET_INswitch → controller“এই packet নিয়ে কী করব?” — table-miss বা কোনো নিয়মের action যদি controller-এ পাঠাতে বলে। Packet-এর header (বা পুরো packet) আর কোন port-এ এসেছে তা থাকে
FLOW_MODcontroller → switchFlow table-এ সারি যোগ (ADD), বদল (MODIFY) বা মোছা (DELETE)
PACKET_OUTcontroller → switchএকটি নির্দিষ্ট packet নির্দিষ্ট port দিয়ে পাঠানো — যেমন আটকে রাখা প্রথম packet, বা LLDP-র মতো controller-এর নিজের বানানো packet
PORT_STATUSswitch → controllerকোনো port চালু বা বন্ধ হলো — link failure-এর খবর
FLOW_REMOVED, STATSswitch → controllerTimeout-এ সারি মুছে গেল; counter-এর হিসাব
BARRIERদুই দিকেআগের সব বার্তা শেষ হয়েছে কি না নিশ্চিত হওয়া — নিয়ম বসানোর ক্রম ঠিক রাখতে

Table-miss: কোনো সারি না মিললে কী হবে? OpenFlow ১.৩-এ এর জন্য একটি বিশেষ সারি রাখা হয় — priority ০, সব ঘর wildcard, action “controller-এ পাঠানো”। এই সারি না থাকলে ১.৩-এ ডিফল্ট আচরণ packet ফেলে দেওয়া (পুরোনো ১.০-তে ডিফল্ট ছিল controller-এ পাঠানো)। তাই সংযোগের শুরুতেই controller সাধারণত এই table-miss সারিটি বসিয়ে দেয়।

নিচের simulator একটি ছোট OpenFlow-ধাঁচের switch: পাঁচটি সারি, ছয়টি packet. যে ঘর m-এ নেই তা wildcard; IP-র ক্ষেত্রে prefix মেলানো হয় (পর্ব ১৫-এর মতো mask দিয়ে)। প্রতিটি packet-এর জন্য ছাপা হয় কোন কোন সারি মিলল, কোনটি জিতল, আর শেষে প্রতিটি সারির counter.

// A tiny OpenFlow-style switch. A field missing from "m" is a wildcard (matches anything).
const table = [
  { id: "F1", prio: 300, m: { ip_proto: "tcp", tp_dst: 23 },        act: "drop" },
  { id: "F2", prio: 200, m: { ipv4_dst: "10.0.2.0/24" },             act: "output:2" },
  { id: "F3", prio: 100, m: { in_port: 1, eth_type: "arp" },          act: "flood" },
  { id: "F4", prio: 50,  m: { ipv4_dst: "10.0.0.0/16", tp_dst: 80 },  act: "set_field:vlan_vid=20, output:3" },
  { id: "MISS", prio: 0, m: {},                                       act: "CONTROLLER (packet-in)" },
].map(e => ({ ...e, pkts: 0, bytes: 0 }));
const ip = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0);
function fieldOk(k, want, pkt) {
  if (pkt[k] === undefined) return false;
  if (k === "ipv4_dst") {
    const [net, len] = want.split("/"), mask = len == 0 ? 0 : (0xffffffff << (32 - len)) >>> 0;
    return ((ip(pkt[k]) & mask) >>> 0) === ((ip(net) & mask) >>> 0);
  }
  return pkt[k] === want;
}
function handle(pkt) {
  const hits = table.filter(e => Object.entries(e.m).every(([k, v]) => fieldOk(k, v, pkt)));
  const e = hits.reduce((a, b) => (b.prio > a.prio ? b : a));   // highest priority wins
  e.pkts += 1; e.bytes += pkt.len;
  const what = pkt.eth_type === "arp" ? "ARP" : `${pkt.ip_proto} ->${pkt.ipv4_dst}:${pkt.tp_dst}`;
  console.log(`in:${pkt.in_port} ${what.padEnd(22)} hits=${hits.map(h => h.id).join(",").padEnd(10)} => ${e.id}: ${e.act}`);
}
[ { in_port: 1, eth_type: "ip", ip_proto: "tcp", ipv4_dst: "10.0.2.9", tp_dst: 23, len: 60 },
  { in_port: 1, eth_type: "ip", ip_proto: "tcp", ipv4_dst: "10.0.2.9", tp_dst: 443, len: 1500 },
  { in_port: 1, eth_type: "arp", len: 42 },
  { in_port: 3, eth_type: "ip", ip_proto: "tcp", ipv4_dst: "10.0.7.7", tp_dst: 80, len: 800 },
  { in_port: 2, eth_type: "ip", ip_proto: "udp", ipv4_dst: "192.0.2.8", tp_dst: 53, len: 70 },
  { in_port: 4, eth_type: "ip", ip_proto: "tcp", ipv4_dst: "10.0.9.1", tp_dst: 23, len: 60 },
].forEach(handle);
console.log("counters: " + table.map(e => `${e.id}=${e.pkts}pkt/${e.bytes}B`).join("  "));

আউটপুট:

in:1 tcp ->10.0.2.9:23      hits=F1,F2,MISS => F1: drop
in:1 tcp ->10.0.2.9:443     hits=F2,MISS    => F2: output:2
in:1 ARP                    hits=F3,MISS    => F3: flood
in:3 tcp ->10.0.7.7:80      hits=F4,MISS    => F4: set_field:vlan_vid=20, output:3
in:2 udp ->192.0.2.8:53     hits=MISS       => MISS: CONTROLLER (packet-in)
in:4 tcp ->10.0.9.1:23      hits=F1,MISS    => F1: drop
counters: F1=2pkt/120B  F2=1pkt/1500B  F3=1pkt/42B  F4=1pkt/800B  MISS=1pkt/70B

প্রথম লাইন: 10.0.2.9-এর port 23-এর (Telnet) packet তিনটি সারির সাথে মেলে — F1 (port 23), F2 (গন্তব্য 10.0.2.0/24-এর ভেতরে) আর MISS (সব মেলে)। জেতে সবচেয়ে বড় priority, F1 → drop. একই গন্তব্যে port 443 গেলে F1 মেলে না, তাই F2 → port 2. এখানে নিয়মের ক্রম নয়, priority ঠিক করে কে জিতবে। চতুর্থ লাইন: F4 মেলে কারণ 10.0.7.7 আছে 10.0.0.0/16-এর ভেতরে আর port 80; action দুটি — VLAN id 20 বসানো, তারপর port 3. পঞ্চম লাইন: DNS-এর UDP packet-এর সাথে শুধু MISS মেলে — table-miss, তাই controller-এর কাছে PACKET_IN যাবে। শেষ লাইন: F1-এর counter ২ packet, ১২০ byte — দুটি Telnet চেষ্টা আটকানো হয়েছে, কোন port-এ এসেছে তা বিবেচ্য ছিল না (in_port wildcard).

বাস্তব OpenFlow-এ একটি নিয়ম আছে যা এই খেলনায় নেই: TCP port মেলাতে হলে আগে eth_type=IPv4 আর ip_proto=TCP-ও মেলাতে হয় (prerequisite); নইলে switch সারিটি গ্রহণ করে না। নিজে চেষ্টা করুন: F4-এর priority 50 থেকে 250 করলে চতুর্থ লাইনের ফল কি বদলাবে? (ইঙ্গিত: 10.0.7.7 কি 10.0.2.0/24-এর ভেতরে?)

Proactive না reactive — নিয়ম কখন বসবে

Proactive — আগেভাগে

Controller topology জেনেই সব গন্তব্যের নিয়ম আগে থেকে বসিয়ে রাখে। প্রথম packet-এও কোনো অপেক্ষা নেই, controller অচল হলেও পুরোনো নিয়মে traffic চলে। দাম: যে নিয়ম কখনো লাগবে না সেটিও TCAM-এ জায়গা নেয়; তাই নিয়ম হয় মোটা দাগের (গন্তব্য prefix ধরে)।

data center আর WAN-এ প্রচলিত

Reactive — দরকার হলে

নতুন flow-এর প্রথম packet table-miss-এ controller-এ যায়, তখন নিয়ম বসে। খুব সূক্ষ্ম নীতি সম্ভব (প্রতিটি ব্যবহারকারী, প্রতিটি সংযোগ), আর idle timeout-এ অব্যবহৃত নিয়ম মুছে TCAM বাঁচে। দাম: প্রতিটি নতুন flow-এর প্রথম packet-এ বাড়তি delay, আর অনেক নতুন flow এলে controller-এ চাপ।

Ethane-ধাঁচের নিরাপত্তা-নীতি

হিসাব ১ — controller-এর চাপ: একটি ক্যাম্পাসে ৫০টি edge switch, প্রতিটিতে গড়ে প্রতি সেকেন্ডে ২,০০০টি নতুন flow (প্রতিটি নতুন TCP সংযোগ, DNS প্রশ্ন ইত্যাদি)। পুরো reactive নকশায় controller পায় ৫০ × ২,০০০ = ১,০০,০০০ PACKET_IN প্রতি সেকেন্ডে. ধরুন (উদাহরণের জন্য) একটি controller সার্ভার প্রতি সেকেন্ডে ৫০,০০০ PACKET_IN সামলাতে পারে। তাহলে পুরো ক্ষমতায় চালাতেও ২টি সার্ভার লাগে; অর্ধেক ক্ষমতায় চালাতে চাইলে (ঝাপটা আর একটি সার্ভার নষ্ট হওয়ার জন্য জায়গা রেখে) ৪টি। আর ঝাপটার সময় — সকাল ৯টায় সবাই একসাথে লগইন করলে — সংখ্যাটি কয়েক গুণ হতে পারে।

হিসাব ২ — TCAM-এর সীমা: একটি data center-এ ৩০০টি host. প্রতিটি (উৎস, গন্তব্য) জোড়ার জন্য আলাদা নিখুঁত নিয়ম রাখলে জোড়া = ৩০০ × ২৯৯ = ৮৯,৭০০টি নিয়ম। শুধু গন্তব্য ধরে নিয়ম রাখলে (উৎস wildcard) লাগে মাত্র ৩০০টি। ধরুন switch-এর TCAM-এ ২,০০০টি সারির জায়গা — প্রথম নকশা কখনো আঁটবে না, দ্বিতীয়টি আরামে আঁটে। Wildcard ঠিক এই কারণেই মূল্যবান (TCAM কেন সীমিত আর দামি, পর্ব ১৫)।

বাস্তবে মিশ্র নকশা: প্রায় সব বড় SDN নেটওয়ার্ক মৌলিক connectivity proactive রাখে, আর শুধু ব্যতিক্রম (নতুন নিরাপত্তা-নীতি, সন্দেহজনক traffic-কে আলাদা পথে পাঠানো) reactive. “প্রতিটি নতুন flow controller-এ যাবে” — এই খাঁটি নকশা ছোট ল্যাবে চলে, বড় নেটওয়ার্কে খুব কমই।

৪ · Controller-এর হাতে পথ — প্রথম packet, Dijkstra আর link failure

এবার একটি ছোট নেটওয়ার্ক: পাঁচটি switch, সাতটি link, প্রতিটি link-এর একটি cost. Host h1 (10.0.1.1) যুক্ত S1-এ, host h2 (10.0.4.2) যুক্ত S4-এ। Controller LLDP দিয়ে পুরো topology আগেই জানে, কিন্তু কোনো switch-এ h2-এর জন্য নিয়ম নেই — reactive নকশা।

            1          1
   h1 ── S1 ─────── S2 ─────── S4 ── h2
          │        ╱           │ ╲
        1 │     1 ╱          3 │  ╲ 1
          │      ╱             │   ╲
          S3 ──────────────────┘    S5
           ╲__________1_____________╱
   links: S1-S2 1, S2-S4 1, S1-S3 1, S2-S3 1, S3-S4 3, S3-S5 1, S5-S4 1
  1. h1 → S1dst 10.0.4.2table-miss
  2. PACKET_INS1 → controllerin_port 1
  3. DijkstraS1>S2>S4cost 2
  4. FLOW_MODS4, S2, তারপর S1দূর থেকে কাছে
  5. PACKET_OUTS1 → S2আটকে রাখা packet
Switch-এর টেবিল (h2 = 10.0.4.2-এর সারি) আর packet
এই ধাপের ঘটনা
S1
S2
S4
Packet কোথায়
মোট PACKET_IN
  1. প্রথম packet, কোনো নিয়ম নেই। h1 একটি নতুন TCP সংযোগ শুরু করল (SYN, গন্তব্য 10.0.4.2:443). S1-এর টেবিলে শুধু table-miss সারি — priority ০, সব wildcard. তাই এই সারিই জিতল।
  2. PACKET_IN. S1 packet-টি নিজের buffer-এ রেখে controller-কে পাঠাল header, buffer-এর নম্বর আর in_port (১)। OpenFlow ১.৩-এ ডিফল্টভাবে packet-এর শুরুর ১২৮ byte পাঠানো হয় — পথ ঠিক করতে header-ই যথেষ্ট।
  3. পথের হিসাব। Controller-এর routing application জানে h2 আছে S4-এ। Topology graph-এ S1 থেকে Dijkstra (পর্ব ২৪): S2 আর S3 দূরত্ব ১-এ, তারপর S4 দূরত্ব ২-এ S2 হয়ে। পথ S1 > S2 > S4, cost ২।
  4. দূরের switch আগে। Controller প্রথমে S4 আর S2-তে নিয়ম পাঠায়। কেন? S1-এ আগে নিয়ম বসলে পরের packet S2-তে গিয়ে আবার table-miss করত — আরেকটি অকারণ PACKET_IN. চাইলে এখানে BARRIER দিয়ে নিশ্চিত করা হয় যে নিয়ম সত্যিই বসেছে।
  5. শেষে ingress switch. এবার S1-এ নিয়ম: গন্তব্য 10.0.4.2 → S2-এর দিকের port. এখন থেকে পথের প্রতিটি switch জানে কী করতে হবে।
  6. PACKET_OUT. S1-এর buffer-এ আটকে থাকা প্রথম packet-টি controller-এর নির্দেশে S2-এর দিকে গেল। S2 আর S4-এ নিয়ম মিলল (counter ১), কিন্তু S1-এর counter ০ — কারণ packet-out সরাসরি port-এ পাঠিয়েছে, টেবিল দিয়ে নয়।
  7. দ্বিতীয় packet — controller নেই। একই flow-এর পরের packet S1-এর নতুন সারিতে মিলল, তারপর S2, S4 — পুরো পথ hardware-এ। PACKET_IN-এর সংখ্যা এখনো ১। Controller শুধু প্রথম packet-এ বাড়তি delay যোগ করেছে।

এই পুরো যুক্তি এবার কোডে। Controller application একটি সাধারণ JavaScript প্রোগ্রাম: dijkstra() পর্ব ২৪-এর algorithm (প্রতি ধাপে বাকি node-গুলোর মধ্যে সবচেয়ে কাছেরটি চূড়ান্ত), installPath() দূরের switch থেকে শুরু করে FLOW_MOD পাঠায়, আর send() হলো data plane — শুধু টেবিল দেখে hop থেকে hop. তিনটি packet পাঠানোর পর S2-S4 link নষ্ট হয়।

// SDN controller app: on packet-in run Dijkstra and install flow-mods; reroute on link-down.
const links = { "S1-S2": 1, "S2-S4": 1, "S1-S3": 1, "S3-S4": 3, "S2-S3": 1, "S3-S5": 1, "S5-S4": 1 };
const hostAt = { h1: "S1", h2: "S4" }, flows = {};  let pktIns = 0;   // flows[sw][dst] = next hop
const nbrs = u => Object.entries(links).filter(([k]) => k.split("-").includes(u))
  .map(([k, c]) => [k.split("-").find(x => x !== u), c]);
function dijkstra(src, dst) {
  const dist = { [src]: 0 }, prev = {}, done = new Set();
  for (let u = src; u && u !== dst; u = Object.keys(dist).filter(x => !done.has(x)).sort((a, b) => dist[a] - dist[b])[0]) {
    done.add(u);
    for (const [v, c] of nbrs(u)) if (!(v in dist) || dist[u] + c < dist[v]) { dist[v] = dist[u] + c; prev[v] = u; }
  }
  const path = [dst]; while (path[0] !== src) path.unshift(prev[path[0]]);
  return { path, cost: dist[dst] };
}
function installPath(dst) {                                 // controller: compute, then program switches
  const { path, cost } = dijkstra("S1", hostAt[dst]);
  console.log(`  controller: Dijkstra ${path.join(" > ")} (cost ${cost})`);
  for (let i = path.length - 1; i >= 0; i--) {              // far end first, ingress switch last
    const sw = path[i], out = i === path.length - 1 ? dst : path[i + 1], t = (flows[sw] ||= {});
    if (t[dst] === out) { console.log(`  ${sw}: rule already correct, no FLOW_MOD`); continue; }
    console.log(`  FLOW_MOD ${(t[dst] ? "MODIFY" : "ADD").padEnd(6)} ${sw}: ipv4_dst=${dst} => output:to-${out}`); t[dst] = out;
  }
  for (const sw in flows) if (!path.includes(sw) && flows[sw][dst]) {
    delete flows[sw][dst]; console.log(`  FLOW_MOD DELETE ${sw}: stale rule for ${dst}`);
  }
}
function send(dst) {                                        // data plane: switches follow their tables
  let sw = "S1"; const hops = [sw];
  while (flows[sw]?.[dst] && flows[sw][dst] !== dst) hops.push(sw = flows[sw][dst]);
  if (flows[sw]?.[dst]) return console.log(`h1->${dst}: ${hops.join(" > ")} > ${dst}  (packet-ins so far: ${pktIns})`);
  console.log(`h1->${dst}: table-miss at ${sw} -> PACKET_IN #${++pktIns}`);
  installPath(dst); console.log(`  PACKET_OUT ${sw}: release the held packet`);
}
send("h2"); send("h2"); send("h2");
console.log("EVENT: PORT_STATUS - link S2-S4 is down"); delete links["S2-S4"]; installPath("h2"); send("h2");

আউটপুট:

h1->h2: table-miss at S1 -> PACKET_IN #1
  controller: Dijkstra S1 > S2 > S4 (cost 2)
  FLOW_MOD ADD    S4: ipv4_dst=h2 => output:to-h2
  FLOW_MOD ADD    S2: ipv4_dst=h2 => output:to-S4
  FLOW_MOD ADD    S1: ipv4_dst=h2 => output:to-S2
  PACKET_OUT S1: release the held packet
h1->h2: S1 > S2 > S4 > h2  (packet-ins so far: 1)
h1->h2: S1 > S2 > S4 > h2  (packet-ins so far: 1)
EVENT: PORT_STATUS - link S2-S4 is down
  controller: Dijkstra S1 > S3 > S5 > S4 (cost 3)
  S4: rule already correct, no FLOW_MOD
  FLOW_MOD ADD    S5: ipv4_dst=h2 => output:to-S4
  FLOW_MOD ADD    S3: ipv4_dst=h2 => output:to-S5
  FLOW_MOD MODIFY S1: ipv4_dst=h2 => output:to-S3
  FLOW_MOD DELETE S2: stale rule for h2
h1->h2: S1 > S3 > S5 > S4 > h2  (packet-ins so far: 1)

প্রথম অংশ ঠিক stepper-এর গল্প: একটি PACKET_IN, তিনটি FLOW_MOD (S4 → S2 → S1 ক্রমে), একটি PACKET_OUT. পরের দুটি packet সরাসরি data plane-এ — PACKET_IN-এর সংখ্যা ১-এই থেমে আছে। Link নষ্টের পর controller নিজে থেকেই (কোনো packet-এর অপেক্ষা না করে) পথ নতুন করে হিসাব করল: S1 > S3 > S5 > S4, cost ৩। লক্ষ করুন সরাসরি S3-S4 (cost ৩) নেওয়া পথ S1 > S3 > S4-এর cost ১ + ৩ = ৪, তাই S5 হয়ে ঘুরপথটি সস্তা। S4-এর নিয়ম একই থাকায় কোনো বার্তা লাগল না; S5 আর S3-এ নতুন নিয়ম আগে, তারপর S1-এ MODIFY — এই মুহূর্তে traffic নতুন পথে ঘুরল — আর শেষে S2-এর পুরোনো, অর্থহীন নিয়ম মুছে ফেলা। নতুন পথ তৈরি হওয়ার আগে পুরোনোটি ভাঙা হয়নি (make-before-break), আর পুরো সময়ে PACKET_IN একটিও বাড়েনি।

h2-এর জন্য প্রতিটি switch-এর নিয়ম আর traffic
পথ
Dijkstra-র দূরত্ব
S1
S2
S3
S5
S4
h1 → h2 traffic
  1. স্বাভাবিক অবস্থা। আগের stepper-এর শেষ অবস্থা: S1 → S2 → S4 → h2, cost ২। সব traffic hardware-এ।
  2. S2-S4 link কেটে গেল। S2-এর port-এ সংকেত নেই (কেউ fiber কেটেছে, বা transceiver নষ্ট)। কিন্তু S2-এর টেবিল এখনো বলছে “S4-এর দিকে পাঠানো” — packet সেই মৃত port-এ গিয়ে হারাচ্ছে। একে বলে black hole.
  3. PORT_STATUS. S2 controller-কে জানাল port বন্ধ। Controller topology graph থেকে S2-S4 edge মুছে দিল। (Link-এর অন্য প্রান্ত S4-ও একই খবর পাঠায়।)
  4. Dijkstra আবার। S1 থেকে: প্রথমে S1 (০); তারপর S2 আর S3 (১); S2 থেকে S4-এ আর যাওয়া যায় না; S3 থেকে S5 (২) আর S4 (১ + ৩ = ৪); S5 থেকে S4 (২ + ১ = ৩) — ৪-এর চেয়ে ছোট, তাই S4 চূড়ান্ত ৩-এ। পথ S1 > S3 > S5 > S4.
  5. নতুন নিয়ম, দূর থেকে কাছে। S4-এর নিয়ম আগের মতোই ঠিক। S5-এ (→ S4) আর S3-এ (→ S5) ADD. এখনো S1 পুরোনো পথে পাঠাচ্ছে, তাই নতুন নিয়ম বসানোর সময় কোনো packet অর্ধেক-তৈরি পথে পড়ে না।
  6. Ingress বদল। S1-এ MODIFY: এখন → S3. এই এক বার্তায় পুরো traffic নতুন পথে। Outage-এর মোট সময় = link নষ্ট ধরা + PORT_STATUS পৌঁছানো + হিসাব + নিয়ম বসানো — সাধারণত মিলিসেকেন্ড থেকে কয়েকশো মিলিসেকেন্ড, controller কত দূরে তার ওপর নির্ভর করে।
  7. পরিষ্কার। S2-এর পুরোনো নিয়ম মুছে ফেলা হলো, যাতে TCAM-এর জায়গা নষ্ট না হয়। Outage আরও কমাতে চাইলে আগেই fast-failover group-এ বিকল্প port বসানো যায় — তখন switch নিজেই মুহূর্তে বিকল্পে যায়, controller পরে ভালো পথটি হিসাব করে।

এই উদাহরণে প্রতিটি switch-এর নিয়ম শুধু গন্তব্যের ওপর নির্ভর করে, ঠিক OSPF-এর মতো। পার্থক্য হলো হিসাবটা একবার, এক জায়গায় হয় — পর্ব ২৪-এ link state-এ প্রতিটি router একই Dijkstra আলাদাভাবে চালাত। তবে controller চাইলে এমন পথও বেছে নিতে পারে যা shortest path নয় — যেমন ভিডিও traffic এক পথে, ব্যাকআপ আরেক পথে। এটিই SDN-এর traffic engineering, যা MPLS-TE (পর্ব ২৬) বিতরণকৃতভাবে করত।

৫ · এক বিমূর্ততা, অনেক যন্ত্র — match-plus-action আর P4

পর্ব ১৫-এ একটি দাবি করেছিলাম: switch, router, firewall আর NAT আসলে একই কাজ করে — কিছু ঘর মেলানো, তারপর একটি কাজ। SDN এই দাবিকে বাস্তবে রূপ দেয়। পাশাপাশি দেখুন:

যন্ত্রMatchActionPriority কীভাবে
L2 learning switch (পর্ব ১২)গন্তব্য MACশেখা port-এ পাঠানো; অচেনা হলে floodশেখা MAC-এর সারি > flood-এর সারি
IPv4 router (পর্ব ২২)গন্তব্য IP prefixTTL −১, MAC বদল, port-এ পাঠানোPriority = prefix-এর দৈর্ঘ্য → longest prefix match
Stateless firewall (পর্ব ৪৯)IP, protocol, portপাঠানো বা dropনির্দিষ্ট অনুমতি ওপরে, “বাকি সব drop” priority ০-তে
NAT (পর্ব ১৯)উৎস বা গন্তব্য IP (আর port)ঠিকানা বদল, তারপর পাঠানো“ভেতরের traffic বদলাবে না” ওপরে
Load balancerভার্চুয়াল ঠিকানা আর portগন্তব্য বদলে একটি backend-এপ্রতিটি flow বা hash-এর ভাগ অনুযায়ী

নিচের কোডে একটিই engine (fits আর priority দিয়ে সারি বাছাই), চারটি আলাদা নিয়মের সেট, আর একই তিনটি packet: p1 — ভেতরের host 10.1.2.7 থেকে বাইরের ওয়েবসাইটে HTTPS; p2 — বাইরে থেকে ফিরতি উত্তর, public ঠিকানা 203.0.113.7-এ; p3 — ভেতরেই আরেক subnet-এ SSH. Learning switch-এর ক্ষেত্রে প্রতিটি packet-এর উৎস MAC দেখে নতুন সারি যোগ হয় — এটি controller-এর একটি ছোট application-এর কাজ।

// One match-plus-action engine, four "devices" - only the rules differ.
const ip = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const inPfx = (a, p) => { const [n, l] = p.split("/"), m = l == 0 ? 0 : (0xffffffff << (32 - l)) >>> 0;
  return ((ip(a) & m) >>> 0) === ((ip(n) & m) >>> 0); };
const fits = (m, p) => Object.entries(m).every(([k, v]) => String(v).includes("/") ? inPfx(p[k], v) : p[k] === v);
const devices = {
  "L2 learning switch": [{ prio: 0, m: {}, a: "flood" }],     // rules for eth_dst are learned below
  "IPv4 router": [{ prio: 24, m: { dst: "10.1.9.0/24" }, a: "dec_ttl, output:4" },
    { prio: 24, m: { dst: "203.0.113.0/24" }, a: "dec_ttl, output:1" },
    { prio: 16, m: { dst: "10.1.0.0/16" }, a: "dec_ttl, output:2" }, { prio: 0, m: {}, a: "dec_ttl, output:3" }],
  "stateless firewall": [{ prio: 20, m: { dport: 443 }, a: "output:3" },
    { prio: 20, m: { src: "10.1.0.0/16", dport: 22 }, a: "output:2" }, { prio: 0, m: {}, a: "drop" }],
  "static NAT": [{ prio: 20, m: { dst: "10.1.0.0/16" }, a: "output:2 (no rewrite)" },
    { prio: 10, m: { src: "10.1.2.7" }, a: "set src=203.0.113.7, output:3" },
    { prio: 10, m: { dst: "203.0.113.7" }, a: "set dst=10.1.2.7, output:1" }, { prio: 0, m: {}, a: "drop" }],
};
const pkts = [
  { name: "p1 out ", in: 1, mac_src: "aa", mac_dst: "bb", src: "10.1.2.7", dst: "198.51.100.10", dport: 443 },
  { name: "p2 back", in: 3, mac_src: "bb", mac_dst: "aa", src: "198.51.100.10", dst: "203.0.113.7", dport: 51000 },
  { name: "p3 ssh ", in: 1, mac_src: "aa", mac_dst: "cc", src: "10.1.2.7", dst: "10.1.9.9", dport: 22 },
];
for (const [dev, table] of Object.entries(devices)) {
  console.log(`== ${dev} ==`);
  for (const p of pkts) {
    if (dev.startsWith("L2") && !table.some(e => e.m.mac_dst === p.mac_src))       // learn src MAC -> port
      table.push({ prio: 10, m: { mac_dst: p.mac_src }, a: `output:${p.in}` });
    const e = table.filter(e => fits(e.m, p)).sort((a, b) => b.prio - a.prio)[0];
    const key = dev.startsWith("L2") ? `mac ${p.mac_src}->${p.mac_dst}` : `${p.src}->${p.dst}:${p.dport}`;
    console.log(`  ${p.name} ${key.padEnd(32)} prio ${String(e.prio).padStart(2)} => ${e.a}`);
  }
}

আউটপুট:

== L2 learning switch ==
  p1 out  mac aa->bb                       prio  0 => flood
  p2 back mac bb->aa                       prio 10 => output:1
  p3 ssh  mac aa->cc                       prio  0 => flood
== IPv4 router ==
  p1 out  10.1.2.7->198.51.100.10:443      prio  0 => dec_ttl, output:3
  p2 back 198.51.100.10->203.0.113.7:51000 prio 24 => dec_ttl, output:1
  p3 ssh  10.1.2.7->10.1.9.9:22            prio 24 => dec_ttl, output:4
== stateless firewall ==
  p1 out  10.1.2.7->198.51.100.10:443      prio 20 => output:3
  p2 back 198.51.100.10->203.0.113.7:51000 prio  0 => drop
  p3 ssh  10.1.2.7->10.1.9.9:22            prio 20 => output:2
== static NAT ==
  p1 out  10.1.2.7->198.51.100.10:443      prio 10 => set src=203.0.113.7, output:3
  p2 back 198.51.100.10->203.0.113.7:51000 prio 10 => set dst=10.1.2.7, output:1
  p3 ssh  10.1.2.7->10.1.9.9:22            prio 20 => output:2 (no rewrite)

Switch: p1-এর গন্তব্য bb অচেনা → flood, কিন্তু উৎস aa শেখা হলো (port 1). তাই p2 (গন্তব্য aa) সরাসরি port 1-এ। p3-এর গন্তব্য cc অচেনা → আবার flood — পর্ব ১২-এর learning-এর হুবহু আচরণ। Router: p3-এর গন্তব্য 10.1.9.9 মেলে /16 (prio ১৬) আর /24 (prio ২৪) দুটোর সাথেই; prio ২৪ জেতে → port 4. Priority-কে prefix-এর দৈর্ঘ্য বানালেই longest prefix match. Firewall: সবচেয়ে শিক্ষণীয় লাইন p2 — p1-এর বৈধ ফিরতি উত্তর, অথচ drop! Stateless নিয়ম মনে রাখে না যে ভেতর থেকে সংযোগটি শুরু হয়েছিল; তাই বাস্তবে stateful firewall (পর্ব ৪৯) লাগে, যা সংযোগের অবস্থা মনে রাখে। NAT: p1-এর উৎস বদলে public ঠিকানা, p2-এর গন্তব্য বদলে আবার ভেতরের ঠিকানা, আর p3-এর ক্ষেত্রে prio ২০-এর “ভেতরের traffic বদলাবে না” নিয়ম জেতে। এটি এক-এক static NAT; বাড়ির router-এর মতো অনেককে এক ঠিকানায় চালানো (port বদলসহ) NAT-এ প্রতিটি সংযোগের state লাগে, যা শুধু স্থির match-plus-action দিয়ে হয় না — সেখানে controller বা আলাদা software-কে সাহায্য করতে হয়।

P4 — header-ও প্রোগ্রাম করা যায়

OpenFlow-এর একটি সীমা: switch কোন header-এর কোন ঘর চেনে, তা specification-এ বাঁধা। নতুন একটি protocol এলে (যেমন VXLAN-এর মতো নতুন encapsulation) নতুন OpenFlow সংস্করণ আর নতুন chip-এর অপেক্ষা। এই কারণে OpenFlow-এর match-এর ঘরের তালিকা সংস্করণে সংস্করণে বেড়েছে। ২০১৪ সালের একটি প্রবন্ধে (Bosshart ও সহকর্মীরা) প্রস্তাবিত P4 (Programming Protocol-independent Packet Processors) একটি ভাষা, যাতে লেখা যায়: (১) parser — packet-এর কোন byte-এ কোন header, কোন ঘর; (২) match-action টেবিল — কোন ঘর মেলানো হবে; (৩) action — কী করা হবে। এই প্রোগ্রাম compile হয়ে programmable chip-এ বা software switch-এ চলে, আর controller টেবিলের সারি লেখে P4Runtime দিয়ে। অর্থাৎ OpenFlow দেয় “টেবিলের সারি লেখার স্বাধীনতা”, P4 দেয় “টেবিলের নকশা করার স্বাধীনতা”। বাস্তবে programmable chip-এর বাজার আর কোন কোম্পানি তা বানায় তা সময়ের সাথে বদলেছে; ধারণাটি গবেষণা আর কিছু বড় data center-এ জনপ্রিয়, সাধারণ অফিসের নেটওয়ার্কে কম।

// P4-ধাঁচের ধারণা (সংক্ষিপ্ত উদাহরণ, পূর্ণ প্রোগ্রাম নয়)
table ipv4_lpm {
    key     = { hdr.ipv4.dstAddr : lpm; }      // match: longest prefix
    actions = { ipv4_forward; drop; }           // ipv4_forward(mac, port)
    size    = 1024;
    default_action = drop();
}

৬ · বাস্তবে SDN — B4, data center, SD-WAN আর চ্যালেঞ্জ

Google-এর B4 WAN

২০১৩ সালের SIGCOMM-এ Google “B4: Experience with a Globally-Deployed Software Defined WAN” প্রবন্ধে জানায়, তাদের data center-গুলোর মাঝের নিজস্ব WAN একটি কেন্দ্রীয় traffic engineering ব্যবস্থায় চলে। কোন application-এর traffic কোন পথে কতটা যাবে, তা কেন্দ্রে হিসাব হয়; ফলে link-গুলো প্রচলিত WAN-এর চেয়ে অনেক বেশি ব্যবহারে চালানো যায় — প্রবন্ধে কিছু link প্রায় পূর্ণ ক্ষমতায় চালানোর কথা বলা হয়েছে। এটি সম্ভব হয়েছে কারণ পুরো নেটওয়ার্ক আর তার বেশিরভাগ traffic একই মালিকের।

কেন্দ্রীয় TE · এক মালিক

Data center আর cloud

Leaf-spine fabric-এ (পর্ব ৫২) controller সব switch-এর কনফিগারেশন আর পথ সামলায়। Cloud-এ প্রতিটি গ্রাহকের নিজস্ব virtual নেটওয়ার্ক (VPC) আসলে সার্ভারের ভেতরের virtual switch-এর flow নিয়ম আর VXLAN-এর মতো overlay — নিয়ম লেখে cloud-এর controller. Open vSwitch এমন একটি মুক্ত-উৎসের virtual switch, যা OpenFlow বোঝে। বিস্তারিত পর্ব ৫৪-এ।

সবচেয়ে বড় সাফল্য

SD-WAN — শাখা অফিসের SDN

ব্যাংক বা কোম্পানির অনেক শাখা: প্রতিটিতে একটি ছোট SD-WAN যন্ত্র, যা একসাথে কয়েকটি সংযোগ (fiber ব্রডব্যান্ড, MPLS লাইন, 4G/5G) ব্যবহার করে। কেন্দ্রীয় controller নীতি পাঠায় — “লেনদেনের traffic সবচেয়ে কম delay-এর পথে, ভিডিও সস্তা পথে” — আর প্রতিটি পথের delay ও loss মেপে সিদ্ধান্ত বদলায়; শাখাগুলোর মাঝে এনক্রিপ্ট করা tunnel (পর্ব ৪৯)। বাংলাদেশেও বহু শাখাওয়ালা ব্যাংক ও প্রতিষ্ঠানে এ ধরনের ব্যবস্থার ব্যবহার বাড়ছে বলে শোনা যায়, তবে কোথায় কোনটি চলে তা প্রতিষ্ঠানভেদে আলাদা।

আজকের সবচেয়ে প্রচলিত বাণিজ্যিক রূপ

চারটি বড় চ্যালেঞ্জ

  • Controller যেন single point of failure না হয়: তাই controller চলে ৩ বা ৫টি সার্ভারের cluster-এ, যারা Raft বা Paxos-এর মতো consensus দিয়ে অবস্থা মেলায় (ডেটাবেসের প্রতিলিপির মতো সমস্যা, বিতরণকৃত ডেটাবেস)। Switch প্রতিটি controller-এর সাথে যুক্ত থাকে; OpenFlow-এ একটি master আর বাকিরা slave বা equal ভূমিকায়। সব controller হারালে switch কী করবে, সেটিও ঠিক করা থাকে: “fail secure” মোডে পুরোনো নিয়ম চলতে থাকে (নতুন flow-এর packet ফেলা হয়), “fail standalone” মোডে switch সাধারণ learning switch-এর মতো আচরণ শুরু করে।
  • Scalability: অংশ ৩-এর হিসাব — reactive নকশায় PACKET_IN-এর ঝড়, আর TCAM-এর সীমিত জায়গা। সমাধান: proactive নিয়ম, wildcard, স্তরভিত্তিক বা অঞ্চলভিত্তিক controller.
  • Controller-এর নিরাপত্তা: Controller-এ ঢুকতে পারলে পুরো নেটওয়ার্ক কারও হাতে — তাই প্রতিরক্ষা কেন্দ্রেও কেন্দ্রীভূত: control channel-এ TLS (পর্ব ৪৮), controller-কে আলাদা management নেটওয়ার্কে রাখা, northbound API-তে শক্ত পরিচয় যাচাই আর ভূমিকাভিত্তিক অনুমতি, প্রতিটি application-এর নিয়মের সীমা, আর সব বদলের লগ। আবার একই কেন্দ্রীয়তা প্রতিরক্ষার হাতিয়ারও: IDS (পর্ব ৫০) কোনো আক্রান্ত যন্ত্র চিহ্নিত করলে controller এক FLOW_MOD-এ তাকে আলাদা করে ফেলতে পারে।
  • নিয়ম বদলের সময় অসংগতি: ৫টি switch-এ নিয়ম বদলাতে কয়েক মিলিসেকেন্ড লাগে, আর ঠিক সেই সময়ে পথে থাকা packet হয়তো কিছু switch-এ পুরোনো, কিছুতে নতুন নিয়ম দেখে — loop, black hole, এমনকি firewall-কে পাশ কাটানো পথ তৈরি হতে পারে। অংশ ৪-এ “দূরের switch আগে” কৌশল সরল ক্ষেত্রে কাজ করে; সাধারণ সমাধান হলো two-phase update, ২০১২ সালের দিকে Reitblatt ও সহকর্মীদের “consistent update” ধারণা।
নীতি v1 থেকে v2-তে বদল (N = একটি সংস্করণের নিয়মের সংখ্যা)
Ingress (S1) কোন চিহ্ন বসায়
ভেতরের switch-এর নিয়ম
পথে থাকা packet
TCAM-এ সারি
  1. শুরু: v1 নীতি। Ingress switch প্রতিটি packet-এ একটি সংস্করণ-চিহ্ন বসায় (যেমন VLAN tag-এ “v1”). ভেতরের switch-গুলোর নিয়ম শুধু সেই চিহ্নওয়ালা packet মেলায়।
  2. Phase ১: v2 নিয়ম পাশে বসানো। সব ভেতরের switch-এ v2-এর নিয়ম যোগ হলো, v1 না মুছেই। কোনো packet-এ এখনো v2 চিহ্ন নেই, তাই নতুন নিয়ম কারও আচরণ বদলায় না — যত সময়ই লাগুক, কোনো ঝুঁকি নেই।
  3. Phase ২: ingress-এ চিহ্ন বদল। এক মুহূর্তে S1 নতুন packet-এ v2 বসাতে শুরু করল। এখন থেকে যে packet ঢুকছে, সে পুরো পথে শুধু v2 নিয়ম দেখবে; আগে ঢোকা packet শুধু v1 দেখবে। কোনো packet দুটো মিশিয়ে দেখে না — এটাই per-packet consistency.
  4. অপেক্ষা। নেটওয়ার্কে কোনো packet সর্বোচ্চ যতক্ষণ থাকতে পারে, ততক্ষণ অপেক্ষা — তারপর নিশ্চিত, আর কোনো v1 packet পথে নেই।
  5. পুরোনো নিয়ম মোছা। v1-এর নিয়ম মুছে TCAM আবার N-এ। দাম: বদলের সময় দ্বিগুণ নিয়মের জায়গা আর কিছুটা ধীর বদল। যুক্তিটি সরল: প্রতিটি packet-এর চিহ্ন একবারই ঠিক হয় (ingress-এ), আর প্রতিটি switch শুধু সেই চিহ্নের নিয়ম মানে — তাই মিশ্রণ অসম্ভব।

৭ · NFV — বাক্সের কাজ software-এ

SDN প্রশ্ন করেছিল “switch-এর মস্তিষ্ক কোথায় থাকবে?” NFV-র প্রশ্ন আলাদা: “firewall, NAT, load balancer-এর মতো network function কি বিশেষ বাক্সেই চলতে হবে?” টেলিকম অপারেটরদের নেটওয়ার্ক ভর্তি ছিল এমন বাক্সে — প্রতিটি নতুন সেবার জন্য নতুন বাক্স, নতুন vendor, নতুন তার, নতুন প্রশিক্ষণ। ২০১২ সালের শেষ দিকে কয়েকটি বড় টেলিকম অপারেটর একটি white paper-এ প্রস্তাব দেয়: এসব কাজ চলুক সাধারণ (commodity) সার্ভারে, virtual machine বা container-এ, software হিসেবে। এরপর ইউরোপের মান সংস্থা ETSI-তে NFV-র একটি দল এর কাঠামো তৈরি করে।

আগে একটি দোকানে টিভি, রেডিও, ক্যামেরা, ক্যালকুলেটর আর টর্চ — পাঁচটি আলাদা যন্ত্র। আজ একটি স্মার্টফোনে পাঁচটিই অ্যাপ। নতুন কাজ লাগলে নতুন যন্ত্র কিনতে হয় না, অ্যাপ নামালেই হয়; আর ফোন বদলালে অ্যাপগুলো নতুন ফোনে চলে যায়। NFV হলো নেটওয়ার্কের যন্ত্রগুলোর “স্মার্টফোন মুহূর্ত” — তবে মনে রাখুন, বিশেষ যন্ত্রের মতো গতি সবসময় অ্যাপে পাওয়া যায় না।

ETSI-র কাঠামো — তিনটি অংশ

 ┌────────────────────────────────────────┐   ┌──────────────────┐
 │  VNFs:  vFirewall │ vNAT │ vLB │ vEPC   │◀──│ NFV MANO         │
 └────────────────────────────────────────┘   │  NFVO  (সেবা ও   │
 ┌────────────────────────────────────────┐   │        chain)    │
 │  NFVI: virtual compute │ storage │ net │◀──│  VNFM  (প্রতিটি  │
 │        hypervisor / container runtime  │   │        VNF-এর    │
 │        commodity servers, NICs, switch │   │        জীবনচক্র) │
 └────────────────────────────────────────┘   │  VIM   (যেমন     │
                                              │        OpenStack)│
                                              └──────────────────┘
  • VNF (Virtualized Network Function): software রূপে একটি network function — virtual firewall, NAT, load balancer, DPI, মোবাইল নেটওয়ার্কের core (4G-র EPC বা 5G core-এর অংশ)।
  • NFVI (NFV Infrastructure): সার্ভার, storage, নেটওয়ার্ক আর তার ওপর hypervisor বা container runtime — VNF যেখানে চলে।
  • MANO (Management and Orchestration): NFVO পুরো সেবা আর chain সামলায়, VNFM প্রতিটি VNF চালু, বড়-ছোট (scale) আর বন্ধ করে, আর VIM (প্রায়ই OpenStack বা Kubernetes) NFVI-র resource বণ্টন করে। এই নামগুলো ETSI-র নথি থেকে; বাস্তব পণ্যে ভাগাভাগি আলাদা হতে পারে।

Service function chaining

একটি packet-কে প্রায়ই কয়েকটি function পার হতে হয় নির্দিষ্ট ক্রমে — যেমন firewall → NAT → load balancer. বাক্সের যুগে এই ক্রম ঠিক হতো তার জুড়ে; NFV-তে ক্রম ঠিক করে software — virtual switch-এর flow নিয়ম (এখানেই SDN আর NFV মেলে)। এর নাম service function chaining (SFC); IETF-এ এর স্থাপত্য RFC 7665, আর chain-এর তথ্য packet-এ বহন করার একটি header NSH (RFC 8300). নিচের simulator তিনটি VNF-কে তিনটি function হিসেবে সাজায়; load balancer একই 5-tuple-কে সবসময় একই backend-এ পাঠায় (hash দিয়ে), যাতে একটি TCP সংযোগ মাঝপথে অন্য সার্ভারে না যায়।

// Service function chain: three VNFs (software on one server), packet goes firewall -> NAT -> LB.
const backends = ["10.0.0.11", "10.0.0.12", "10.0.0.13"];
const hash = s => [...s].reduce((h, ch) => (h * 31 + ch.charCodeAt(0)) >>> 0, 7);
const vnfs = [
  ["firewall", p => (p.proto === "tcp" && p.dport === 443 ? p : null)],     // allow HTTPS only
  ["NAT", p => (p.dst === "203.0.113.10" ? { ...p, dst: "10.0.0.10" } : p)],  // public VIP -> private VIP
  ["LB", p => {                                                              // same 5-tuple -> same backend
    const key = [p.proto, p.src, p.sport, p.dst, p.dport].join("|");
    return { ...p, dst: backends[hash(key) % backends.length] };
  }],
];
const stats = { firewall: 0, NAT: 0, LB: 0, dropped: 0 };
const show = p => `${p.src}:${p.sport} -> ${p.dst}:${p.dport}`;
function chain(p) {
  let out = `${show(p).padEnd(36)}`;
  for (const [name, fn] of vnfs) {
    stats[name]++; p = fn(p);
    if (!p) { stats.dropped++; return console.log(out + ` | ${name}: DROP`); }
  }
  console.log(out + ` | delivered as ${show(p)}`);
}
[ { proto: "tcp", src: "198.51.100.5", sport: 40001, dst: "203.0.113.10", dport: 443 },
  { proto: "tcp", src: "198.51.100.5", sport: 40002, dst: "203.0.113.10", dport: 443 },
  { proto: "tcp", src: "192.0.2.77", sport: 52000, dst: "203.0.113.10", dport: 443 },
  { proto: "tcp", src: "192.0.2.66", sport: 33333, dst: "203.0.113.10", dport: 23 },
  { proto: "tcp", src: "198.51.100.5", sport: 40001, dst: "203.0.113.10", dport: 443 },
].forEach(chain);
console.log("packets seen per VNF:", JSON.stringify(stats));

আউটপুট:

198.51.100.5:40001 -> 203.0.113.10:443 | delivered as 198.51.100.5:40001 -> 10.0.0.11:443
198.51.100.5:40002 -> 203.0.113.10:443 | delivered as 198.51.100.5:40002 -> 10.0.0.12:443
192.0.2.77:52000 -> 203.0.113.10:443 | delivered as 192.0.2.77:52000 -> 10.0.0.11:443
192.0.2.66:33333 -> 203.0.113.10:23  | firewall: DROP
198.51.100.5:40001 -> 203.0.113.10:443 | delivered as 198.51.100.5:40001 -> 10.0.0.11:443
packets seen per VNF: {"firewall":5,"NAT":4,"LB":4,"dropped":1}

প্রথম ও শেষ লাইনের 5-tuple হুবহু এক (একই client, একই port 40001), তাই দুবারই একই backend 10.0.0.11 — সংযোগ ভাঙেনি। একই client-এর অন্য port (40002) মানে আলাদা সংযোগ, সে গেল 10.0.0.12-এ। Port 23-এর packet firewall-এ আটকাল, তাই NAT আর LB তাকে দেখেইনি — counter-এ firewall ৫, বাকি দুটি ৪। Chain-এর ক্রম গুরুত্বপূর্ণ: firewall আগে রাখায় অবাঞ্ছিত traffic পরের VNF-গুলোর CPU খরচ করল না। নিজে চেষ্টা করুন: vnfs-এর ক্রম উল্টে LB আগে রাখলে কী হবে? (ইঙ্গিত: LB গন্তব্য বদলে দিলে NAT-এর নিয়ম আর মিলবে কি?)

একটি শাখা data center-এর পরিবর্তন
Hardware
যা চলছে
Traffic-এর পথ
কে নিয়ন্ত্রণ করে
নতুন ক্ষমতা যোগ
  1. আগে: তিনটি বাক্স। প্রতিটির নিজস্ব hardware, বিদ্যুৎ, rack-এর জায়গা, লাইসেন্স আর CLI. Traffic তার দিয়ে এক বাক্স থেকে আরেক বাক্সে। ক্ষমতা বাড়াতে নতুন বাক্স কেনা ছাড়া উপায় নেই।
  2. NFVI তৈরি। একটি সাধারণ সার্ভার, ভালো NIC, তার ওপর hypervisor আর virtual switch. এখনো কোনো network function নেই — শুধু জায়গা তৈরি।
  3. MANO তিনটি VNF চালু করল। একটি descriptor ফাইলে লেখা আছে কোন VNF, কত vCPU, কত মেমরি, কোন নেটওয়ার্কে। NFVO আর VNFM তা পড়ে VIM-কে বলল VM বানাতে — vFW ৪, vNAT ২, vLB ২ vCPU.
  4. Chain জোড়া। এবার তারের বদলে virtual switch-এর flow নিয়ম: বাইরের port থেকে vFW, vFW থেকে vNAT, তারপর vLB. ক্রম বদলাতে নতুন নিয়মই যথেষ্ট — কেউ rack-এ গিয়ে তার খোলে না। এখানে SDN আর NFV একসাথে কাজ করছে।
  5. Load বাড়ল — scale-out. সন্ধ্যায় traffic বেড়ে vLB-এর CPU পূর্ণ। VNFM pool-এর দ্বিতীয় সার্ভারে আরেকটি vLB চালু করল, আর traffic দুই কপিতে ভাগ হলো। কোনো নতুন বাক্স পাঠাতে হয়নি।
  6. একটি VNF নষ্ট — পুনরায় চালু। vFW-এর software crash করল; স্বাস্থ্য-পরীক্ষায় VNFM তা ধরে অন্য জায়গায় নতুন vFW চালু করল আর chain-এর নিয়ম বদলাল। দামও আছে: software-এ packet প্রক্রিয়া বিশেষ chip-এর চেয়ে ধীর হতে পারে, তাই উচ্চগতির VNF-এ DPDK বা SR-IOV-এর মতো কৌশল লাগে, আর অনেক স্তরের software-এ সমস্যা খোঁজা কঠিন হয়।

৮ · SDN বনাম NFV, 5G-র cloud-native core আর network automation

বিষয়SDNNFV
মূল প্রশ্ননেটওয়ার্কের নিয়ন্ত্রণ কোথায় থাকবে?Network function কোথায় চলবে?
কী আলাদা করেControl plane-কে data plane থেকেFunction-এর software-কে বিশেষ hardware থেকে
প্রধান জায়গাData center, campus, WAN, cloud-এর virtual নেটওয়ার্কটেলিকম অপারেটর, মোবাইল core, শাখা অফিসের যন্ত্র
মান ও সংস্থাONF (OpenFlow), IETF (NETCONF, YANG), P4 সংস্থাETSI NFV, 3GPP (মোবাইল)
একটি ছাড়া অন্যটি?সম্ভব — SDN সাধারণ hardware switch-এও চলে, VNF-ও প্রচলিত নেটওয়ার্কে চলে। কিন্তু একসাথে সবচেয়ে কার্যকর: NFV বানায় function, SDN তাদের মাঝে traffic সাজায় (chain).

VNF থেকে CNF — আর 5G-র service-based core

প্রথম যুগের VNF ছিল পুরোনো বাক্সের software-কে প্রায় অপরিবর্তিত VM-এ তুলে দেওয়া — একটি বড় VM, হাতে হাতে কনফিগারেশন। পরের ধাপ CNF (cloud-native network function): function-কে ছোট ছোট microservice-এ ভাগ করে container-এ চালানো, Kubernetes দিয়ে স্বয়ংক্রিয়ভাবে বড়-ছোট আর পুনরায় চালু করা (container আর orchestration-এর ভিত্তি অপারেটিং সিস্টেম কোর্সের container পর্বে)। মোবাইল নেটওয়ার্কের 5G core এই চিন্তায় নকশা করা: 3GPP-র নকশায় core-এর প্রতিটি অংশ (যেমন সংযোগ ও চলাচল সামলানো AMF, session সামলানো SMF, ব্যবহারকারীর ডেটা বহনকারী UPF) একটি “network function”, আর তারা একে অপরের সাথে HTTP/2-ভিত্তিক API-তে কথা বলে — একে বলে service-based architecture (SBA). লক্ষ করুন, SMF (নিয়ন্ত্রণ) আর UPF (ডেটা পাঠানো) আলাদা — ঠিক SDN-এর control আর data plane-এর মতো ভাগ। মোবাইল নেটওয়ার্কের বিস্তারিত পর্ব ৫১-এ।

Intent-based networking আর automation — প্রতিদিনের SDN

বেশিরভাগ নেটওয়ার্ক প্রকৌশলী OpenFlow controller লেখেন না। কিন্তু SDN-এর মূল শিক্ষা — “নেটওয়ার্ককে যন্ত্র ধরে ধরে নয়, কোড আর ডেটা দিয়ে চালানো” — আজ প্রায় সবার কাজের অংশ:

  • মডেলভিত্তিক কনফিগারেশন: যন্ত্রের অবস্থা আর কনফিগারেশন YANG মডেলে লেখা ডেটা, যা NETCONF, RESTCONF (RFC 8040) বা gNMI দিয়ে পড়া-লেখা হয়। CLI-এর লেখা পার্স করার বদলে কাঠামোবদ্ধ ডেটা; আর NETCONF-এ পুরো পরিবর্তন একসাথে প্রয়োগ বা বাতিল (transaction) করা যায়।
  • Automation tool: Ansible-এর মতো tool (যন্ত্রে আলাদা agent লাগে না, সাধারণত SSH বা NETCONF দিয়ে যুক্ত হয়) একই কনফিগারেশন শত যন্ত্রে বসায়; কনফিগারেশন থাকে git-এ, বদলের আগে review — “infrastructure as code”.
  • Intent-based networking: প্রকৌশলী লেখেন কী চাই (“অতিথি Wi-Fi থেকে হিসাব বিভাগের সার্ভারে কোনো traffic যাবে না”), ব্যবস্থাটি নিজে ঠিক করে কীভাবে — কোন যন্ত্রে কোন ACL বা VLAN — আর নিয়মিত যাচাই করে নীতিটি এখনো মানা হচ্ছে কি না। শব্দটি কয়েক বছর ধরে vendor-দের বিপণনে খুব জনপ্রিয়, তাই প্রতিটি পণ্যের দাবি আলাদাভাবে যাচাই করা দরকার।
# উদাহরণ: সব শাখার router-এ একই NTP সার্ভার (vendor-নির্দিষ্ট module; অন্য vendor-এ module আলাদা)
- name: Same NTP server on every branch router
  hosts: branch_routers
  gather_facts: false
  tasks:
    - name: Ensure the NTP line exists
      cisco.ios.ios_config:
        lines:
          - ntp server 192.0.2.123
# প্রথমে শুকনো মহড়া: ansible-playbook ntp_branches.yml --check --diff

এখানে cisco.ios.ios_config একটি নির্দিষ্ট vendor-এর module — অন্য vendor-এর যন্ত্রে আলাদা module লাগে, যা AI প্রায়ই গুলিয়ে ফেলে। --check --diff চালালে (যে module এটি সমর্থন করে) কিছু না বদলে দেখায় কী বদলাত। একটি ভুল লাইন শত যন্ত্রে একসাথে চলে যেতে পারে — তাই automation-এ পরীক্ষা, ধাপে ধাপে চালু (প্রথমে একটি শাখা) আর ফিরে যাওয়ার পরিকল্পনা আরও জরুরি।

আরও গভীরে: Open vSwitch-এ ধীর পথ (userspace-এর ovs-vswitchd, যেখানে পুরো OpenFlow pipeline) আর দ্রুত পথ (kernel datapath বা DPDK-র একটি cache) আলাদা — প্রথম packet ধীর পথে গিয়ে একটি নিখুঁত-মিলের cache সারি তৈরি করে, পরের packet সরাসরি cache-এ; অর্থাৎ একটি সার্ভারের ভেতরেই reactive SDN-এর মতো ভাগ। ONOS-এর মতো controller cluster-এ topology আর flow-এর অবস্থা বিতরণকৃত store-এ রাখে, যেখানে কিছু তথ্যে শক্ত consistency (Raft-ভিত্তিক) আর কিছুতে “শেষমেশ মিলবে” ধরনের consistency বেছে নেওয়া হয়। আর নিয়ম বদলের সংগতি নিয়ে গবেষণা — ক্রম মেনে বদল, loop-মুক্ত বদল, ভিড়-মুক্ত বদল — SDN-এর গবেষণার একটি বড় শাখা।

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

  • SDN কী, প্রচলিত নেটওয়ার্ক থেকে মূল পার্থক্য? — Control plane switch থেকে আলাদা করে যৌক্তিকভাবে কেন্দ্রীভূত controller-এ; switch শুধু flow table মানে, controller খোলা API দিয়ে তা লেখে।
  • Table-miss হলে কী ঘটে? — Table-miss সারি থাকলে (সাধারণত priority ০, action controller) PACKET_IN যায়; controller FLOW_MOD আর PACKET_OUT পাঠায়। OpenFlow ১.৩-এ সারি না থাকলে ডিফল্টে drop.
  • Proactive বনাম reactive? — আগেভাগে নিয়ম (দেরি নেই, controller-নির্ভরতা কম, TCAM বেশি) বনাম প্রথম packet-এ নিয়ম (সূক্ষ্ম নীতি, কিন্তু প্রথম packet-এ delay আর controller-এ চাপ)।
  • Southbound আর northbound API-র উদাহরণ? — Southbound: OpenFlow, P4Runtime, NETCONF/gNMI; northbound: REST বা gRPC API, application-এর জন্য।
  • SDN আর NFV-র পার্থক্য? — SDN নিয়ন্ত্রণ আলাদা করে, NFV function-কে hardware থেকে আলাদা করে software-এ চালায়; দুটি পরিপূরক।

৯ · AI-এর যুগে SDN আর NFV

“একটি Ryu controller লিখে দিন” বা “আমাদের ৩০০ switch-এ এই VLAN বসানোর Ansible playbook চাই” — AI এসব মুহূর্তে লিখে দেয়। কিন্তু SDN আর automation-এ ভুলের দাম বেশি, কারণ একটি ভুল নিয়ম বা playbook একসাথে পুরো নেটওয়ার্কে ছড়ায়। AI সাধারণত যে ভুলগুলো করে:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
“SDN-এ প্রতিটি packet controller দিয়ে যায়”শুধু table-miss বা বিশেষ নিয়মের packet; বাকি সব data plane-এFlow-এর counter আর PACKET_IN-এর সংখ্যা মিলিয়ে দেখুন
OpenFlow-এর বানানো “RFC নম্বর”OpenFlow ONF-এর specification, IETF RFC নয়rfc-editor.org-এ খুঁজুন; ONF-এর নথির সংস্করণ মেলান
OpenFlow ১.০-এর আচরণ ১.৩-এর বলে চালানোTable-miss-এর ডিফল্ট, match-এর নাম, একাধিক টেবিল — সংস্করণে আলাদাController আর switch কোন সংস্করণে কথা বলছে দেখুন
এক vendor-এর CLI বা module সব যন্ত্রের বলে দেওয়াios_config শুধু একটি vendor-এর; YANG মডেলও vendor-ভেদে আলাদা হতে পারেযন্ত্রের মডেল ও software সংস্করণের নথি দেখুন
Table-miss-এ “flood” বা সব-অনুমতির নিয়ম, controller-এ TLS ছাড়ানিরাপত্তা-নীতি ভেঙে যায়; control channel খোলা থাকেডিফল্ট-deny নীতি আর TLS নিশ্চিত করুন; শুধু নিজের ল্যাবে পরীক্ষা
NFV-র performance নিয়ে অতিরঞ্জিত সংখ্যাSoftware-এর গতি NIC, CPU, DPDK আর packet-এর আকারের ওপর নির্ভর করেনিজের যন্ত্রে, নিজের traffic-এ মাপুন (পর্ব ৫৬)

AI-কে SDN বা automation-এর কাজ দিলে প্রসঙ্গ আর যাচাইয়ের শর্তসহ দিন:

আমি একটি ল্যাবে (Mininet আর Open vSwitch, OpenFlow 1.3) একটি ছোট SDN controller application লিখছি। ১. Topology: 5টি switch, link-এর cost আমি দিচ্ছি: [এখানে তালিকা]। Shortest path-এর জন্য flow নিয়মের তালিকা দাও — প্রতিটি নিয়মের match, priority, action আর idle/hard timeout আলাদা করে লেখো। ২. Table-miss সারির আচরণ OpenFlow 1.3 অনুযায়ী কী, আর 1.0-র সাথে পার্থক্য কী — নিশ্চিত না হলে স্পষ্ট বলো। ৩. Link নষ্ট হলে কোন বার্তায় controller জানবে, আর কোন ক্রমে নিয়ম বদলালে loop বা black hole হবে না, তা ধাপে ধাপে দেখাও। ৪. কোনো RFC বা specification-এর নাম দিলে সঠিক নাম ও সংস্করণ দাও; অনুমান হলে বলো। ৫. প্রতিটি দাবি আমি কীভাবে যাচাই করব (যেমন ovs-ofctl dump-flows-এর counter) তা লেখো।

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

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

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

প্র ০১২০১০-এর দশকের শুরুতে অনেকে ভেবেছিলেন OpenFlow সব switch-এর ভাষা হয়ে যাবে। তা হয়নি, অথচ SDN-এর ধারণাগুলো আজ প্রায় সর্বত্র। কেন এমন হলো?

OpenFlow-এর প্রস্তাব ছিল সাহসী: সব switch একটি খোলা, সাধারণ ভাষায় নিয়ন্ত্রিত হবে, আর controller-এর software যে-কেউ লিখতে পারবে। ২০১১ সালে ONF গঠন, ২০১২ সালে VMware-এর Nicira কিনে নেওয়া (Nicira-র প্রতিষ্ঠাতাদের মধ্যে ছিলেন Ethane-এর Martin Casado) — সব মিলিয়ে মনে হচ্ছিল নেটওয়ার্কের পুরো শিল্প বদলে যাবে।

বাস্তবে কয়েকটি বাধা এলো। প্রথমত, hardware-এর সীমা: OpenFlow-এর অনেক ঘর মেলানো নিয়ম রাখতে TCAM লাগে, যা ছোট আর দামি; অনেক বাণিজ্যিক switch OpenFlow “সমর্থন” করত, কিন্তু অল্প কিছু নিয়ম hardware-এ, বাকিগুলো ধীর CPU-তে। দ্বিতীয়ত, specification-এর বিবর্তন: প্রতিটি নতুন header-এর জন্য নতুন সংস্করণ লাগত, আর সংস্করণগুলোর মাঝে সামঞ্জস্য রাখা কঠিন হলো — এই সমস্যা থেকেই P4-এর জন্ম। তৃতীয়ত, ব্যবসা আর অভ্যাস: বড় vendor-রা নিজেদের controller আর API দিয়ে “SDN” বিক্রি করতে শুরু করল, আর প্রতিষ্ঠানগুলো সাধারণত পুরো নেটওয়ার্ক একবারে বদলাতে চায় না।

কিন্তু ধারণাগুলো জিতে গেল অন্যভাবে। Nicira-র কাজ থেকে আসা ধারণায় cloud-এর virtual নেটওয়ার্ক তৈরি হয় সার্ভারের ভেতরের virtual switch-এ, physical switch-কে না ছুঁয়ে — overlay. Google-এর B4 দেখাল একক মালিকের WAN-এ কেন্দ্রীয় traffic engineering কতটা কাজের। SD-WAN শাখা অফিসে controller-ভিত্তিক নীতি জনপ্রিয় করল। আর NETCONF, YANG, gNMI ও Ansible-এর হাত ধরে “নেটওয়ার্ক = কোড আর ডেটা” প্রায় প্রতিটি নেটওয়ার্ক দলে ঢুকে গেল।

অর্থাৎ OpenFlow নির্দিষ্ট protocol হিসেবে একটি অংশে সীমিত রইল (গবেষণা, শিক্ষা, কিছু data center আর Open vSwitch-এর ভেতরে), কিন্তু তার চারটি মূল ধারণা — control আর data আলাদা, কেন্দ্রীয় ছবি, match-plus-action আর প্রোগ্রাম করা যায় এমন নেটওয়ার্ক — নানা নামে সব জায়গায় পৌঁছেছে।

মূল উপলব্ধি: একটি প্রযুক্তির নির্দিষ্ট protocol হারতে পারে, অথচ তার ধারণা জিততে পারে। পরীক্ষা আর ইন্টারভিউতে তাই “OpenFlow” মুখস্থের চেয়ে control আর data plane-এর ভাগ আর তার দাম বোঝা বেশি কাজের।

প্র ০২“যৌক্তিকভাবে কেন্দ্রীভূত” controller কয়েকটি সার্ভারে প্রতিলিপি রেখে চলে। এতে কী কী নতুন সমস্যা তৈরি হয়, আর controller-এর সাথে যোগাযোগ কেটে গেলে switch-এর কী করা উচিত?

একটি controller-এ সবকিছু রাখলে সেটিই single point of failure — সার্ভার নষ্ট হলে নতুন flow-এর নিয়ম বসবে না, link failure-এ নতুন পথ হবে না। তাই বাস্তবে তিন বা পাঁচটি controller instance একটি cluster-এ চলে। কিন্তু তখনই আসে বিতরণকৃত ব্যবস্থার পুরোনো প্রশ্ন: সবার কাছে কি একই topology আর একই নিয়মের তালিকা আছে? দুটি instance যদি একই সময়ে একই switch-এ বিপরীত নিয়ম পাঠায়?

সমাধানের একটি অংশ ভূমিকা ভাগ: OpenFlow-এ প্রতিটি switch-এর জন্য একটি controller “master”, বাকিরা কেবল পড়তে পারে বা অপেক্ষায় থাকে; master নষ্ট হলে অন্যজন দায়িত্ব নেয়। আরেকটি অংশ ভাগাভাগির store: ONOS-এর মতো controller কিছু তথ্য Raft-এর মতো consensus দিয়ে কঠোরভাবে মেলায় (যেখানে ভুল মানেই বিপজ্জনক নিয়ম), আর কিছু তথ্য দ্রুততার জন্য শিথিলভাবে (যেমন counter). এ হলো ডেটাবেসের CAP-জাতীয় টানাপোড়েন — নেটওয়ার্ক ভাগ হয়ে গেলে সংগতি আর সহজলভ্যতা একসাথে পুরোপুরি রাখা যায় না।

আর যদি switch সব controller হারায়? OpenFlow দুটি আচরণ দেয়। “Fail secure” মোডে switch তার বিদ্যমান নিয়ম মেনে চলে, কিন্তু নতুন কিছু শেখে না — নিরাপত্তা-নীতি অক্ষত থাকে, নতুন ধরনের traffic আটকে যায়। “Fail standalone” মোডে switch সাধারণ learning switch হয়ে যায় — connectivity বাঁচে, কিন্তু controller-এর নীতি (যেমন অতিথি নেটওয়ার্ক আলাদা রাখা) আর কার্যকর থাকে না। ব্যাংকের লেনদেনের নেটওয়ার্কে হয়তো প্রথমটি, ছাত্রাবাসের Wi-Fi-তে হয়তো দ্বিতীয়টি বেশি যুক্তিযুক্ত। Proactive নিয়ম আর fast-failover group থাকলে controller ছাড়াও নেটওয়ার্ক অনেকক্ষণ চলতে পারে।

এর সাথে controller আর switch-এর যোগাযোগের পথটিও নির্ভরযোগ্য হতে হয় — আলাদা management নেটওয়ার্ক (out-of-band), নয়তো একই নেটওয়ার্কে (in-band) এমনভাবে যে নিয়ম ভুল হলেও controller-এর পথ বন্ধ না হয়।

মূল উপলব্ধি: কেন্দ্রীয় নিয়ন্ত্রণ সমস্যা দূর করে না, সমস্যাকে এক জায়গায় আনে — যেখানে তা বিতরণকৃত ব্যবস্থার পরিচিত কৌশল (প্রতিলিপি, consensus, ব্যর্থতার মোড) দিয়ে সামলাতে হয়।

প্র ০৩Google-এর B4 link-গুলো প্রচলিত WAN-এর চেয়ে অনেক বেশি ব্যবহারে চালাতে পেরেছে বলে জানানো হয়েছে। প্রচলিত ISP কেন একইভাবে পারে না?

প্রচলিত WAN-এ link সাধারণত অনেকটা ফাঁকা রাখা হয়। কারণ OSPF বা IS-IS-এর shortest path-এ সব traffic একই পথে যায়; কোনো link নষ্ট হলে সেই traffic বিকল্প পথে পড়ে, আর বিকল্প পথে আগে থেকেই জায়গা না থাকলে ভিড় আর loss. তাছাড়া traffic-এর হঠাৎ ঝাপটা কোথা থেকে আসবে তা অজানা। তাই অপারেটররা নিরাপত্তার জন্য ক্ষমতার বড় অংশ অব্যবহৃত রাখেন — এটাই “overprovisioning”.

২০১৩ সালের B4 প্রবন্ধে Google যা বর্ণনা করে, তার মূল কয়েকটি শর্ত বিশেষ। প্রথমত, পুরো নেটওয়ার্ক আর তার দুই প্রান্তের বেশিরভাগ application (যেমন data center-এর মাঝে বড় ডেটা কপি) একই প্রতিষ্ঠানের। তাই কেন্দ্রীয় ব্যবস্থা জানে কোন application কতটা bandwidth চায়, কোনটি দেরি সইতে পারে। দ্বিতীয়ত, অনেক traffic “ধৈর্যশীল” — ব্যাকআপ বা প্রতিলিপি কয়েক মিনিট দেরিতে হলেও চলে। তৃতীয়ত, কেন্দ্রীয় traffic engineering একটি traffic-কে কয়েকটি পথে ভাগ করে দিতে পারে, shortest path ছাড়াও; আর ভিড় হলে কম জরুরি traffic আগে কমানো যায়। এসব মিলিয়ে link-কে পূর্ণ ক্ষমতার কাছাকাছি চালানো সম্ভব হয়েছে — প্রবন্ধে উল্লেখিত সংখ্যাগুলো সেই নির্দিষ্ট নেটওয়ার্কের, সব জায়গায় খাটে না।

একটি ISP-র অবস্থা আলাদা। তার traffic লক্ষ লক্ষ গ্রাহকের, অসংখ্য application-এর; ISP জানে না কোনটি দেরি সইবে, আর গ্রাহকের traffic-কে ইচ্ছামতো কমানো চুক্তি আর নিয়ন্ত্রক-নীতির প্রশ্ন (পর্ব ১৫-এর net neutrality-র আলোচনা)। তার ওপর BGP দিয়ে অন্য ISP-র সাথে যুক্ত পথগুলো তার নিয়ন্ত্রণে নেই (পর্ব ২৫)। ফলে ISP-রা কেন্দ্রীয় হিসাব ব্যবহার করে মূলত নিজের নেটওয়ার্কের ভেতরে — MPLS-TE বা segment routing-এর পথ পরিকল্পনায় — কিন্তু B4-এর মতো আক্রমণাত্মক ব্যবহার কম।

মূল উপলব্ধি: কেন্দ্রীয় traffic engineering-এর শক্তি আসে তথ্য আর নিয়ন্ত্রণ থেকে — কে কতটা চায়, কে অপেক্ষা করতে পারে। যেখানে এক মালিক দুটোই জানে, সেখানে SDN সবচেয়ে বেশি লাভ দেয়।

প্র ০৪NFV-তে বিশেষ chip-এর বাক্স ছেড়ে সাধারণ সার্ভারে software চালানো হয়। Packet প্রক্রিয়ার গতিতে software কি hardware-এর সাথে পাল্লা দিতে পারে? টেলিকম অপারেটররা কোন অভিজ্ঞতা থেকে CNF-এর দিকে গেল?

সাধারণ Linux kernel-এর নেটওয়ার্ক পথ নমনীয়, কিন্তু প্রতিটি packet-এ interrupt, মেমরি বরাদ্দ, kernel আর user space-এর মাঝে কপি — এসব খরচ যোগ হয়। ছোট packet-এ ১০ বা ১০০ Gbps-এর লাইন-রেটে (পর্ব ১৫-এ হিসাব করা ন্যানোসেকেন্ডের বাজেট) এই পথ পাল্লা দিতে পারে না। NFV-র প্রথম যুগে অনেক VNF তাই প্রত্যাশার চেয়ে ধীর আর বেশি CPU-খেকো প্রমাণিত হয়।

উত্তরে কয়েকটি কৌশল জনপ্রিয় হলো। DPDK-র মতো কাঠামো kernel-কে পাশ কাটিয়ে user space-এ NIC থেকে সরাসরি packet পড়ে, কয়েকটি CPU core পুরোপুরি packet প্রক্রিয়ায় নিয়োজিত রাখে, একসাথে অনেক packet দলে প্রক্রিয়া করে। SR-IOV একটি physical NIC-কে কয়েকটি virtual NIC-এ ভাগ করে সরাসরি VM-কে দেয়, virtual switch-কে পাশ কাটিয়ে। Linux-এর XDP kernel-এর একেবারে শুরুতে ছোট প্রোগ্রাম চালায়। আর SmartNIC বা DPU-তে কিছু কাজ আবার hardware-এ নামানো হয়। মজার বিষয়: শেষ পর্যন্ত কিছু কাজ hardware-এ ফিরছে — কিন্তু এবার প্রোগ্রাম করা যায় এমন hardware-এ।

দ্বিতীয় শিক্ষা পরিচালনার। পুরোনো বাক্সের software-কে বড় VM-এ তুলে দিলে বাক্সের সব জটিলতা থেকে যায় — হাতে কনফিগারেশন, ধীর upgrade, প্রতিটি vendor-এর আলাদা ব্যবস্থাপনা। তাই অপারেটররা cloud কোম্পানিগুলোর পদ্ধতির দিকে গেলেন: ছোট microservice, container, Kubernetes দিয়ে স্বয়ংক্রিয় scale আর পুনরায় চালু, একটি অংশ upgrade করতে পুরো ব্যবস্থা থামাতে না হওয়া। 5G core-এর service-based নকশা এই চিন্তা থেকেই — যদিও বাস্তব রূপান্তর ধীর, আর বিভিন্ন অপারেটর বিভিন্ন পর্যায়ে।

বাংলাদেশের মোবাইল অপারেটররাও নেটওয়ার্ক আধুনিকায়নে virtualization ব্যবহার করছে বলে বিভিন্ন সময়ে খবর আসে; তবে কোন অপারেটর কতটা, তা প্রকাশ্যে নিশ্চিত তথ্য ছাড়া বলা ঠিক নয়।

মূল উপলব্ধি: NFV-র লাভ মূলত নমনীয়তা আর পরিচালনায়, কাঁচা গতিতে নয়। গতির ঘাটতি পূরণ হয় বিশেষ software কৌশল আর প্রোগ্রাম করা যায় এমন hardware দিয়ে; আর আসল সুফল পেতে software-কে cloud-native ভাবে নতুন করে নকশা করতে হয়।

প্র ০৫SDN controller কি নেটওয়ার্কের নিরাপত্তা বাড়ায়, না কমায়? একজন প্রতিরক্ষা-প্রকৌশলী হিসেবে controller-কে কীভাবে রক্ষা করবেন?

দুটোই সত্যি। কেন্দ্রীয়তা আক্রমণের একটি আকর্ষণীয় লক্ষ্য তৈরি করে: controller-এর নিয়ন্ত্রণ মানে প্রতিটি switch-এর টেবিলের নিয়ন্ত্রণ। Reactive নকশায় অনেক নতুন ধরনের packet পাঠিয়ে PACKET_IN-এর ঝড় তৈরি করা যায়, যা controller-কে ধীর করে — এটি একধরনের DoS (পর্ব ৫০)। Controller আর switch-এর channel এনক্রিপ্ট না থাকলে মাঝপথে বার্তা বদলানো সম্ভব। আর northbound API-তে দুর্বল পরিচয় যাচাই থাকলে একটি ভুল বা ক্ষতিকর application পুরো নীতি ভেঙে দিতে পারে।

অন্যদিকে Ethane-এর মূল উদ্দেশ্যই ছিল নিরাপত্তা: পুরো প্রতিষ্ঠানের নীতি এক জায়গায় লেখা, প্রতিটি নতুন flow অনুমতি পেলে তবেই চলবে। Controller পুরো নেটওয়ার্ক দেখে বলে অস্বাভাবিক traffic সহজে ধরা পড়ে, আর IDS কোনো আক্রান্ত যন্ত্র চিহ্নিত করলে এক FLOW_MOD-এ তাকে quarantine VLAN-এ সরানো যায় — শত switch-এ হাতে ACL বসানোর চেয়ে অনেক দ্রুত। Zero trust-ধাঁচের microsegmentation (প্রতিটি workload-এর চারপাশে আলাদা নিয়ম) cloud-এ এভাবেই বাস্তবায়িত হয়।

প্রতিরক্ষার মৌলিক কাজগুলো: control channel-এ পারস্পরিক যাচাইসহ TLS (switch আর controller দুজনেরই certificate); controller-কে আলাদা management নেটওয়ার্কে রাখা, যেখানে শুধু অনুমোদিত প্রশাসক পৌঁছান; northbound API-তে শক্ত পরিচয় যাচাই, ভূমিকাভিত্তিক অনুমতি আর প্রতিটি application কোন নিয়ম লিখতে পারবে তার সীমা; PACKET_IN-এর হার সীমিত রাখা (rate limiting) আর proactive নিয়ম দিয়ে reactive নির্ভরতা কমানো; প্রতিটি নিয়ম-বদলের লগ আর পর্যালোচনা; আর controller software নিয়মিত হালনাগাদ করা। এসব পরীক্ষা করা উচিত শুধু নিজের বা লিখিত অনুমতিপ্রাপ্ত ল্যাবে।

মূল উপলব্ধি: SDN নিরাপত্তাকে কেন্দ্রীভূত করে — ভালো আর মন্দ দুই অর্থেই। কেন্দ্রটি ভালোভাবে রক্ষিত হলে নেটওয়ার্ক আগের চেয়ে বেশি নিয়ন্ত্রিত ও দ্রুত সাড়া দেয়; অরক্ষিত হলে একটি দুর্বলতাই সব কিছুর চাবি।

অনুশীলন

খাতা-কলম নিন — টেবিল মিলিয়ে, ধাপ গুনে হিসাব করুন।

  1. হাতে trace (flow table): একটি switch-এর সারি: A — prio 400, ip_proto=udp, tp_dst=53 → output:5; B — prio 300, ipv4_dst=10.2.0.0/16 → output:2; C — prio 200, in_port=7 → drop; D — prio 0, সব wildcard → CONTROLLER. চারটি packet: (১) in_port 7, UDP, গন্তব্য 10.2.3.4:53; (২) in_port 7, TCP, 10.2.3.4:80; (৩) in_port 7, TCP, 192.0.2.9:80; (৪) in_port 1, TCP, 198.51.100.1:443. প্রতিটির জন্য কোন সারিগুলো মেলে আর কোনটি জেতে?

    (১) মেলে A (UDP 53), B (10.2.0.0/16-এর ভেতরে), C (in_port 7), D → জেতে A (৪০০), output:5. (২) A মেলে না (TCP); মেলে B, C, D → জেতে B (৩০০), output:2 — লক্ষ করুন, port 7 থেকে এলেও drop হলো না, কারণ B-র priority বেশি। (৩) মেলে C আর D → C, drop. (৪) শুধু D → table-miss, PACKET_IN. শিক্ষা: “port 7-এর সব traffic বন্ধ” নীতি চাইলে C-এর priority সবচেয়ে বেশি রাখতে হতো।

  2. আউটপুট অনুমান করুন: অংশ ৪-এর sdn_controller.js-এর শেষে এই লাইন যোগ করা হলো: console.log("EVENT: PORT_STATUS - link S3-S5 is down"); delete links["S3-S5"]; installPath("h2"); send("h2"); — EVENT লাইনের পরের ছয়টি লাইন কী হবে? চালানোর আগে Dijkstra হাতে করুন।

    এখন বাকি link: S1-S2 ১, S1-S3 ১, S3-S4 ৩, S2-S3 ১, S5-S4 ১ (S5 শুধু S4-এর সাথে যুক্ত)। S1 থেকে: S2 = ১, S3 = ১, S4 = S3 হয়ে ৪ (S2 → S3 → S4 = ৫)। পথ S1 > S3 > S4, cost ৪। S4 আর S1-এর নিয়ম আগের মতোই ঠিক (S1 → S3), S3-এর নিয়ম বদলায় (→ S4), আর S5-এর নিয়ম অর্থহীন হয়ে মুছে যায়:

      controller: Dijkstra S1 > S3 > S4 (cost 4)
      S4: rule already correct, no FLOW_MOD
      FLOW_MOD MODIFY S3: ipv4_dst=h2 => output:to-S4
      S1: rule already correct, no FLOW_MOD
      FLOW_MOD DELETE S5: stale rule for h2
    h1->h2: S1 > S3 > S4 > h2  (packet-ins so far: 1)

    এবার মাত্র একটি FLOW_MOD-এ পথ বদলাল — কারণ নতুন আর পুরোনো পথের বেশিরভাগ অংশ এক।

  3. হিসাব (reactive-এর দাম): (ক) Controller আর প্রতিটি switch-এর মাঝে একমুখী delay ১ ms, পথ হিসাবে লাগে ০.৫ ms. Controller দূরের দুটি switch-এ FLOW_MOD আর BARRIER পাঠিয়ে উত্তরের অপেক্ষা করে, তারপর ingress switch-এ FLOW_MOD আর PACKET_OUT একসাথে পাঠায়। একটি নতুন flow-এর প্রথম packet কত বাড়তি delay পায়? (খ) ২০০টি host-এর একটি নেটওয়ার্কে প্রতিটি (উৎস, গন্তব্য) জোড়ার জন্য একটি নিয়ম রাখলে মোট কতটি নিয়ম, আর শুধু গন্তব্য ধরে রাখলে? একটি switch-এর TCAM-এ ৪,০০০টি সারির জায়গা থাকলে কোনটি আঁটবে?

    (ক) PACKET_IN যেতে ১ ms + হিসাব ০.৫ ms + দূরের switch-এ FLOW_MOD/BARRIER যেতে ১ ms আর BARRIER-এর উত্তর ফিরতে ১ ms (দুটি switch-এ একসাথে, তাই ২ ms) + ingress-এ FLOW_MOD/PACKET_OUT যেতে ১ ms = ৪.৫ ms. পরের packet-গুলোর এই খরচ নেই — hardware-এ প্রতি switch-এ মাইক্রোসেকেন্ডের হিসাব। Controller যদি দূরের শহরে থাকে (একমুখী ২০ ms), প্রথম packet-এর বাড়তি delay ৮০ ms ছাড়িয়ে যায় — এ কারণেই controller কাছে রাখা হয় বা proactive নকশা নেওয়া হয়।

    (খ) জোড়া = ২০০ × ১৯৯ = ৩৯,৮০০; শুধু গন্তব্য = ২০০. ৪,০০০ সারির TCAM-এ প্রথমটি আঁটবে না (প্রায় ১০ গুণ বড়), দ্বিতীয়টি আরামে আঁটে। বাস্তবে একটি নির্দিষ্ট switch-এ শুধু তার ওপর দিয়ে যাওয়া জোড়ার নিয়ম লাগে, তবু মাঝের switch-এ সংখ্যাটি দ্রুত বাড়ে।

  4. কমান্ড লিখুন (ল্যাবে, Open vSwitch): নিজের Mininet বা VM ল্যাবে br0 নামের একটি Open vSwitch bridge আছে। অংশ ৩-এর F1, F2 আর table-miss সারির সমান তিনটি নিয়ম ovs-ofctl add-flow দিয়ে লিখুন, তারপর counter দেখার কমান্ড দিন।
    sudo ovs-ofctl add-flow br0 "priority=300,tcp,tp_dst=23,actions=drop"
    sudo ovs-ofctl add-flow br0 "priority=200,ip,nw_dst=10.0.2.0/24,actions=output:2"
    sudo ovs-ofctl add-flow br0 "priority=0,actions=CONTROLLER"
    sudo ovs-ofctl dump-flows br0      # n_packets, n_bytes = counters

    tcp লিখলে ovs-ofctl নিজেই eth_type=IPv4, ip_proto=6 prerequisite বসায়; ip মানে IPv4. শুধু নিজের ল্যাবে চালান — চালু নেটওয়ার্কের switch-এ “priority=0 … CONTROLLER” বসালে controller না থাকলে traffic আটকে যেতে পারে। OpenFlow ১.৩-এর বৈশিষ্ট্য লাগলে -O OpenFlow13 দিতে হয়; বিস্তারিত man ovs-ofctl-এ।

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

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

ক্রমReactive SDN-এ একটি নতুন flow-এর প্রথম packet — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Ingress switch-এ কোনো নিয়ম মেলে না, table-miss সারি জেতে
  2. Switch controller-কে PACKET_IN পাঠায়
  3. Controller topology থেকে পথ হিসাব করে
  4. পথের দূরের switch-গুলোতে FLOW_MOD, শেষে ingress switch-এ
  5. PACKET_OUT দিয়ে আটকে থাকা প্রথম packet ছাড়া হয়
  6. একই flow-এর পরের packet শুধু data plane-এ চলে

একটি OpenFlow switch-এ দুটি সারি: X — priority 100, match ipv4_dst=10.0.0.0/8 → output:1; Y — priority 200, match tp_dst=80 → output:2. গন্তব্য 10.1.1.1, TCP port 80-এর একটি packet কোথায় যাবে?

  • output:1, কারণ X-এর prefix নির্দিষ্ট
  • Table-miss, controller-এ
  • output:2, কারণ Y-এর priority বেশি
  • দুটো port-এই কপি যায়

SDN-এ controller-এর ভূমিকা সম্পর্কে কোন বাক্যটি সঠিক?

  • প্রতিটি packet controller ঘুরে গন্তব্যে যায়
  • Controller flow table লেখে আর ব্যতিক্রম সামলায়; সাধারণ packet switch-এই পার হয়
  • Controller সবসময় একটিমাত্র সার্ভার, প্রতিলিপি রাখা যায় না
  • Controller switch-এর সাথে northbound API দিয়ে কথা বলে

একটি topology-তে link-এর cost: S1-S2 = 1, S2-S4 = 1, S1-S3 = 1, S3-S4 = 3, S3-S5 = 1, S5-S4 = 1, S2-S3 = 1. S2-S4 link নষ্ট হওয়ার পর S1 থেকে S4-এর সবচেয়ে কম cost-এর পথ কোনটি?

  • S1 > S2 > S4, cost 2
  • S1 > S3 > S4, cost 4
  • S1 > S2 > S3 > S5 > S4, cost 4
  • S1 > S3 > S5 > S4, cost 3

৩০০টি host-এর একটি নেটওয়ার্কে প্রতিটি (উৎস, গন্তব্য) জোড়ার জন্য একটি করে নিখুঁত flow নিয়ম রাখলে মোট কতটি নিয়ম লাগবে, আর শুধু গন্তব্য ধরে (উৎস wildcard) রাখলে?

  • ৮৯,৭০০ আর ৩০০
  • ৯০,০০০ আর ৩০০
  • ৪৪,৮৫০ আর ৩০০
  • ৮৯,৭০০ আর ২৯৯

ETSI-র NFV কাঠামোয় কোন অংশ একটি VNF চালু, বড়-ছোট (scale) আর বন্ধ করার জীবনচক্র সামলায়?

  • NFVI
  • VNF Manager (MANO-র অংশ)
  • Southbound API
  • VNF নিজে

একটি policy বদলের সময় ingress switch packet-এ সংস্করণ-চিহ্ন বসায়, ভেতরের switch-এ পুরোনো আর নতুন দুই সংস্করণের নিয়ম কিছুক্ষণ একসাথে থাকে। এই কৌশলের মূল লাভ কী?

  • TCAM-এ কম জায়গা লাগে
  • নিয়ম বদল সবচেয়ে দ্রুত হয়
  • প্রতিটি packet পুরো পথে হয় শুধু পুরোনো, নয় শুধু নতুন নীতি দেখে
  • Controller আর single point of failure থাকে না

SDN আর NFV-র সম্পর্ক সম্পর্কে কোনটি সঠিক?

  • স্বাধীন কিন্তু পরিপূরক — একটি ছাড়া অন্যটি চলে, একসাথে বেশি কার্যকর
  • NFV চালাতে SDN বাধ্যতামূলক
  • দুটি একই প্রযুক্তির দুই নাম
  • SDN শুধু টেলিকমে, NFV শুধু data center-এ

শব্দকোষ

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

মনে রাখুন

  1. SDN = control plane আলাদা আর যৌক্তিকভাবে কেন্দ্রে: switch flow table মানে, controller (প্রতিলিপিসহ) southbound API-তে টেবিল লেখে, application northbound API-তে নীতি দেয়। চার ধারণা: flow-ভিত্তিক forwarding, control-data ভাগ, বাইরের নিয়ন্ত্রণ, প্রোগ্রাম করা যায় এমন নেটওয়ার্ক।
  2. Flow entry = match (wildcard-সহ) + priority + action + counter + timeout. Table-miss → PACKET_IN → FLOW_MOD (দূরের switch আগে) → PACKET_OUT; পরের packet controller ছাড়া।
  3. Proactive বনাম reactive: আগেভাগে নিয়ম মানে দেরি নেই কিন্তু TCAM বেশি; দরকারে নিয়ম মানে সূক্ষ্ম নীতি কিন্তু প্রথম packet-এ delay আর controller-এ চাপ। বাস্তবে মিশ্র।
  4. এক বিমূর্ততা: switch, router (priority = prefix-এর দৈর্ঘ্য), firewall, NAT, LB — সবই match-plus-action; P4 parser আর টেবিলের নকশাও প্রোগ্রাম করতে দেয়। চ্যালেঞ্জ: controller-এর প্রতিলিপি, scale, নিরাপত্তা, আর two-phase consistent update.
  5. NFV = network function software-এ: VNF চলে NFVI-তে, MANO (NFVO, VNFM, VIM) সামলায়, SFC ক্রম ঠিক করে; CNF আর 5G-র SBA এর cloud-native রূপ। প্রতিদিনের SDN হলো NETCONF/YANG, Ansible আর SD-WAN.

পরের পর্বে: SDN আর virtual switch-এর ধারণা নিয়ে cloud-এ — VPC আর subnet, security group, Docker-এর bridge আর veth জোড়া, Kubernetes-এর pod নেটওয়ার্ক আর CNI.

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

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