Socket.IO — এটি কী, রিয়েল-টাইম ইন্টারঅ্যাকশনের জন্য লাইব্রেরি

লেখক: IT Sectr প্রকাশিত: 2026-06-01 পড়ার সময়: 8 মিনিট

Socket.IO হল ক্লায়েন্ট এবং সার্ভারের মধ্যে দ্বিমুখী রিয়েল-টাইম যোগাযোগের জন্য একটি লাইব্রেরি যা WebSocket ভিত্তিক এবং স্বয়ংক্রিয় ফলব্যাক সহ। এটি চ্যাট, গেম এবং সহযোগী সম্পাদকগুলিতে তাৎক্ষণিক ডেটা স্থানান্তরের জন্য নির্ভরযোগ্য ট্রান্সপোর্ট সরবরাহ করে। অফিসিয়াল Socket.IO ডকুমেন্টেশন (2024) অনুসারে, লাইব্রেরিটি সঠিক কনফিগারেশনে একটি একক সার্ভারে দশ লাখেরও বেশি সংযোগ পরিচালনা করে।

মূল পয়েন্ট

  • Socket.IO — রিয়েল-টাইম যোগাযোগের জন্য একটি লাইব্রেরি, যা WebSocket এবং HTTP long-polling-এর উপরে কাজ করে।
  • দ্বিমুখী যোগাযোগ — ক্লায়েন্ট এবং সার্ভার উভয়ই যেকোনো সময় ডেটা পাঠানো শুরু করতে পারে।
  • স্বয়ংক্রিয় ফলব্যাক — WebSocket অনুপলব্ধ হলে কোড পরিবর্তন ছাড়াই HTTP long-polling-এ সুইচ করে।
  • রুম এবং নামস্থান — লক্ষ্যযুক্ত বার্তা বিতরণের জন্য সংযোগগুলির গ্রুপিং।
  • ইভেন্ট-চালিত মডেল — নির্বিচারে পেলোড সহ নামযুক্ত ইভেন্টের মাধ্যমে ডেটা আদান-প্রদান।

Socket.IO কী?

Socket.IO হল একটি ওপেন-সোর্স JavaScript লাইব্রেরি যা ক্লায়েন্ট এবং সার্ভারের মধ্যে দ্বিমুখী ইভেন্ট-চালিত যোগাযোগের জন্য। এটি 2010 সালে ডেভেলপার Guillermo Rauch দ্বারা তৈরি করা হয়েছিল এবং তারপর থেকে এটি Node.js-এ রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড হয়ে উঠেছে।

নেটিভ WebSocket API-এর বিপরীতে, Socket.IO অতিরিক্ত অ্যাবস্ট্র্যাকশন সরবরাহ করে: রুম, নামস্থান, স্বয়ংক্রিয় পুনঃসংযোগ এবং বাইনারি ডেটা টাইপ। লাইব্রেরিটি WebSocket-এর আলাদা বাস্তবায়ন নয় — এটি ট্রান্সপোর্ট লেয়ার হিসেবে Engine.IO ব্যবহার করে, যা প্রথমে HTTP long-polling সংযোগ স্থাপন করে, তারপর WebSocket-এ আপগ্রেড করার চেষ্টা করে।

npm পরিসংখ্যান (2025) অনুসারে, সাপ্তাহিকভাবে socket.io প্যাকেজের 12 মিলিয়নেরও বেশি কপি ডাউনলোড করা হয়, যা এটিকে Node.js ইকোসিস্টেমের সবচেয়ে জনপ্রিয় লাইব্রেরিগুলির মধ্যে একটি করে তুলেছে। Socket.IO সমস্ত আধুনিক প্ল্যাটফর্মে সমর্থিত: ব্রাউজার, iOS, Android, React Native এবং ডেস্কটপ অ্যাপ্লিকেশন।

ইতিহাস এবং সংস্করণ

