9 Stimmen

Hochfrequenzhandel - TCP > UDP?

Mir wurde gesagt, dass für ein Hochfrequenzhandelssystem (HFT), das eine geringe Latenzzeit erfordert, TCP statt UDP verwendet wird. Mir wurde gesagt, dass man mit TCP Punkt-zu-Punkt-Verbindungen herstellen kann, während das mit UDP nicht möglich ist, aber soweit ich weiß, kann man UDP-Pakete an bestimmte IP/Ports senden.

Es gibt mehrere Argumente, die in diesem Zusammenhang verwendet werden Artikel warum UDP > TCP für Spiele, aber ich kann die Bedeutung für HFT erkennen.

Warum sollte TCP ein besseres Protokoll für den HFT sein?

(Anm. d. Red: Mein früherer Beitrag zu dieser Frage wurde stillschweigend und ohne Erklärung entfernt. Wenn ich gegen die Nutzungsbedingungen verstoße, machen Sie mich bitte darauf aufmerksam, anstatt die Frage stillschweigend zu entfernen)

16voto

David Schwartz Punkte 172718

UDP ist TCP überlegen, wenn Sie einige der Funktionen, die TCP bietet, nicht benötigen. Jede Funktion hat ihren Preis, und wenn Sie die Funktionen nicht benötigen, zahlen Sie diese Kosten ohne Grund.

In einer HFT-Anwendung benötigen Sie so ziemlich jede Funktion, die TCP benötigt. Wenn Sie also UDP wählen, müssen Sie diese Funktionen selbst implementieren. Das bedeutet, dass Sie den Verbindungsaufbau, den Verbindungsabbau, erneute Übertragungen, Übertragungsgeschwindigkeiten, Windows und so weiter implementieren müssten.

Wenn es einen Weg gäbe, all diese Dinge besser zu machen als TCP, dann würde TCP es auf diese Weise machen. Ihnen wäre eine Hand auf dem Rücken gebunden, denn TCP wurde von einigen der besten Köpfe der Welt optimiert und in/mit dem Kernel implementiert.

6voto

Kirk Strauser Punkte 29205

Es gibt keinen Grund zu der Annahme, dass ein Datenstrom über eine bereits bestehende TCP-Verbindung langsamer ist als derselbe Datenstrom über UDP, außerdem gibt es Prüfsummen, Wiederholungsversuche und all die anderen Vorzüge von TCP. UDP gewinnt hauptsächlich in Fällen, in denen man es sich leisten kann, die Zuverlässigkeit zu vernachlässigen, oder in denen der Overhead vieler TCP-Handshakes zu teuer wäre, wie z.B. bei gewöhnlichen DNS-Abfragen.

3voto

Steve-o Punkte 12493

TCP ist schneller, wenn nur wenige Verbindungen verwendet werden. Der wichtige Unterschied besteht darin, dass moderne NICs TCP in erheblichem Umfang beschleunigen und UDP nicht so sehr. Das bedeutet, dass für die Verarbeitung jedes UDP-Pakets mehr Overhead anfällt und sie daher nicht konkurrenzfähig sind, es sei denn, Sie müssen an mehrere Empfänger gleichzeitig senden.

Die UDP-Multicast-Route leidet jedoch immer noch unter den gleichen Problemen wie Unicast-UDP pro Datagramm-Overheads. Daher verwenden viele HFT-Systeme hardwarebeschleunigte Systeme, die die Datenströme über TCP auf mehrere NICs verteilen können (z. B. Solace).

Heutzutage möchte man jedoch den Kernel vollständig umgehen, z. B. mit einem Userspace-IP-Stack wie von Solarflare oder Mellanox, oder sogar sowohl den Kernel als auch den IP-Stack mit RDMA überspringen.

2voto

septical Punkte 430

Ganz einfach: Wenn Sie eine zuverlässige Verbindung benötigen (die sicherstellt, dass jedes Byte der übertragenen Daten empfangen wird), sollten Sie auf jeden Fall TCP verwenden.

Wie Sie bereits erwähnt haben, eignet sich UDP besser für Spiele, bei denen eine 100% genaue Echtzeitverfolgung jedes Objekts eine ziemlich große Bandbreite verbrauchen würde und daher unnötig ist (hier kommt es bei langsamen Verbindungen zu Verzögerungen).

Es gibt keinen besonderen Unterschied zwischen einem TCP- und einem UDP-Port, abgesehen von der Art der Verbindung (Paket senden und vergessen, wie bei UDP, oder eine Verbindung aushandeln und aufrechterhalten, wie bei TCP) und dem Dienst, der auf der Serverseite abgehört wird. z. B. würde TCP/25 normalerweise einen SMTP-Server anzeigen, UDP/25 dagegen nicht.

2voto

Jeremiah Gowdy Punkte 5208

Im Grunde genommen sind moderne TCP-Implementierungen genauso schnell wie UDP, wenn Sie die Verbindung aufrechterhalten. Wenn TCP ein Paket erneut senden muss, müssen Sie es auch bei UDP erneut senden. Außerdem muss bei UDP derselbe Zuverlässigkeitscode (erneute Übertragung von verworfenen Paketen) implementiert werden, den TCP bereits implementiert hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X