Signaling Server — WebRTC infrastrukturunun server komponentidir, peer-lər arasında metadata mübadiləsini təmin edərək əlaqənin qurulması və bitirilməsi üçün istifadə olunur. Media trafikindən fərqli olaraq, siqnalizasiya istənilən protokol — WebSocket, HTTP, XMPP və ya SIP ilə ötürülə bilər. MDN Web Docs, 2024-ə görə, siqnalizasiya istənilən WebRTC tətbiqinin məcburi komponentidir, çünki protokol siqnal mesajlarının mübadiləsi üçün konkret üsul müəyyən etmir.
Əsas məqamlar
Signaling Server — iki və ya daha çox peer arasında WebRTC əlaqəsinin qurulması prosesini koordinasiya edən şəbəkə xidmətidir. O, media məlumatlarını (audio, video, DataChannel kanal məlumatları) ötürmür, yalnız peer-lərin aşkarlanması və əlaqə parametrlərinin razılaşdırılması üçün lazım olan xidməti məlumatları ötürür. P2P kanalı uğurla qurulduqdan sonra Signaling Server artıq lazım olmaya bilər, lakin bəzi arxitekturalarda sonrakı siqnal mübadiləsi üçün qalır (məsələn, zəngin bitirilməsi, iştirakçıların əlavə edilməsi).
Siqnalizasiya arxitekturası üç komponentdən ibarətdir: Signaling Server, Signal Channel (klient və server arasında nəqliyyat protokolu) və klient API (adətən brauzerin WebRTC stekinə daxil edilmişdir). WebRTC spesifikasiyası (W3C, 2024) qəsdən siqnal protokolunu standartlaşdırmır — tərtibatçılar tətbiqləri üçün uyğun olan istənilən nəqliyyatı seçə bilərlər. Bu çevik həll veb tətbiqləri üçün WebSocket, çat sistemləri üçün XMPP və ya telekommunikasiya infrastrukturu ilə inteqrasiya üçün SIP istifadə etməyə imkan verir.
WebRTC əlaqəsi qurulmazdan əvvəl peer-lər üç növ mesaj mübadiləsi etməlidirlər: session description (offer və answer), ICE candidates və sessiyanın bitirilməsi/dəyişdirilməsi haqqında məlumat. Signaling Server bu mesajları peer-lər arasında istiqamətləndirir, ünvanlama üçün otaq və ya istifadəçi identifikatorlarından istifadə edir. Standart nümunə — iki iştirakçının qoşulduğu “otaq” yaradılır və server hər bir iştirakçıdan gələn mesajları yalnız onun həmsöhbətinə ötürür.
Signaling Server aşağıdakı tipik WebRTC əlaqəsinin qurulması protokolunu həyata keçirir. Peer-lər WebSocket (və ya digər nəqliyyat) vasitəsilə serverə qoşulur və otaqda qeydiyyatdan keçirlər. Peer A (təşəbbüskar) RTCPeerConnection.createOffer() vasitəsilə offer (çıxan media axınının SDP təsviri) yaradır, onu local description olaraq təyin edir və Signaling Server-ə göndərir. Server offer-i peer B-yə ötürür. Peer B offer-i alır, onu remote description olaraq təyin edir, createAnswer() vasitəsilə answer yaradır, onu local description olaraq təyin edir və server vasitəsilə geri göndərir. Bu proses SDP Offer/Answer adlanır.
SDP mübadiləsi ilə paralel olaraq, hər bir peer ICE candidates (host, srflx, relay) toplayır və onları Signaling Server vasitəsilə digər peer-ə göndərir. Uzaqdakı peer alınan namizədləri RTCPeerConnection.addIceCandidate() vasitəsilə əlavə edir. ICE prosesi işləyən yol tapmaq üçün namizədlərin bütün kombinasiyalarını yoxlayır. İşləyən yol tapıldıqdan sonra (adətən 1–5 saniyə ərzində), media trafiki birbaşa peer-lər arasında ötürülməyə başlayır və Signaling Server artıq məlumat ötürülməsində iştirak etmir — onun rolu növbəti xidməti hadisəyə qədər (zəngin bitirilməsi, axın keyfiyyətinin dəyişdirilməsi) başa çatır.
Mesajların ünvanlanması üçün Signaling Server otaqlar (rooms) və ya kanallar mexanizmindən istifadə edir. Hər yeni WebRTC seansı identifikatorla (adətən UUID) unikal otaq yaradır. Təşəbbüskar otaq yaradır və ikinci peer-in qoşulmasını gözləyir. İkinci peer xarici kanal (məsələn, dəvət linki) vasitəsilə əldə etdiyi ID ilə otağa qoşulur. Server otaqların map-ini saxlayır, burada hər ID-yə qoşulmuş müştərilərin siyahısı uyğun gəlir. İştirakçıların sayı ikiyə çatdıqda, server onlar arasında siqnal mesajlarını ötürməyə başlayır.
Signaling Server müxtəlif nəqliyyat protokollarından istifadə edə bilər, hər birinin öz üstünlükləri və çatışmazlıqları var. Protokolun seçimi tətbiq növündən, infrastruktur məhdudiyyətlərindən və uyğunluq tələblərindən asılıdır. Aşağıda ən geniş yayılmış protokollar və onların xüsusiyyətləri verilmişdir.
| Protokol | Nəqliyyat | Üstünlüklər | Çatışmazlıqlar |
|---|---|---|---|
| WebSocket | TCP | Tam dupleks, aşağı gecikmə, brauzerlərə daxildir | Miqyaslama mürəkkəbliyi, proksi bloklaması |
| HTTP/SSE | TCP | İstənilən infrastrukturla uyğunluq, sadə tətbiq | Yalnız bir istiqamətli (server-klient), Polling tələb olunur |
| XMPP | TCP | Standartlaşdırılmış, autentifikasiya dəstəyi, genişləndirilə bilən | Sadə ssenarilər üçün həddindən artıq, XML yükü |
| SIP | UDP/TCP | VoIP və telefon infrastrukturu ilə inteqrasiya | Mürəkkəb, brauzerlər üçün qeyri-təbii |
| MQTT | TCP | Yüngül, IoT mühitlərində işləyir, publish/subscribe | Broker tələb olunur, əlavə gecikmə |
WebSocket veb tətbiqlərində Signaling Server üçün ən populyar protokoldur. O, SDP və ICE namizədlərinin asinxron mübadiləsi üçün vacib olan tam dupleks əlaqəni təmin edir və bütün müasir brauzerlər tərəfindən WebSocket API vasitəsilə dəstəklənir. WebSocket-in server tətbiqi bütün populyar platformalarda (Node.js, Python, Java, Go) mövcuddur. Milyonlarla istifadəçisi olan tətbiqlər üçün Signaling Server instansiyaları arasında sinxronizasiya üçün Redis Pub/Sub və ya Kafka əsasında miqyaslana bilən WebSocket həlləri istifadə olunur.
ws (WebSocket) kitabxanası və daxili HTTP serverindən istifadə edərək Node.js-də sadə Signaling Server tətbiqini nəzərdən keçirək. Server istifadəçi qeydiyyatını, otaqların yaradılmasını və iştirakçılar arasında mesajların ötürülməsini dəstəkləyir.
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);
}
Bu Signaling Server əsas funksionallığı həyata keçirir: otağa qoşulma, iki peer arasında WebRTC mesajlarının (offer, answer, ice-candidate) ötürülməsi və qoşulmaların idarə edilməsi. Server qoşulmuş WebSocket müştəriləri ilə otaqları saxlamaq üçün Map-dən istifadə edir. relayToPeer funksiyası göndərəndən başqa otaqdakı bütün iştirakçılara mesaj göndərir. İstehsal mühiti üçün mesaj növlərinin təsdiqi, JSON parsingsəhvlərinin işlənməsi və qırılan əlaqələrin aşkarlanması üçün heartbeat mexanizmi əlavə edilməlidir.
Klient tərəfdə Signaling Server brauzerin WebSocket API-si vasitəsilə inteqrasiya olunur. Klient serverə qoşulur, otağa qoşulmaq üçün sorğu göndərir, sonra daxil olan WebRTC mesajlarını emal edərək onları setRemoteDescription() və addIceCandidate() vasitəsilə RTCPeerConnection-a ötürür. Klient kodu həmçinin onicecandidate hadisələri və offer/answer yaradıldıqdan sonra RTCPeerConnection-dan alınan öz SDP və ICE namizədlərini serverə göndərir.
Signaling Server iki əsas metadata növünü ötürür: SDP (Session Description Protocol) və ICE candidates. SDP media axınının parametrlərini — kodekləri, seçmə tezliyini, kanalların sayını, ötürmə istiqamətini (sendrecv, sendonly, recvonly, inactive) təsvir edir. ICE candidates peer-in əlaqə üçün əlçatan ola biləcəyi şəbəkə ünvanlarını (lokal, STUN-dan alınmış, TURN-dan relay) ehtiva edir.
SDP sessiyaları və media bölmələrini ehtiva edən mətn formatında təqdim olunur. Sessiya hissəsi ümumi parametrləri (sessiya identifikatoru, versiya, ad) təsvir edir, media bölmələri isə hər bir media axınını (audio, video, DataChannel) onun kodeki, portu və protokolu ilə təsvir edir. ICE namizədləri foundation (qruplaşdırma üçün identifikator), priority, IP ünvanı, port, tip (host, srflx, relay) və protokol (UDP, TCP) ehtiva edir. Hər bir candidate həmçinin onu konkret ICE prosesi ilə əlaqələndirən ufrag (username fragment) atributunu ehtiva edir.
Trickle ICE WebRTC əlaqəsinin qurulmasını əhəmiyyətli dərəcədə sürətləndirir. Bütün ICE namizədlərinin tam toplanmasını gözləmək əvəzinə (mürəkkəb şəbəkələrdə 2–10 saniyə çəkə bilər), hər bir namizəd aşkar edildikdən dərhal sonra Signaling Server-ə göndərilir. Uzaqdakı peer namizədi alır və dərhal ICE framework vasitəsilə əlaqəni yoxlamağa başlayır. Bu, əksər hallarda əlaqənin qurulma müddətini 500–1500 ms-ə qədər azaldır.
Tez-tez verilən suallar
Signaling Server — zəngdən əvvəl “koordinator”dur. İki cihaza bir-birini tapmağa və necə ünsiyyət quracaqları barədə razılaşmağa kömək edir. Cihazlar “tanışdıqdan” və razılaşdıqdan sonra server artıq lazım deyil — onlar birbaşa ünsiyyət qururlar.
WebRTC siqnalizasiya protokolunu müəyyən etmir ki, tərtibatçılar ən uyğun nəqliyyatı seçə bilsinlər. Brauzerin digər istifadəçiləri aşkar etmək üçün daxili mexanizmi yoxdur — bu vəzifəni Signaling Server həll edir. O, “poçtalyon” rolunu oynayır, zəng iştirakçıları arasında dəvətləri və əlaqə parametrlərini ötürür.
WebSocket — əksər veb tətbiqləri üçün optimal seçimdir: tam dupleks, brauzerlər tərəfindən dəstəklənir, tətbiqi sadədir. Mövcud VoIP infrastrukturu ilə inteqrasiya üçün SIP seçin. Geniş funksiyalı çat tətbiqləri üçün — XMPP. IoT ssenariləri üçün — MQTT.
Signaling Server-in miqyaslaşdırılması üçün Redis Pub/Sub və ya Kafka vasitəsilə sinxronizasiya ilə üfüqi miqyaslaşdırmadan istifadə edin. Hər bir server instansiyası WebSocket qoşulmalarının öz payını emal edir və serverlərarası mesaj istiqamətləndirməsi üçün ümumi məlumat şinindən istifadə olunur. Bu yanaşma milyonlarla eyni vaxtda siqnal sessiyalarını emal etməyə imkan verir.
Signaling Server yalnız əlaqənin qurulması mərhələsində kritikdir. Server müvəqqəti olaraq əlçatmazdırsa, aktiv WebRTC zəngləri davam edir — media trafiki birbaşa peer-lər arasında gedir. Problem yalnız yeni əlaqə qurmağa cəhd edərkən yaranır. Etibarlılıq üçün server klasterləşdirməsindən və ehtiyat siqnal kanallarından istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun