Ich habe online und in Lehrbüchern über das RTS/CTS-Protokoll für die drahtlose Übertragung gelesen. Obwohl das Lehrbuch, das ich gelesen habe, besagt, dass das versteckte Terminal (und das exponierte Terminal) von RTS/CTS gelöst wird, habe ich online gesehen, dass das RTS/CTS-Protokoll das Problem nicht vollständig löst. Aber nur reduziert ist.
Das Protokoll scheint ziemlich ordentlich und für mich sieht es so aus, als ob das Problem gelöst ist. Was übersehe ich hier, warum mehrere Quellen behaupten, dass das Problem nicht gelöst ist?!
Gibt es harte Annahmen unter dem ganzen Protokoll?
Zunächst ist anzumerken, dass RTS/CTS, auf die in der Frage Bezug genommen wird, nichts mit Hardwarekabeln zu tun haben, wie sie häufig für UART-Handshaking verwendet werden. Abgesehen davon handelt es sich um ein Low-Level-Funkkommunikationsproblem, das hier ungefähr so aktuell zu sein scheint wie Fragen zu Dingen wie XBee.
Das "versteckte/offengelegte" Terminalproblem bezieht sich auf die Tatsache, dass es möglich ist, drei Knoten X, Y und Z zu haben, so dass Y nahe genug an X ist, um Daten zu empfangen, wenn Z still ist, und Z gleichzeitig nahe genug an Y ist um die Kommunikation von X zu stören, aber weit genug von X entfernt, dass X es nicht erkennen kann.
Im allgemeinen Fall hat Z keine Möglichkeit zu wissen, wann jemand Informationen an Y senden könnte, und somit hat Z keine Möglichkeit zu wissen, wann seine Übertragungen die von jemand anderem stören würden. Wenn X ein kleines Paket an Y sendet, ist es für X billiger, es einfach zu senden und darauf vorbereitet zu sein, es erneut zu übertragen, wenn es blockiert wird, als zu versuchen, eine solche Blockierung zu verhindern. Wenn X jedoch ein größeres Paket sendet, ist es sinnvoll, X mit einem kleinen Paket beginnen zu lassen, das Y mitteilt, dass es ein größeres Paket erwartet, und Y mit einem kleinen Paket antworten zu lassen, das anzeigt, dass es den Empfang des größeren Pakets erwartet. Dies hat einige nützliche Effekte. Die wichtigsten unter ihnen:
Wenn Y ein kleines Paket von X nicht hören kann, gibt es für X keinen Grund, ein großes Paket zu senden. Wenn X davon absieht, ein großes Paket zu senden, wird vermieden, dass die Luftwellen mit nutzlosen Daten überladen werden, die möglicherweise andere Übertragungen blockieren oder mit ihnen kollidieren würden.
Wenn Z Y sagen hört, dass es Daten von X erwartet, dann weiß Z, dass es vermeiden sollte, auf diesem bestimmten Kanal während der Zeit zu senden, in der die Übertragung erwartet wird.
Das RTS/CTS-Protokoll ist kein Allheilmittel. Es kann es so machen, dass Kollisionen bei größeren Datenblöcken unwahrscheinlich sind, aber es tut nichts, um das Problem von Kollisionen mit kleineren Datenblöcken zu lösen [glücklicherweise sind kleine Blockkollisionen im Allgemeinen weniger kostspielig]. Selbst wenn sowohl X als auch Y die Tatsache ankündigen, dass X Daten an Y senden wird, und selbst wenn Z nahe genug bei X und Y ist, um ihre Übertragungen zu stören, gibt es keine Garantie dafür, dass Z die Ankündigung von X oder tatsächlich hört Y. Zum Beispiel könnte Z mit dem Knoten Q kommunizieren, der sich außerhalb der Reichweite von X und Y befindet, und Q könnte Daten an Z senden, während X und Y ihre Ankündigungen senden. Da Z in diesem Fall X und Y nicht sagen gehört hätte, dass sie erwarteten, miteinander zu sprechen, hätte Z keinen Grund, seine Übertragungen in ihrem Namen zu unterbrechen.
Grundsätzlich ist drahtlose Kommunikation mit einer gewissen Asymmetrie behaftet: Wenn A etwas von B hört, kann es wissen, dass B es gesendet hat, aber wenn A nichts hört, bedeutet das nicht, dass B nichts gesendet hat. Konzeptionell sollte es einem Empfänger möglich sein, zwischen "Stille" und "nicht entzifferbarem Rauschen" zu unterscheiden und sich vorzustellen, dass B nichts gesendet haben kann, wenn A Stille (im Gegensatz zu Rauschen) erhält, aber mir sind keine Protokolle bekannt das Nutzen Sie solche Unterscheidungen.
Olin Lathrop
Kristof Take
Rev
Kristof Take
Kristof Take