Socket.IO সংস্করণ 1.0 2014 সালে প্রকাশিত হয়েছিল এবং নামস্থান ধারণাটি চালু করেছিল, যা একটি একক TCP সংযোগের মাধ্যমে একাধিক লজিক্যাল চ্যানেল মাল্টিপ্লেক্স করার অনুমতি দেয়। সংস্করণ 2.0 (2017) বাইনারি ডেটার জন্য সমর্থন যুক্ত করেছে এবং পার্সিং কর্মক্ষমতা উন্নত করেছে। বর্তমান সংস্করণ 4.x (2020–2025) TypeScript-এর জন্য সম্পূর্ণ সমর্থন, স্কেলিংয়ের জন্য ফ্ল্যাগশিপ অ্যাডাপ্টার মোড এবং উন্নত ব্যাকওয়ার্ড সামঞ্জস্যতা অন্তর্ভুক্ত করে।

প্রতিটি প্রধান রিলিজ API ব্যাকওয়ার্ড সামঞ্জস্যতা বজায় রাখে — একটি socket.io@2 ক্লায়েন্ট একটি বিশেষ সামঞ্জস্য মোডের মাধ্যমে socket.io@4 সার্ভারের সাথে সংযোগ করতে পারে। এটি দীর্ঘস্থায়ী প্রকল্পগুলির জন্য গুরুত্বপূর্ণ যেখানে ক্লায়েন্ট-সাইড আপগ্রেড ধীরে ধীরে ঘটে।

Socket.IO কীভাবে কাজ করে

Socket.IO আর্কিটেকচার দুটি উপাদান নিয়ে গঠিত: সার্ভার মডিউল (npm প্যাকেজ socket.io) এবং ক্লায়েন্ট মডিউল (npm প্যাকেজ socket.io-client)। সার্ভারটি Node.js HTTP(S) সার্ভারের উপরে চলে এবং ট্রান্সপোর্ট লেয়ার পরিচালনার জন্য Engine.IO ব্যবহার করে।

প্রাথমিক সংযোগে, ক্লায়েন্ট সার্ভারে HTTP অনুরোধ পাঠায়। Engine.IO সাড়া দেয় এবং একটি long-polling সংযোগ স্থাপন করে। এর পরে, ক্লায়েন্ট ট্রান্সপোর্ট প্রোটোকল WebSocket-এ আপগ্রেড করার অনুরোধ পাঠায়। যদি সার্ভার WebSocket সমর্থন করে, আপগ্রেডটি একটি TCP সেশনের মধ্যে ঘটে। যদি না হয়, সংযোগটি long-polling-এ থাকে এবং অ্যাপ্লিকেশন কোডে কোনো পরিবর্তনের প্রয়োজন হয় না।

Socket.IO কর্মক্ষমতা পরীক্ষা (2024) অনুসারে, WebSocket ব্যবহার করার সময় লেটেন্সি প্রতি বার্তায় 2–5 ms, যেখানে long-polling HTTP ওভারহেডের কারণে 150–300 ms যোগ করে। ট্রান্সপোর্ট নির্বাচন ডেভেলপারের কাছে স্বচ্ছ।

Engine.IO প্রোটোকল

Engine.IO হল নিম্ন-স্তরের ট্রান্সপোর্ট লেয়ার যার উপর Socket.IO নির্মিত। এটি সংযোগ স্থাপন, ট্রান্সপোর্ট নির্বাচন, heartbeat (ping/pong) এবং সংযোগ সমাপ্তি পরিচালনা করে। Engine.IO প্যাকেটের প্রধান ধরনগুলি হল: open (আরম্ভ), close (সমাপ্তি), ping/pong (জীবিত রাখা), upgrade (ট্রান্সপোর্ট পরিবর্তন) এবং message (ডেটা)।

Socket.IO Engine.IO-এর উপরে তার ইভেন্ট-চালিত মডেল তৈরি করে — ডেভেলপার এটির সাথেই কাজ করে। প্রতিটি Socket.IO বার্তা বিতরণ নিশ্চিতকরণের জন্য একটি অনন্য শনাক্তকারী সহ Engine.IO প্যাকেটে মোড়ানো হয়।

Socket.IO-এর মূল বৈশিষ্ট্য

