
So wie ich es verstehe, nimmt TCP einen Datenblock und zerlegt ihn inSegmentedie über ein TCP übertragen werdenSitzung.
Nehmen wir nun an, dass ich als Client zwei Datenblöcke habe A
, B
die ich an einen Server senden möchte. Jeder Block ist in drei Segmente unterteilt, sodass insgesamt sechs Segmente entstehen.
Ich werde diese 6 Segmente über das Internet senden, kann aber nicht garantieren, in welcher Reihenfolge der Server sie empfängt. Glücklicherweise ordnet der TCP-Server Segmente, die nicht in der richtigen Reihenfolge sind, für mich neu an.
Für meine Anwendung sind Chunks A
und jedoch völlig unabhängig, daher möchte ich nicht, dass der Server auf Segmente B
wartet, wenn alle Segmente empfangen wurden, oder umgekehrt. Tatsächlich möchte ich zwei unabhängige TCP-Sitzungen für Chunks und .A
B
A
B
Ist es möglich, dass ein Client und ein Server parallele, unabhängige TCP-Sitzungen haben? Wenn ich mir die TCP-Headereinträge ansehe, sehe ich keine „Sitzungsnummer“. Bin ich gezwungen, unterschiedliche Quell- oder Zielports zu verwenden?
Antwort1
Natürlich können Sie zwei parallele, unabhängige TCP-Sitzungen zwischen demselben Client und Server haben. Andernfalls könnten Webbrowser beispielsweise nicht gleichzeitig eine HTML-Seite und ein Bild oder zwei Bilder von einem Webserver abrufen.
Der Diskriminator für TCP-Sitzungen ist nicht eine „Sitzungsnummer“, sondern das Tupel(lokale Adresse, lokaler Port, Remote-Adresse, Remote-Port). Solange mindestens einer davon unterschiedlich ist, handelt es sich um eine andere TCP-Sitzung.
Als Antwort auf Ihre Frage: Ja, Sie sind gezwungen, einen anderen Quell- ODER Zielport zu verwenden. Ihr TCP-Stack wird die Verbindung verweigern (und Ihnen den Fehler EADDRINUSE anzeigen), wenn Sie versuchen, denselben Quell- UND Zielport zu verwenden. Dies alles setzt voraus, dass die lokale Adresse und die Remote-Adresse überall gleich sind.
Aber das ist nichts, worüber Sie sich normalerweise Gedanken machen müssen. Normalerweise müssen TCP-Initiatoren (Clients) nicht an einen bestimmten Port gebunden sein. Sie lassen den Kernel automatisch einen Quellport auswählen, indem sie nicht aufrufen, bind()
bevor sie aufrufen connect()
. Der Kernel stellt sicher, dass für die zweite Verbindung ein anderer Quellport ausgewählt wird.
Antwort2
Die akzeptierte Antwort ist richtig und beantwortet die Frage, aber die Frage behandelt ein Problem, das eine andere Antwort hat als die Verwendung mehrerer TCP-Streams.
Das von Ihnen beschriebene „Head of Line Blocking“-Problem ist eine Motivation hinter dem Quick UDP Internet Connections (QUIC)-Protokoll. Ich empfehle, sich das anzusehendieser Webcastvon Google zu QUIC, wenn Sie daran interessiert sind, wie dieses und andere Probleme dadurch gelöst werden.
Natürlich gibt esQUIC auf Wikipediazu.