Frage

Ich bin also eine Menge von Hochleistungs-Netzwerk-Programmierung zu tun Boost :: Asio (oder nur Asio, wenn man so will), und habe ein ziemlich solides Verständnis der Grundlagen der TCP und UDP-Protokolle. Ich frage mich aber, weil ich noch nicht sehe mir einen Experten in der Vernetzung trotz meines Wissens, was ist ein guter Weg, das Wesentliche zu gestalten, was die Vernetzung Programmierer wissen sollten, vor allem für diejenigen, die versuchen, die Leistung ihrer großen Vernetzung schieben Basis Anwendungen?

Es gibt einen großen Essay über Programmierer und was sollten sie wissen, über Speicher (siehe unten), so frage ich mich, wenn jemand zusammen etwas ähnliches für die Vernetzung gesetzt hat.

Was jeder Programmierer sollte über das Gedächtnis wissen

War es hilfreich?

Lösung

Einige Stichpunkte aus der Spitze von meinem Kopf Dinge, die Sie wissen sollten:

  • Wie und warum TCP funktioniert ... 3-Wege-Handshakes, Anerkennung, verzögert ack, nagling, Fenster Protokoll schieben. Es gibt einen konkreten Grund für jede dieser Funktionen ... und sie alle können die Leistung Ihrer Anwendung zerstören, wenn sie unsachgemäß behandelt.
  • UDP-Multicast ... auch wenn Sie denken, Sie nie verwenden werden, müssen Sie wissen, warum es existiert, so können Sie fundierte Entscheidungen treffen, wenn Systeme zu entwerfen.
  • IP-Fragmentierung und die Auswirkungen der MTU.
  • Binäre Serialisierung und Netzwerk-Byte-Reihenfolge (auch wenn Sie gerade dabei zu Google Proto Puffer zu verwenden, ist es schön zu verstehen Warum sie sind effizient).
  • Ascii Serialisierung und Nachrichten Framing (was in HTTP tut \r\n\r\n das?)
  • Verschiedene E / A-Versand Modelle: Apache-Stil preforking, Gewinde-per-Anschluss, ereignisbasierte Single-Threaded, ereignisbasierte mit Worker-Threads, usw.
  • .
  • Die Auswirkungen von Puffer-Überlauf-Schwachstellen in einer vernetzten App
  • Protokoll-basiertes Design, im Gegensatz zu API- oder bibliotheksbasierten Design
  • asynchrone vs synchrone Protokolle. Viele High-Performance-Systeme sind asynchron. HTTP ist synchron, wenn Sie Pipelining verwenden, und selbst dann gibt es viele Einschränkungen auf, was möglich ist ... keine Out-of-Order-Antworten, zum Beispiel.

Update:? Was ist protokollbasierte Design bedeutet

Betrachten Sie HTTP, das Protokoll der Bahn. Apache, IIS, Lighttpd, Firefox, Opera, WebKit, etc ... Alle diese Teile der Software sprechen HTTP. Es ist durchaus möglich, dass keiner von ihnen den Code teilen, dies zu tun. Der Nachteil ist natürlich, ist die erhöhte Wahrscheinlichkeit von Fehlern aufgrund des Nettovolumens des Codes. Es gibt zahlreiche upsides:

  • Jedes Programm kann über HTTP, unabhängig von der Implementierungssprache
  • kommunizieren
  • Leichter / Embedded-Umgebungen kann eine Teilmenge des Protokolls auswählen und wählen, anstatt die ganze Sache mit
  • Es ist möglich, ein Protokoll-Handler für bestimmte Situationen zu optimieren. Es ist nicht möglich, eine Bibliothek zu optimieren, ohne Allgemeinheit zu opfern.
  • Eine Vielzahl von verschiedenen Implementierungen Kräfte Bibliothek Anbieter Fehler zu adressieren (anstatt sie nur Abblasen weil, na ja, jeder die gleiche Bibliothek verwendet).
  • Es gibt keine organisatorische oder vertragliche Belastung für Nutzer von HTTP, keine Lizenzgebühren.

Wenn Sie ein Netzwerkprotokoll entwerfen, können Sie sich mehrere APIs bauen, die jeweils zugeschnitten auf spezifische Anwendungsfälle. Oder Sie können einen bauen, es ist bis zu Ihnen. Vernetzte Software-Komponenten können unabhängig voneinander aktualisiert werden. Im Grunde alles, was Sie hören, dass gut über Java / C # Schnittstellen und C ++ abstrakte Klassen, sondern in der Vermittlungsschicht aufgebracht statt der Programmiersprache Schicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top