Socket.IO এমন বৈশিষ্ট্যগুলির একটি সেট সরবরাহ করে যা নেটিভ WebSocket API-তে অনুপস্থিত এবং রিয়েল-টাইম অ্যাপ্লিকেশন ডেভেলপমেন্টকে উল্লেখযোগ্যভাবে সহজ করে তোলে। আসুন মূল বৈশিষ্ট্যগুলি দেখি।

স্বয়ংক্রিয় পুনঃসংযোগ — ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হলে এক্সপনেনশিয়াল ব্যাকঅফ (100 ms, 200 ms, 400 ms... সর্বোচ্চ পর্যন্ত) সহ স্বয়ংক্রিয়ভাবে সংযোগ পুনরুদ্ধার করে। Socket.IO ডকুমেন্টেশন (2024) অনুসারে, পুনঃচেষ্টা সেটিংস reconnectionDelay এবং reconnectionAttempts প্যারামিটারের মাধ্যমে উপলব্ধ। এই বিকল্পটি মোবাইল অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ যেখানে নেটওয়ার্ক পরিবর্তনের সময় সংযোগ বিঘ্নিত হতে পারে।

রুম সমর্থন — সার্ভার সকেটগুলিকে রুমে গ্রুপ করতে পারে এবং শুধুমাত্র একটি নির্দিষ্ট রুমের সদস্যদের বার্তা পাঠাতে পারে। রুমগুলির স্পষ্ট সৃষ্টির প্রয়োজন নেই — প্রথম সকেট যোগ দেওয়ার সময় এগুলি তৈরি হয়। রুমগুলি প্রক্রিয়া স্তরে প্রয়োগ করা হয় এবং বিশেষ অ্যাডাপ্টার ছাড়া বিভিন্ন সার্ভারের মধ্যে ভাগ করা হয় না।

নামস্থান — একক সংযোগে যোগাযোগ চ্যানেলের যৌক্তিক বিভাজন। উদাহরণস্বরূপ, চ্যাট বার্তাগুলির জন্য /chat নামস্থান এবং বিজ্ঞপ্তিগুলির জন্য /notifications। প্রতিটি নামস্থানের নিজস্ব রুম, মিডলওয়্যার এবং হ্যান্ডলার রয়েছে। নামস্থানগুলি একটি TCP সংযোগের মাধ্যমে মাল্টিপ্লেক্স হয়, যা সম্পদ সাশ্রয় করে।

বিতরণ নিশ্চিতকরণ — বার্তা পাঠানোর সময়, একটি কলব্যাক ফাংশন পাস করা যেতে পারে যা সার্ভার প্রাপ্তি নিশ্চিত করার সময় কল করা হবে। এটি প্রতিটি প্যাকেটের জন্য একটি অনন্য শনাক্তকারীর মাধ্যমে প্রয়োগ করা হয়। নিশ্চিতকরণ প্রক্রিয়া নিশ্চিত করে যে গুরুত্বপূর্ণ বার্তাগুলি (যেমন, পেমেন্ট লেনদেন) প্রাপকের কাছে পৌঁছায়।

Socket.IO বনাম WebSocket: তুলনা

Socket.IO এবং নেটিভ WebSocket-এর মধ্যে নির্বাচন প্রকল্পের প্রয়োজনীয়তার উপর নির্ভর করে। WebSocket একটি মানক প্রোটোকল (RFC 6455) যা সমস্ত আধুনিক ব্রাউজার দ্বারা সমর্থিত। Socket.IO একটি লাইব্রেরি যা ট্রান্সপোর্ট হিসেবে WebSocket ব্যবহার করে তবে অতিরিক্ত বৈশিষ্ট্য যোগ করে।

বৈশিষ্ট্যSocket.IOWebSocket
ট্রান্সপোর্টWebSocket + HTTP long-polling (ফলব্যাক)শুধুমাত্র WebSocket
ইভেন্ট মডেলJSON পেলোড সহ নামযুক্ত ইভেন্টশুধুমাত্র টেক্সট/বাইনারি ফ্রেম
রুমঅন্তর্নির্মিত সকেট গ্রুপিংম্যানুয়াল বাস্তবায়ন প্রয়োজন
স্বয়ংক্রিয় পুনঃসংযোগঅন্তর্নির্মিতম্যানুয়াল বাস্তবায়ন প্রয়োজন
বিতরণ নিশ্চিতকরণকলব্যাক সহ ACK প্রক্রিয়াপ্রোটোকল এক্সটেনশনের মাধ্যমে উপলব্ধ
স্কেলিংঅ্যাডাপ্টার (Redis, MongoDB, Cluster)নিজস্ব অবকাঠামো প্রয়োজন
লাইব্রেরির আকার~50 KB (ক্লায়েন্ট, gzip)ব্রাউজারে নির্মিত (0 KB)

