WhatsApp Dienst - Wie genau funktioniert das?

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von Markus Jacobs.

    WhatsApp Dienst - Wie genau funktioniert das?

    Hallo,

    ich suche schon länger nach einer ausführlichen Beschreibung wie WhatsApp das mit der Client-Server Kommunikation regelt bzw. jeglicher andere Messaging Dienst.
    Wie funktioniert das? Gibt es nur einen WhatsApp Server oder für jedes Land einen oder wie?
    Es kann doch nicht sein das es ein einziger Dedizierter Server in nem riesen Rechenzentrum steht wo eine Anwendung läuft (Server) der alle Anfragen aller WhatsApp Clients verarbeitet ?!
    Allein das Connection Array der einzelnen Benutzer dürfte den Arbeitsspeicher sprengen geschweige denn die Internet Leitung.

    Außerdem hab ich auch speziell zum Client Fragen:

    1. Bei Android z.B. läuft wahrscheinlich ständig ein Dienst. D.h. es besteht ständig eine TCP Verbindung zum Server oder nicht? Denn sonst könnten ja keine Nachrichten ankommen wenn die App nicht gestartet ist.

    Dann zum Server: Der wird wahrscheinlich in C++ geschrieben sein, weil C# oder VB zu langsam sind? Oder warum?

    Ich hoffe ihr könnt mir einiges dazu erklären.

    Danke im Voraus. ^^
    Der WhatsApp server ist ein modifizierter XMPP Server: en.wikipedia.org/wiki/XMPP
    Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.

    BeryJu.org BeryJu.org/Blog
    Dann zum Server: Der wird wahrscheinlich in C++ geschrieben sein, weil C# oder VB zu langsam sind? Oder warum?

    Performancemäßig dürfte das relativ gleichauf sein, eher wird .net noch die Entwicklung von besserem Netzwerkcode ermöglichen.

    Das Jabber hinter WhatsApp ist ziemlich tot gefrickelt, enthält einige "Sicherheitsfunktionen" (die völlig wirklos sind) und ist auch sonst nicht mehr gänzlich dem Standard zuträglich.

    Dein WhatsApp hält nur dann die TCP-Verbindung offen, solange die App gestartet ist.
    Whats App nutzt kein XMPP (wie @Manawyrm es schon erklärte) es ist eine modifizierte Version von XMPP mit dem Namen: "Fun XMPP"

    Wie ich eben feststellen musste, wurden viele Projekte auf GitHub gesperrt, weil sie teilweise Rechte und AGB´s von Whats App verletzen.
    M.f.G. Nitro-X
    Gute Spieler cheaten schlecht! 8-)

    Button1.Visible = False
    If Button1.Click then Shell ("C:\brain.exe")
    end if

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nitro-X“ ()

    Manawyrm schrieb:

    Dein WhatsApp hält nur dann die TCP-Verbindung offen, solange die App gestartet ist.
    Aber wie funktioniert das, dass ich die Nachrichten trotzdem erhalte?
    Ich schließe die App immer und erhalte die Nachrichten trotzdem.
    Da wird doch sicher so etwas ähnliches wie ein Service laufen der die TCP Verbindung ständig hält und sobald der Service etwas empfängt meldet er der BroadcastReceiver die Nachricht und erstellt ne Benachrichtung.
    würde mich auch mal intressieren wie das genau funktioniert.
    ein tcpserver kann doch nur an clients schicken die online sind?

    angenommen whatsapp wäre immer an... doch was passieret beim server wenn man handy kein empfang hat? wie funktioniert das das trotzdem meine nachricht ankommt sobald ich nochmal online bin?
    WhatsApp generiert bei der Registrierung aus IMEI-Nummer und Telefonnummer ein verschlüsseltes Passwort, die Telefonnummer dient dann sozusagen als Nutzername(wie bei Skype zum Beispiel vorname.nachname).

    [ich bin mir nicht mehr ganz sicher ob das so stimmt, habe das aber irgendwo mal gelesen^^]
    Software being "Done" is like lawn being "Mowed". (Jim Benson)
    Mittels "push notification" wird dem Gerät mitgeteilt das eine neue Nachricht vorhanden ist, die wird dann von einem Hintergrundprozess geladen und dir angezeigt.

    slice schrieb:

    die wird dann von einem Hintergrundprozess geladen und dir angezeigt.

    Also doch so ein Dienst?

    KidRick schrieb:

    WhatsApp generiert bei der Registrierung aus IMEI-Nummer und Telefonnummer ein verschlüsseltes Passwort, die Telefonnummer dient dann sozusagen als Nutzername(wie bei Skype zum Beispiel vorname.nachname).
    Ja so in etwa hab ich das auch mal gelesen, allerdings wusste ich das schon xD Trotzdem danke ;)
    ich denke mal der Client sendet in einem bestimmten Intervall Pakete an den Server, dass er "Empfangsbereit" ist...

    wenn du keinen Empfang hast, dann schickt dein Client wohl auch nichts ab...bis es wieder geht...

    sollte der Server so ein Paket bekommen und neue Nachrichten für dich haben, dann schickt er die wohl gleich los zu dir :)
    @oShortyo: wenn die Anwendung offen ist, ist das gut möglich jedoch nicht wenn sie geschlossen ist.
    @Markus Jacobs: Es gibt verschiedene Bezeichnungen dafür, aber gemacht wird immer das gleiche: eine Aktion im Hintergrund ausgeführt.

    Markus Jacobs schrieb:

    Aber wie funktioniert das, dass ich die Nachrichten trotzdem erhalte?
    Die Plattformen (iOS, Android, Windows Phone) bieten hierfür alle APIs, um Push-Nachrichten auf ein Gerät zu schicken. So muss bei den Geräten nur ein einziger Dienst nach Push-Benachrichtigungen schauen, und nicht jede App selber. Ein weiterer Vorteil für die NSA ist auch noch, dass sie sehen können, mit was du so benachrichtigt wurdest - das wäre deutlich schwerer, wenn jeder Entwickler seinen eigenen Dienst machen würde.

    Unter Windows Phone und Windows 8 heißt diese API Windows (Push) Notification Services. Bei Apple glaube ich Apple Push Notification Service.

    Dass diese vorgehensweise sicher ist, wage ich zu bezweifeln. Zumindest bei den WPS ist es so, dass man die Push-Nachricht an einen MS-Server schickt, welcher diese dann auf das Gerät schickt. Da das Gerät die Nachricht offensichtlich lesen kann, gehe ich mal davon aus, dass entweder das Gerät über einen öffentlichen Schlüssel zum Entschlüsseln verfügt, oder dass MS den Inhalt der Push-Nachricht unverschlüsselt bekommt (die Kommunikation ist via SSL, aber die Nachricht an sich ist nicht bis zum Gerät verschlüsselt). Ich halte letzteres für wahrscheinlicher. Somit könnte MS den Chat schon anhand der Push-Benachrichtigungen "mitschreiben".
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nikeee13“ ()

    Okey vielen Dank

    Jetzt weiß ich schonmal etwas mehr darüber.

    Nun aber nochmal zur Programmierung dieses Servers:

    Es wird für jede Verbindung ein Objekt angelegt und dieses in einem Array gespeichert, richtig?
    Wird dann das ganze Array durchlaufen und nachgeschaut ob irgendwelche neuen Dinge anstehen?
    Ich könnt mir vorstellen es dauert ewig, bis der Server die 800.000 Verbindungen vor mir verarbeitet hat.
    Wie regelt der Server das so schnell? :huh:

    Markus Jacobs schrieb:

    Wird dann das ganze Array durchlaufen und nachgeschaut ob irgendwelche neuen Dinge anstehen?
    Nein, so machen die das bestimmt nicht. Ich gehe mal davon aus, dass sie Threading einigermaßen beherrschen und nicht nachschauen müssen, ob es etwas neues gibt, sondern entsprechende Thread-Invokes stattfinden, sobald neue Daten da sind. Das ist wie mit dem Timer (Pulling) und Events (Notifying). Mit Pulling kommt man nicht weit.
    Von meinem iPhone gesendet
    Der MultiServer aus dem Sourcecode-Austausch macht das so. Skalierbar ist diese Herangehensweise auch nicht.
    Ein Thread benötigt Ressourcen. Wenn ein Thread jetzt nichts anderes macht, als auf eine Antwort vom Client zu warten, ist das Verschwendung.

    In .NET hat man für sowas z. B. das APM-Pattern "erfunden", seit 4.0 gibt es aber auch noch die TPL, welche in 4.5 durch TAP erweitert wurde (ist einfacher zu lesen).
    Die Vorteile davon sind z. B., dass nicht für jede Verbindung ein Thread belegt wird, sondern sich die Netzwerkkarte (oder irgendwas anderes) meldet, wenn es etwas neues gibt. So kommt man mit erheblich weniger Threads aus, was das Ganze viel skalierbarer macht.

    Das bringt natürlich nur etwas, wenn der Thread durch IO-Bound-Operations (Lesen von Dateien, Empfangen von Daten aus dem Netzwerk) geblockt würde. Für CPU-Bound-Operations sollte man weiterhin Threads verwenden, weil es ja nichts gibt, worauf man warten könnte. Spezialfälle wie ausgelagerte Rechenoperationen auf andere Recheneinheiten - z.B. Grafikkarten - fallen wohl nicht darunter, aber damit habe ich keine Erfahrung.

    Der MultiServer aus dem SCA sollte schon bei 100 Verbindungen (=100 Threads) nicht mehr so gut performen. @ErfinderDesRades: hat mal einen Servercode in den SCA gestellt, der mit dem APM arbeitet, der ist weitaus skalierbarer.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()