Wie verbindet ein HTTP -Client eine HTTP -Antwort mit einer Anfrage (mit Netty) oder im Allgemeinen?

StackOverflow https://stackoverflow.com/questions/7306497

  •  25-10-2019
  •  | 
  •  

Frage

Soll ein HTTP -Endpunkt auf Anfragen eines bestimmten Kunden reagieren, damit sie empfangen werden?

Was ist, wenn es bei Anfragen, die von Cluster hinter einem Proxy oder in Anfragen mit NIO bearbeitet wurden, bei denen eine Anfrage schneller als die andere abgeschlossen ist, nicht sinnvoll ist?

Gibt es eine Standardmethode, um eine eindeutige ID mit jeder HTTP -Anfrage zu verbinden, um mit der Antwort zu assoziieren? Wie wird dies in Clients wie HTTP -Komponenten httpclient oder curl behandelt?

Die Frage kommt auf den folgenden Fall an:

Angenommen, ich lade eine Datei von einem Server herunter und die Anforderung ist noch nicht fertig. Kann ein Kunde andere Anfragen für die gleiche Keep-Alive-Verbindung erfüllen?

War es hilfreich?

Lösung

Ich werde die Antwort von Codecaster nicht neu schreiben, weil sie sehr gut formuliert ist.

Als Antwort auf Ihre Bearbeitung - nein. Es ist nicht. Eine einzelne persistente HTTP -Verbindung kann nur für eine Anfrage gleichzeitig verwendet werden, oder sie würde sehr verwirrend werden. Da HTTP keine Form des Anforderungs-/Antwortverfolgungsmechanismus definiert, wäre dies einfach nicht möglich.

Es ist zu beachten, dass es andere Protokolle gibt, die ein ähnliches Nachrichtenformat verwenden (entsprechen an RFC822), die dies erlauben (unter Verwendung von Mechanismen wie z. SIPs CSEQ -Header), und es wäre möglich, dies in einer benutzerdefinierten HTTP -App zu implementieren, aber HTTP definiert keinen Standardmechanismus dafür, und daher kann nichts getan werden, was überall zu funktionieren. Es würde auch ein Problem mit der Antwort für die zweite Nachricht darstellen. Warten Sie auf die erste Antwort, bevor Sie die zweite Antwort senden, oder versuchen Sie, die erste Antwort zu pausieren, während Sie die zweite Antwort senden? Wie werden Sie dies auf eine Weise kommunizieren, die garantiert, dass Nachrichten nicht beschädigt werden?

Beachten Sie auch, dass SIP (normalerweise) über UDP arbeitet, was keine Paketbestellung garantiert und das CSEQ -System mehr zu einer Notwendigkeit macht.

Wenn Sie eine Anfrage an einen Server senden möchten, während eine weitere Transaktion noch in Arbeit ist, müssen Sie eine neue Verbindung zum Server und damit einen neuen TCP -Stream erstellen.

Facebook recherchierte einige nach, während sie ihre CDN bauten, und sie kamen zu dem Schluss, dass Sie gleichzeitig 2 oder 3 offene HTTP -Streams haben können, aber mehr als das verkürzt die Übertragungszeit aufgrund der zusätzlichen Paket -Overhead -Kosten. Ich würde auf den Blogeintrag verlinken, wenn ich den Link finden könnte ...

Andere Tipps

Immer wenn eine TCP -Verbindung geöffnet wird, wird die Verbindung von Quell- und Zielports und IP -Adressen erkannt. Wenn ich also eine Verbindung zu www.google.com auf dem Zielport 80 herstelle (Standard für HTTP), benötige ich einen kostenlosen Quellport, den das Betriebssystem generiert.

Die Antwort des Webservers wird dann an den Quellport (und IP) gesendet. Auf diese Weise funktioniert NAT auch und erinnert sich, welcher Quellport zu welcher internen IP -Adresse gehört (und umgekehrt für eingehende Verbindungen).

Was Ihre Bearbeitung betrifft: Nein, eine einzelne HTTP -Verbindung kann gleichzeitig einen Befehl (get/post/usw.) ausführen. Wenn Sie einen weiteren Befehl senden, während Sie Daten aus einem zuvor ausgegebenen Befehl renovieren, können die Ergebnisse je nach Client- und Server -Implementierung variieren. Ich denke, dass Apache beispielsweise das Ergebnis der zweiten Anfrage übertragen, nachdem die Daten der ersten Anfrage gesendet wurden.

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