Signaling Server — WebRTC इंफ्रास्ट्रक्चर का एक सर्वर घटक है जो कनेक्शन स्थापित करने और समाप्त करने के लिए पीयर्स के बीच मेटाडेटा के आदान-प्रदान को सक्षम बनाता है। मीडिया ट्रैफ़िक के विपरीत, सिग्नलिंग किसी भी प्रोटोकॉल — WebSocket, HTTP, XMPP या SIP पर प्रेषित की जा सकती है। MDN Web Docs, 2024 के अनुसार, सिग्नलिंग किसी भी WebRTC एप्लिकेशन का अनिवार्य घटक है, क्योंकि प्रोटोकॉल सिग्नलिंग संदेशों के आदान-प्रदान का कोई विशिष्ट तरीका परिभाषित नहीं करता है।
मुख्य बिंदु
Signaling Server — एक नेटवर्क सेवा है जो दो या अधिक पीयर्स के बीच WebRTC कनेक्शन स्थापित करने की प्रक्रिया के समन्वय के लिए जिम्मेदार है। यह मीडिया डेटा (ऑडियो, वीडियो, DataChannel डेटा) प्रेषित नहीं करता, बल्कि केवल पीयर डिस्कवरी और कनेक्शन पैरामीटर वार्ता के लिए आवश्यक नियंत्रण जानकारी प्रेषित करता है। सफल P2P चैनल स्थापित होने के बाद, Signaling Server की अब आवश्यकता नहीं रह सकती, लेकिन कुछ आर्किटेक्चर में यह बाद के सिग्नल आदान-प्रदान (जैसे कॉल समाप्ति, प्रतिभागियों को जोड़ना) के लिए बना रहता है।
सिग्नलिंग आर्किटेक्चर में तीन घटक शामिल हैं: Signaling Server, Signal Channel (क्लाइंट और सर्वर के बीच ट्रांसपोर्ट प्रोटोकॉल) और क्लाइंट API (आमतौर पर ब्राउज़र के WebRTC स्टैक में निर्मित)। WebRTC विनिर्देश (W3C, 2024) जानबूझकर सिग्नलिंग प्रोटोकॉल को मानकीकृत नहीं करता — डेवलपर्स अपने एप्लिकेशन के लिए उपयुक्त कोई भी ट्रांसपोर्ट चुन सकते हैं। यह लचीला दृष्टिकोण वेब एप्लिकेशन के लिए WebSocket, चैट सिस्टम के लिए XMPP या दूरसंचार बुनियादी ढांचे के साथ एकीकरण के लिए SIP का उपयोग करने की अनुमति देता है।
WebRTC कनेक्शन स्थापित करने से पहले, पीयर्स को तीन प्रकार के संदेशों का आदान-प्रदान करना होता है: सत्र विवरण (offer और answer), ICE उम्मीदवार और सत्र समाप्ति/संशोधन जानकारी। Signaling Server इन संदेशों को पीयर्स के बीच पते के लिए कक्ष या उपयोगकर्ता पहचानकर्ताओं का उपयोग करके रूट करता है। मानक पैटर्न एक “कक्ष” बनाना है जहां दो प्रतिभागी जुड़ते हैं, और सर्वर प्रत्येक प्रतिभागी से केवल उसके वार्ताकार को संदेश रीले करता है।
Signaling Server निम्नलिखित विशिष्ट WebRTC कनेक्शन स्थापना प्रोटोकॉल को कार्यान्वित करता है। पीयर WebSocket (या अन्य ट्रांसपोर्ट) के माध्यम से सर्वर से जुड़ते हैं और एक कक्ष में पंजीकृत होते हैं। पीयर A (आरंभकर्ता) RTCPeerConnection.createOffer() के माध्यम से एक offer (आउटगोइंग मीडिया स्ट्रीम का SDP विवरण) बनाता है, इसे स्थानीय विवरण के रूप में सेट करता है और Signaling Server को भेजता है। सर्वर offer को पीयर B को रीले करता है। पीयर B offer प्राप्त करता है, इसे रिमोट विवरण के रूप में सेट करता है, createAnswer() के माध्यम से answer बनाता है, इसे स्थानीय विवरण के रूप में सेट करता है और सर्वर के माध्यम से वापस भेजता है। इस प्रक्रिया को SDP Offer/Answer कहा जाता है।
SDP आदान-प्रदान के समानांतर, प्रत्येक पीयर ICE उम्मीदवारों (host, srflx, relay) को एकत्र करता है और उन्हें Signaling Server के माध्यम से दूसरे पीयर को भेजता है। रिमोट पीयर प्राप्त उम्मीदवारों को RTCPeerConnection.addIceCandidate() के माध्यम से जोड़ता है। ICE प्रक्रिया कार्यशील पथ खोजने के लिए उम्मीदवारों के सभी संयोजनों का परीक्षण करती है। एक बार कार्यशील पथ मिल जाने पर (आमतौर पर 1–5 सेकंड के भीतर), मीडिया ट्रैफ़िक सीधे पीयर्स के बीच प्रवाहित होने लगता है, और Signaling Server अब डेटा प्रेषण में भाग नहीं लेता — अगली नियंत्रण घटना (कॉल समाप्ति, स्ट्रीम गुणवत्ता परिवर्तन) तक इसकी भूमिका समाप्त हो जाती है।
संदेश पते के लिए, Signaling Server कक्ष (room) या चैनल तंत्र का उपयोग करता है। प्रत्येक नया WebRTC सत्र एक अद्वितीय पहचानकर्ता (आमतौर पर UUID) के साथ एक कक्ष बनाता है। आरंभकर्ता कक्ष बनाता है और दूसरे पीयर के जुड़ने की प्रतीक्षा करता है। दूसरा पीयर बाहरी चैनल (जैसे आमंत्रण लिंक) के माध्यम से प्राप्त ID का उपयोग करके कक्ष में शामिल होता है। सर्वर कक्षों का एक मानचित्र बनाए रखता है, जहां प्रत्येक ID जुड़े क्लाइंट की सूची से मेल खाती है। जब प्रतिभागियों की संख्या दो तक पहुंच जाती है, तो सर्वर उनके बीच सिग्नलिंग संदेशों को रीले करना शुरू कर देता है।
Signaling Server विभिन्न ट्रांसपोर्ट प्रोटोकॉल का उपयोग कर सकता है, जिनमें से प्रत्येक के अपने लाभ और हानियाँ हैं। प्रोटोकॉल का चुनाव एप्लिकेशन के प्रकार, बुनियादी ढांचे की बाधाओं और संगतता आवश्यकताओं पर निर्भर करता है। नीचे सबसे सामान्य प्रोटोकॉल और उनकी विशेषताएँ दी गई हैं।
| प्रोटोकॉल | ट्रांसपोर्ट | लाभ | हानियाँ |
|---|---|---|---|
| WebSocket | TCP | पूर्ण-द्वैध, कम विलंबता, ब्राउज़रों में निर्मित | स्केलिंग जटिलता, प्रॉक्सी अवरोधन |
| HTTP/SSE | TCP | किसी भी बुनियादी ढांचे के साथ संगत, कार्यान्वित करने में सरल | केवल एकदिशीय (सर्वर-क्लाइंट), पोलिंग आवश्यक |
| XMPP | TCP | मानकीकृत, प्रमाणीकरण समर्थन, विस्तार योग्य | सरल परिदृश्यों के लिए अत्यधिक, XML-ओवरहेड |
| SIP | UDP/TCP | VoIP और टेलीफोनी बुनियादी ढांचे के साथ एकीकरण | जटिल, ब्राउज़रों के लिए मूल नहीं |
| MQTT | TCP | हल्का, IoT वातावरण में काम करता है, publish/subscribe | ब्रोकर की आवश्यकता, अतिरिक्त विलंबता |
WebSocket वेब एप्लिकेशन में Signaling Server के लिए सबसे लोकप्रिय प्रोटोकॉल है। यह पूर्ण-द्वैध संचार प्रदान करता है, जो SDP और ICE उम्मीदवारों के अतुल्यकालिक आदान-प्रदान के लिए महत्वपूर्ण है, और WebSocket API के माध्यम से सभी आधुनिक ब्राउज़रों द्वारा मूल रूप से समर्थित है। सर्वर-साइड WebSocket कार्यान्वयन सभी लोकप्रिय प्लेटफार्मों (Node.js, Python, Java, Go) पर उपलब्ध हैं। लाखों उपयोगकर्ताओं वाले एप्लिकेशन के लिए, Signaling Server इंस्टेंस के बीच सिंक्रनाइज़ेशन के लिए Redis Pub/Sub या Kafka पर आधारित स्केलेबल WebSocket समाधानों का उपयोग किया जाता है।
आइए ws लाइब्रेरी (WebSocket) और अंतर्निर्मित HTTP सर्वर का उपयोग करके Node.js में एक सरल Signaling Server कार्यान्वयन देखें। सर्वर उपयोगकर्ता पंजीकरण, कक्ष निर्माण और प्रतिभागियों के बीच संदेश रीले का समर्थन करता है।
const WebSocket = require("ws");
const server = new WebSocket.Server({ port: 8080 });
const rooms = new Map();
server.on("connection", (ws) => {
ws.roomId = null;
ws.on("message", (data) => {
const msg = JSON.parse(data);
switch (msg.type) {
case "join":
handleJoin(ws, msg.roomId);
break;
case "offer":
case "answer":
case "ice-candidate":
relayToPeer(ws, msg);
break;
case "leave":
handleLeave(ws);
break;
}
});
ws.on("close", () => handleLeave(ws));
});
function handleJoin(ws, roomId) {
if (!rooms.has(roomId)) {
rooms.set(roomId, []);
}
const room = rooms.get(roomId);
room.push(ws);
ws.roomId = roomId;
if (room.length === 2) {
room[0].send(JSON.stringify({ type: "peer-joined" }));
room[1].send(JSON.stringify({ type: "peer-joined" }));
}
}
function relayToPeer(sender, msg) {
const room = rooms.get(sender.roomId);
if (!room) return;
room.forEach(peer => {
if (peer !== sender && peer.readyState === WebSocket.OPEN) {
peer.send(JSON.stringify(msg));
}
});
}
function handleLeave(ws) {
if (!ws.roomId) return;
const room = rooms.get(ws.roomId);
if (!room) return;
const idx = room.indexOf(ws);
if (idx !== -1) room.splice(idx, 1);
if (room.length === 0) rooms.delete(ws.roomId);
}
यह Signaling Server मूल कार्यक्षमता को कार्यान्वित करता है: कक्ष से कनेक्शन, दो पीयर्स के बीच WebRTC संदेशों (offer, answer, ice-candidate) का रीले और डिस्कनेक्शन प्रबंधन। सर्वर जुड़े WebSocket क्लाइंट वाले कक्षों को संग्रहीत करने के लिए Map का उपयोग करता है। relayToPeer फ़ंक्शन प्रेषक को छोड़कर कक्ष के सभी प्रतिभागियों को संदेश भेजता है। उत्पादन के लिए, आपको संदेश प्रकार सत्यापन, JSON पार्सिंग त्रुटि प्रबंधन और टूटे कनेक्शन का पता लगाने के लिए heartbeat तंत्र जोड़ने की आवश्यकता होगी।
क्लाइंट पक्ष पर, Signaling Server ब्राउज़र के WebSocket API के माध्यम से एकीकृत होता है। क्लाइंट सर्वर से कनेक्शन स्थापित करता है, कक्ष में शामिल होने का अनुरोध भेजता है, और फिर setRemoteDescription() और addIceCandidate() के माध्यम से उन्हें RTCPeerConnection में पास करते हुए आने वाले WebRTC संदेशों को संसाधित करता है। क्लाइंट कोड onicecandidate इवेंट के माध्यम से और offer/answer बनाने के बाद RTCPeerConnection से प्राप्त अपने स्वयं के SDP और ICE उम्मीदवारों को भी सर्वर को भेजता है।
Signaling Server दो प्रमुख प्रकार के मेटाडेटा प्रेषित करता है: SDP (Session Description Protocol) और ICE उम्मीदवार। SDP मीडिया स्ट्रीम मापदंडों का वर्णन करता है — कोडेक, नमूनाकरण दर, चैनलों की संख्या, प्रेषण दिशा (sendrecv, sendonly, recvonly, inactive)। ICE उम्मीदवारों में नेटवर्क पते (स्थानीय, STUN से प्राप्त, TURN से रिले) होते हैं जिनके माध्यम से पीयर कनेक्शन के लिए पहुंच योग्य हो सकता है।
SDP एक टेक्स्ट प्रारूप में प्रस्तुत किया जाता है जिसमें सत्र और मीडिया अनुभाग होते हैं। सत्र भाग सामान्य मापदंडों (सत्र ID, संस्करण, नाम) का वर्णन करता है, जबकि मीडिया अनुभाग अपने कोडेक, पोर्ट और प्रोटोकॉल के साथ प्रत्येक मीडिया स्ट्रीम (ऑडियो, वीडियो, DataChannel) का वर्णन करते हैं। ICE उम्मीदवारों में foundation (समूहीकरण पहचानकर्ता), प्राथमिकता, IP पता, पोर्ट, प्रकार (host, srflx, relay) और प्रोटोकॉल (UDP, TCP) शामिल हैं। प्रत्येक उम्मीदवार में एक ufrag (उपयोगकर्ता नाम खंड) विशेषता भी शामिल होती है जो इसे एक विशिष्ट ICE प्रक्रिया से जोड़ती है।
Trickle ICE WebRTC कनेक्शन स्थापना को काफी तेज करता है। सभी ICE उम्मीदवारों के पूर्ण संग्रह की प्रतीक्षा करने के बजाय (जो जटिल नेटवर्क में 2–10 सेकंड ले सकता है), प्रत्येक उम्मीदवार को खोज के तुरंत बाद Signaling Server को भेजा जाता है। रिमोट पीयर उम्मीदवार प्राप्त करता है और ICE फ्रेमवर्क के माध्यम से तुरंत कनेक्शन परीक्षण शुरू करता है। यह अधिकांश मामलों में कनेक्शन स्थापना समय को 500–1500 ms तक कम कर देता है।
अक्सर पूछे जाने वाले प्रश्न
Signaling Server — कॉल से पहले का “समन्वयक” है। यह दो उपकरणों को एक-दूसरे को खोजने और यह सहमत होने में मदद करता है कि वे कैसे संवाद करेंगे। एक बार उपकरण “परिचित” हो जाते हैं और सहमत हो जाते हैं, तो सर्वर की अब आवश्यकता नहीं है — वे सीधे संवाद करते हैं।
WebRTC सिग्नलिंग प्रोटोकॉल को परिभाषित नहीं करता ताकि डेवलपर्स सबसे उपयुक्त ट्रांसपोर्ट चुन सकें। ब्राउज़र में अन्य उपयोगकर्ताओं को खोजने के लिए कोई अंतर्निर्मित तंत्र नहीं है — यह कार्य Signaling Server करता है। यह एक “डाकिया” के रूप में कार्य करता है, कॉल प्रतिभागियों के बीच आमंत्रण और कनेक्शन सेटिंग्स पहुंचाता है।
WebSocket — अधिकांश वेब एप्लिकेशन के लिए इष्टतम विकल्प है: पूर्ण-द्वैध, ब्राउज़रों द्वारा मूल रूप से समर्थित, और कार्यान्वित करने में सरल। मौजूदा VoIP बुनियादी ढांचे के साथ एकीकरण के लिए, SIP चुनें। समृद्ध सुविधाओं वाले चैट एप्लिकेशन के लिए, XMPP का उपयोग करें। IoT परिदृश्यों के लिए, MQTT का उपयोग करें।
Signaling Server को स्केल करने के लिए, Redis Pub/Sub या Kafka के माध्यम से सिंक्रनाइज़ेशन के साथ क्षैतिज स्केलिंग का उपयोग करें। प्रत्येक सर्वर इंस्टेंस WebSocket कनेक्शन के अपने हिस्से को संभालता है, और अंतर-सर्वर संदेश रूटिंग के लिए एक सामान्य डेटा बस का उपयोग किया जाता है। यह दृष्टिकोण लाखों एक साथ सिग्नलिंग सत्रों को संभालने की अनुमति देता है।
Signaling Server केवल कनेक्शन स्थापना चरण के दौरान महत्वपूर्ण है। यदि सर्वर अस्थायी रूप से अनुपलब्ध हो जाता है, तो सक्रिय WebRTC कॉल जारी रहती हैं — मीडिया ट्रैफ़िक सीधे पीयर्स के बीच प्रवाहित होता है। समस्या केवल नया कनेक्शन स्थापित करने का प्रयास करते समय उत्पन्न होती है। विश्वसनीयता के लिए, सर्वर क्लस्टरिंग और बैकअप सिग्नलिंग चैनलों का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।