Hogyan működik a viber?
Én úgy képzeltem el, hogy egy felhasználó(kliens) küld adatot a (servernek) majd a server elküldi a megfelelő (kliens)-nek. Nem tudom pontosan, hogy működik. Ez ilyen TCP server megoldás? Ha már felteszem a kérdést, van-e megfelelő dokumentáció (lehetőleg magyarul) ami elmagyarázza, hogyan lehet ilyet csinálni (egyébként c++ ban kéne).
Köszönöm!
Üdv.:M
A TCP kommunikáció alapvetően úgy néz ki, hogy van egy szerver és egy kliens. A szerver készít egy socket-et, ami egy kommunikációs csatorna leírója, vagy másképp egy kommunikációs végpont. Ezután a szerver kiválasztja a kommunikáció formáját, egy protokollt amivel kommunikálni fog, és egy portot, amire "bindeli" magát. Ezek az adatok a socket-hez lesznek társítva.
Majd a szerver "listen" állapotba lép, azaz hallgaztózik a megadott porton, jelzi az operációs rendszernek, hogy az adott porton kapcsolatot fogad el, majd várakozik addig, amíg egy kliens nem kapcsolódik hozzá.
A kliens készít egy socketet, ehhez ő is megadja a szükséges adatokat, csatlakozik a szerverhez, végül elküldi az adatokat.
Példnak okáért C nyelven mutatom.
Szerver:
socket_desc = socket(AF_INET, SOCK_STREAM, 0); // socket letrehozasa: AF_INET - cimcsalad (IPv4), SOCK_STREAM - protokoll megadása (kapcsolat-alapu)
server.sin_family = AF_INET; // szerver beallitasainak megadasa
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8080);
bind(socket_desc, (struct sockaddr *)&server, sizeof(server)); // bindeles
listen(socket_desc , 3); // hallgatozas
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); // bejovo kapcsolatok elfogadasa
recv(client_sock, client_message, 2000, 0); // adat fogadasa egy 2000 byte meretu pufferbe
close(client_sock); // socket lezarasa
A kliens:
socket_desc = socket(AF_INET , SOCK_STREAM , 0); // socket letrehozasa
server.sin_addr.s_addr = inet_addr("127.0.0.1"); // kliens beallitasainak megadasa - ez az a szerver cim ahova csatlakozunk
server.sin_family = AF_INET;
server.sin_port = htons(8080);
connect(socket_desc, (struct sockaddr*)&server, sizeof(server)); // csatlakozas a szerverhez
send(socket_addr, message, 2000, 0); // 2000 bytenyi adat kuldese a szerver fele
close(socket_desc); // socket lezarasa
Ez egy nagyon alap implementáció, a gyakorlat nagyságrendekkel ennél bonyolultabb.
Itt egy folyamatábra, ami vázlatosan ábrázolja a kommunikációt: [link]
Itt a wiki leírása: [link]
Itt pedig egy jóval bővebb leírás: [link]
A Viber UDP protokollt is használ a VOIP kapcsolathoz - mint az az alábbiakból kiderül:
"In order for Viber Desktop to run on your computer, the following ports must be open for all addresses for both TCP and UDP:
5242
4244
5243
7985
80
443"
Forrás: Viber - Opening ports for Viber Desktop [ [link] ]
"The RTP stream of the audio or audio/video call is converted to SRTP and encrypted via Salsa20 algorithm using the session key"
Forrás: Viber - Viber encryption overview [ [link] ]
Az SRTP meg UDP:
Van egy (vagy több) szervered amelyre fel lehet csatlakozni a telefonokon futó kliens programmal.
Minden kliens egyedi azonosítót (telszám) kap, így lesz más klienssel összekapcsolható.
A kliens egy protokollon keresztül adatot (üzenetet) küld a másiknak. Az üzenet fejlécében adja tudtára a szervernek, hogy kinek küldi az üzenetet. A szerver meg elküldi, ha tudja.
Az UDP protokollról tudni érdemes, hogy alapban nincs visszajelzés, tehát a kliens nem tudja ellenőrizni, hogy az általa küldött üzenet megérkezett-e a címzetthez.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!