যদি আপনার প্রকল্পের সর্বোচ্চ কর্মক্ষমতা এবং ন্যূনতম ক্লায়েন্ট আকারের প্রয়োজন হয় — নেটিভ WebSocket বেছে নিন। আপনার যদি নির্ভরযোগ্য বিতরণ, গ্রুপিং এবং একটি ইভেন্ট-চালিত মডেলের প্রয়োজন হয় — Socket.IO প্রস্তুত অ্যাবস্ট্র্যাকশনের কারণে বিকাশের সময় 2–3 গুণ কমিয়ে দেবে।

State of JS 2024 জরিপ অনুসারে, 67% রিয়েল-টাইম অ্যাপ্লিকেশন ডেভেলপার সুবিধাজনক API এবং সীমান্ত ক্ষেত্রগুলির (নেটওয়ার্ক বিচ্ছিন্নতা, পুনঃসংযোগ, বাইনারি ডেটা) অন্তর্নির্মিত পরিচালনার কারণে Socket.IO পছন্দ করেন।

প্রকল্পে Socket.IO কীভাবে সংযুক্ত করবেন

Socket.IO ইনস্টল করা দুটি প্যাকেজ প্রয়োজন: সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড। আসুন একটি Node.js প্রকল্পের জন্য মৌলিক সেটআপ দেখি। সার্ভার একটি HTTP সার্ভার তৈরি করে, Socket.IO আরম্ভ করে এবং ক্লায়েন্ট সংযোগ এবং বিচ্ছিন্নতা ইভেন্ট পরিচালনা করে।

Socket.IO ডকুমেন্টেশন (2024) অনুসারে, সার্ভারটি অন্তর্নির্মিত http মডিউল ব্যবহার করে Express ছাড়া শুরু করা যেতে পারে, তবে বাস্তব প্রকল্পগুলিতে HTTP অনুরোধ রাউটিংয়ের জন্য সাধারণত Express বা Fastify ব্যবহার করা হয়।

Node.js-এ সার্ভার-সাইড কোড

js
const express = require('express');
const http = require('http');
const Server = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = new Server(server, {
    cors: { origin: '*' }
});

io.on('connection', (socket) => {
    console.log('ক্লায়েন্ট সংযুক্ত:', socket.id);

    socket.emit('welcome', { message: 'Hello from server' });

    socket.on('disconnect', () => {
        console.log('ক্লায়েন্ট সংযোগ বিচ্ছিন্ন');
    });
});

server.listen(3000, () => {
    console.log('সার্ভার পোর্ট 3000-এ চলছে');
});

ব্রাউজারে ক্লায়েন্ট-সাইড কোড

js
import { io } from 'socket.io-client';

const socket = io('http://localhost:3000', {
    transports: ['websocket', 'polling'],
    reconnectionDelay: 1000
});

socket.on('welcome', (data) => {
    console.log(data.message);
});

socket.emit('chat message', {
    user: 'Alice',
    text: 'Hello everyone!'
});

Socket.IO-তে ইভেন্ট এবং রুম

Socket.IO ইভেন্ট মডেল নামযুক্ত ইভেন্টের উপর ভিত্তি করে। সার্ভার এবং ক্লায়েন্ট একটি নির্দিষ্ট ইভেন্ট নামের সাথে আবদ্ধ বার্তা পাঠায় এবং গ্রহণ করে। পেলোড একটি স্ট্রিং, JSON অবজেক্ট বা বাইনারি ডেটা (Buffer, ArrayBuffer, Blob) হতে পারে।

প্রতিটি ইভেন্ট ACK (স্বীকৃতি) সমর্থন করে — একটি কলব্যাক ফাংশন পাস করা যা প্রাপক দ্বারা ইভেন্ট প্রক্রিয়াকরণের পরে প্রেরকের পক্ষে সম্পাদিত হয়। এটি ইভেন্ট মডেলের উপরে অনুরোধ-প্রতিক্রিয়া প্যাটার্ন বাস্তবায়নের অনুমতি দেয়। ACK তখনই কাজ করে যখন প্রাপক স্পষ্টভাবে কলব্যাকে কল করে।

Socket.IO ডকুমেন্টেশন (2024) অনুসারে, সর্বোত্তম কর্মক্ষমতার জন্য একটি একক বার্তার সর্বোচ্চ আকার 1 MB-এর বেশি হওয়া উচিত নয়। বড় বার্তাগুলিকে টুকরোতে বিভক্ত করা উচিত বা একটি পৃথক চ্যানেলের মাধ্যমে পাঠানো উচিত।

রুম নিয়ে কাজ করা

js
io.on('connection', (socket) => {
    socket.join('room-1');

    socket.to('room-1').emit('user joined', {
        userId: socket.id
    });

    io.to('room-1').emit('message', {
        text: 'Broadcast to room'
    });

    socket.leave('room-1');
});

Socket.IO-এর স্কেলিং

অনুভূমিক স্কেলিং-এর জন্য একাধিক সার্ভার প্রক্রিয়ার মধ্যে অবস্থা ভাগ করে নেওয়ার সমস্যা সমাধানের প্রয়োজন। রুম, নামস্থান এবং সংযুক্ত সকেটের তালিকা একটি একক প্রক্রিয়ার মেমরিতে সংরক্ষিত থাকে এবং অ্যাডাপ্টার ছাড়া অন্যান্য প্রক্রিয়াগুলিতে দৃশ্যমান হয় না।

অফিসিয়াল Socket.IO অ্যাডাপ্টার: redis (Redis Pub/Sub-এর মাধ্যমে), mongodb (MongoDB change streams-এর মাধ্যমে), cluster (Node.js ক্লাস্টার মাল্টিপ্রসেস মোডের জন্য)। অ্যাডাপ্টার Socket.IO ইন্সট্যান্সের মধ্যে বার্তা ব্রোকার হিসেবে কাজ করে। যখন একটি ইভেন্ট একটি রুমে পাঠানো হয়, অ্যাডাপ্টার এটি Redis-এ প্রকাশ করে এবং সমস্ত সার্ভার বিজ্ঞপ্তি পায়।

Socket.IO লোড টেস্টিং (2024) অনুসারে, Redis অ্যাডাপ্টারের সাথে 4টি সার্ভারের একটি ক্লাস্টার 10 ms-এর কম লেটেন্সি সহ 400,000 সমবর্তী সংযোগ পর্যন্ত পরিচালনা করে। অ্যাডাপ্টার ছাড়া, একটি একক Node.js প্রক্রিয়ার সর্বোচ্চ ক্ষমতা 1 GB মেমরির সাথে প্রায় 100,000 সংযোগ।

Redis অ্যাডাপ্টার কনফিগারেশন

js
const Server = require('socket.io');
const RedisAdapter = require('@socket.io/redis-adapter');
const Redis = require('ioredis');

const pubClient = new Redis({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
const io = new Server(server);
io.adapter(RedisAdapter(pubClient, subClient));

Kubernetes বা Docker Swarm ব্যবহার করার সময়, সেশন অ্যাফিনিটি (স্টিকি সেশন) কনফিগার করার পরামর্শ দেওয়া হয় যাতে একই ক্লায়েন্টের অনুরোধ একই সার্ভারে যায়; অন্যথায় প্রতিটি পুনঃসংযোগে অ্যাসাইনমেন্ট পরিবর্তন হতে পারে।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

Socket.IO নেটিভ WebSocket থেকে কীভাবে আলাদা?

Socket.IO নামযুক্ত ইভেন্ট সহ একটি ইভেন্ট মডেল, স্বয়ংক্রিয় পুনঃসংযোগ, রুম সমর্থন এবং HTTP long-polling-এ ফলব্যাক সরবরাহ করে। নেটিভ WebSocket একটি নিম্ন-স্তরের প্রোটোকল যার ন্যূনতম API রয়েছে এবং এই মেকানিক্সগুলির ম্যানুয়াল বাস্তবায়ন প্রয়োজন।

Socket.IO কি Node.js ছাড়া ব্যবহার করা যেতে পারে?

হ্যাঁ, Python (python-socketio), Java (netty-socketio), Go (go-socketio) এবং অন্যান্য ভাষার জন্য সার্ভার অংশের তৃতীয়-পক্ষ বাস্তবায়ন বিদ্যমান। socket.io-client JavaScript, Swift, Kotlin এবং C++-এর জন্য উপলব্ধ।

Socket.IO কতগুলি সমবর্তী সংযোগ পরিচালনা করতে পারে?

Socket.IO সহ একটি একক Node.js প্রক্রিয়া 1 GB RAM-এর সাথে 100,000 সংযোগ পর্যন্ত পরিচালনা করে। Redis অ্যাডাপ্টার এবং 4টি সার্ভারের সাথে, ক্লাস্টারটি 400,000 সমবর্তী ক্লায়েন্ট পর্যন্ত পরিচালনা করতে পারে।

Socket.IO কি মোবাইল প্ল্যাটফর্ম সমর্থন করে?

হ্যাঁ, iOS-এর জন্য Swift-এ একটি অফিসিয়াল ক্লায়েন্ট আছে, Android-এর জন্য — Java/Kotlin-এ একটি ক্লায়েন্ট আছে। React Native-এর জন্য স্ট্যান্ডার্ড JavaScript socket.io-client ব্যবহার করা হয়।

কীভাবে Socket.IO সংযোগ নিরাপত্তা নিশ্চিত করবেন?

HTTP/WS-এর পরিবর্তে HTTPS/WSS ব্যবহার করুন, টোকেন (JWT)-এর মাধ্যমে প্রমাণীকরণের জন্য মিডলওয়্যার কনফিগার করুন, ভ্যালিডেটরের মাধ্যমে আউটগোয়িং ইভেন্ট সীমা নির্ধারণ করুন এবং DDoS সুরক্ষার জন্য রেট লিমিটিং ব্যবহার করুন।

সারাংশ

  • Socket.IO দ্বিমুখী রিয়েল-টাইম যোগাযোগের জন্য একটি লাইব্রেরি, যা WebSocket-এর উপরে নির্মিত এবং HTTP long-polling-এ স্বয়ংক্রিয় ফলব্যাক সহ।
  • ইভেন্ট-চালিত মডেল নামযুক্ত ইভেন্ট এবং ACK নিশ্চিতকরণ সহ নেটিভ WebSocket-এর তুলনায় উন্নয়নকে সহজ করে।
  • রুম এবং নামস্থান ক্লায়েন্টদের গ্রুপ করতে এবং লজিক্যাল যোগাযোগ চ্যানেলগুলিকে আলাদা করতে দেয়।
  • স্বয়ংক্রিয় পুনঃসংযোগ এক্সপনেনশিয়াল ব্যাকঅফ সহ মোবাইল নেটওয়ার্কগুলিতে স্থিতিশীলতা নিশ্চিত করে।
  • অনুভূমিক স্কেলিং অ্যাপ্লিকেশন কোড পরিবর্তন না করেই Redis বা MongoDB অ্যাডাপ্টারের মাধ্যমে বাস্তবায়িত হয়।
  • অ্যাডাপ্টারগুলি Pub/Sub ব্রোকারের মাধ্যমে প্রক্রিয়াগুলির মধ্যে অবস্থা ভাগ করে নেওয়ার সমস্যার সমাধান করে।
  • সহজ প্রকল্পগুলির জন্য ন্যূনতম ট্রান্সপোর্ট প্রয়োজনীয়তার সাথে, নেটিভ WebSocket বেছে নিন; নির্ভরযোগ্যতা প্রয়োজন এমন উৎপাদন সিস্টেমের জন্য Socket.IO বেছে নিন।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন