2016-04-01 5 views
1

So gibt das zwei allgemeine Problem an, dass es keine deterministische Weise gibt zu wissen, ob die andere Partei - mit der wir über einen unzuverlässigen Kanal kommunizieren - unsere Nachrichten empfangen hat. Dies ist ziemlich analog zum TCP-Handshake, wo wir eine synsyn ack senden und eine Verbindung herstellen. Steht das den beiden allgemeinen Problemstellungen nicht entgegen?Zwei allgemeine Vereinbarung und TCP-Handshake

Antwort

2

Die beiden allgemeinen Probleme sind in der Tat das asynchrone Modell für TCP, weshalb (wie das theoretische Ergebnis zeigt) die beiden Endpunkte nicht gleichzeitig über den Zustand der Verbindung Bescheid wissen können.

Die Art und Weise, wie jedes verteilte Protokoll sich mit diesem Problem befasst, ist, immer Sicherheit zu versprechen (nichts Schlimmes wird passieren), kann aber die Lebendigkeit nicht garantieren (dass der Fortschritt irgendwann gemacht wird). Lebendigkeit liegt nicht in deinen Händen. In guten Zeiten kann man versuchen, die Besten zu machen und hoffen, Fortschritte zu machen.

In TCP bedeutet dies, dass ein Endpunkt eine Annahme (wie "Verbindung hergestellt") machen kann, ohne den Zustand des anderen eindeutig zu kennen. Es ist jedoch keine unsichere Annahme zu machen; im schlimmsten Fall ist es ein harmloses Missverständnis. Nach einer Zeitüberschreitung wird es seine Meinung ändern. Es ist nicht anders als an einem Ende eines Fernsprech-Telefons zu sein und weiter zu reden, wenn man bedenkt, dass die Verbindung noch besteht. nach einer Weile, müssen Sie vielleicht fragen "Hallo, bist du noch da?", und eine Auszeit. Real-World-Protokolle müssen immer Timeouts haben (im Gegensatz zu asynchronen formalen Modellen), weil irgendwo auf dem Stapel sie einer menschlichen Funktion dienen und menschliche Geduld begrenzt ist. In der Praxis gibt es genügend Zeit, um Fortschritte zu erzielen. Daher müssen wir nur geeignete Timeouts auswählen, die auch nicht zu früh auslaufen.

Das heißt, auch gutartige Missverständnisse können unerwünschte Folgen haben. Zum Beispiel, nachdem ein Server auf die syn antwortet, teilt er Ressourcen für die Verbindung in der Hoffnung, dass der Client das Protokoll beenden wird. Dies ist eine klassische Denial-of-Service-Attacke, da ein Rogue-Client die Handshake-Sequenz einfach starten, aber niemals beenden kann, so dass ein unvorbereiteter Server mit Millionen zugeordneter Status-Maschinen übrig bleibt. Sorgfalt ist erforderlich.

+0

Aus diesem Grund kann TCP nicht garantieren, dass beide Seiten die normale Beendigung der Verbindung oder keine von beiden sehen werden. (Obwohl wir jetzt [haben die Technologie] (https://gigabitether.net/2016/05/16/byzantine-fault-tolerance/), um dies zu beheben.) –