Nicht persistentes HTTP hat für jede Request einen anderen Socket?


31.01.2021, 18:39

Edit: Wenn ich von Quell- und Ziel rede dann immer aus Sicht des Clients, damit das einheitlich ist.

4 Antworten

Ein Socket ist die Kombination von IP-Adresse und Port. Ein Socket bezieht also auf OSI-Ebene 3 und 4. Wenn Du einen HTTP-Server ansprichst, ist der Server-Socket normalerweise immer gleich, der Client-Socket unterschiedlich. Wenn ein und derselbe Client eine Webseite abruft, werden in der Regel mehrere Dateien abgerufen: die HTML-Seite selbst, referenzierte Bilder, Scripte, Stylesheets, etc. Diese Abrufe erfolgen teilweise parallel, sodass der Client bei nicht-persistentem HTTP mehrere Anforderungen parallel sendet. Jede Anforderung hat eine eigene TCP-Sitzung, also einen anderen Socket.

Ein TCP Socket wird doch eindeutig durch Quell- und Ziel IP und Quell- und Ziel Port identifiziert, also ein Viertupel.

Meiner Meinung nach gibt es einen Client- und einen Server-Socket. Die Kommunikation hat also zwei Sockets. Aber selbst wenn wir den Socket über den Viertupel definieren, trifft das oben Gesagte zu.

Wenn wir jetzt eine Website mit nicht persistenten HTTP runterladen, dann wird also laut Aussage des Professors für jedes inline Objekt ein eigener TCP Socket erstellt. Aber welche der vier Einträge des Tupels ändert sich denn?

Der Client Socket. Für jede TCP-Sitzung "würfelt" der Client einen neuen Absender-Port.

Aber ist das bei einer großen Website mit teilweise 100 inline Objects nicht dann etwas sehr aufwendig?

Richtig. HTTP 1.1 kann persistent sein, HTTP2 ist meines Wissens immer persistent. HTTP3 hingegen nicht, weil HTTP3 über UDP übertragen wird.

Und noch eine dritte Frage: Ist die Ziel IP nicht sowieso immer gleich?

Ein Server kann mehrere IP-Adressen haben. In der Regel wird eine Anfrage eines Clients aber immer an eine IP-Adresse gerichtet sein, sodass diese IP-Adresse immer gleich ist. "Ziel-IP" ist übrigens unglücklich, weil das Ziel für den Client der Server und für den Server der Client ist. Es ist also immer eine Frage der Sichtweise, was hier das Ziel ist.

Amago 
Fragesteller
 31.01.2021, 19:14

Ja, also in den Folien steht auch dass es jeweils immer zwei Sockets gibt, einen auf Client und einen auf Serverseite. Aber später steht eben da, dass eben bei nicht persistenten HTTP für jede Request ein neuer Socket erstellt wird. Und deswegen wusste ich jetzt nicht, welcher neu erstellt wird, eben weil es ja jeweils eigentlich zwei sind.

Also die Verbindung hat jeweils zwei Sockets, aber um einen Socket eindeutig zu identifizieren reicht eben dieses Viertupel, so hab ich das verstanden.

Aber wenn sich der Absenderport ändert, muss doch der Server auch einen neuen Socket erstellen, weil sich ja der Senderport ändert und wir somit insgesamt ein anderes Viertupel haben, oder? Also der Server sieht zwei Anfragen von verschiedenen Senderports, und deswegen macht er für jede Anfrage auch einen neuen Socket auf, oder?

0
franzhartwig  31.01.2021, 19:48
@Amago
Ja, also in den Folien steht auch dass es jeweils immer zwei Sockets gibt, einen auf Client und einen auf Serverseite.

Das spricht gegen den Viertupel.

Aber später steht eben da, dass eben bei nicht persistenten HTTP für jede Request ein neuer Socket erstellt wird.

Ja, ein neuer Client Socket, weil ein anderer Port verwendet wird. Der Server Socket bleibt unverändert, denn es wird dieselbe IP-Adresse und derselbe Port (80 oder 443) angesprochen.

Also die Verbindung hat jeweils zwei Sockets, aber um einen Socket eindeutig zu identifizieren reicht eben dieses Viertupel, so hab ich das verstanden.

Das Viertupel beinhaltet zwei Sockets:

Client Socket: IP-Adresse des Clients, Absender-Port des Clients beim Verbindungsaufbau.

Server Socket: IP-Adresse des Servers, Ziel-Port beim Verbindungsaufbau (in der Regel 80 oder 443).

Beides kannst Du dann zu einem Viertupel zusammenfassen. Ein Tupel ist ja nur die Kombination von verschiedenen Parametern. Ein Viertupel umfasst vier Parameter. Es wird nur ein Parameter geändert, nämlich der Port des Clients. Damit ändert sich der Client Socket und auch der Viertupel.

Aber wenn sich der Absenderport ändert, muss doch der Server auch einen neuen Socket erstellen

Nein, der Server Socket ist festgelegt durch die IP-Adresse (die sich ja nicht ständig ändert) und den Port, der die Applikation anspricht und in der Regel dem Standard entspricht.

Also der Server sieht zwei Anfragen von verschiedenen Senderports, und deswegen macht er für jede Anfrage auch einen neuen Socket auf, oder?

Nein. Wir schauen jetzt mal konkret auf meinen Rechner:

netstat -tn4 | grep 443
tcp    0   0 192.168.1.3:52392   99.86.89.97:443     VERBUNDEN  
tcp    0   0 192.168.1.3:52394   99.86.89.97:443     VERBUNDEN  
tcp    0   0 192.168.1.3:45354   213.95.206.145:443   VERBUNDEN  
tcp    0   0 192.168.1.3:45172   213.95.206.145:443   VERBUNDEN  

Du siehst hier zwei offene Verbindungen pro Ziel. Nur der Port meines Rechners, also der Client-Port unterscheidet sich.

0
franzhartwig  31.01.2021, 20:02
@franzhartwig

Ich habe zur Verdeutlichung mal einen Mitschnitt gemacht:

19:50:52.601889 IP6 Client.33168 > Server.80: Flags [S], 
19:50:52.613030 IP6 Server.80 > Client.33168: Flags [S.], 
19:50:52.750512 IP6 Client.33170 > Server.80: Flags [S], 
19:50:52.750590 IP6 Client.33172 > Server.80: Flags [S], 
19:50:52.761522 IP6 Server.80 > Client.33170: Flags [S.], 
19:50:52.761888 IP6 Server.80 > Client.33172: Flags [S.], 
19:50:52.846892 IP6 Client.33174 > Server.80: Flags [S], 
19:50:52.857897 IP6 Server.80 > Client.33174: Flags [S.], 

Ich habe die unwichtigen Sachen herausgekürzt, im Wesentlichen die Verbindungsaufbauten (SYN, SYN/ACK) habe ich hier hereinkopiert. Die IP-Adressen habe ich durch Server und Client anonymisiert. Du siehst hier bei Aufruf einer HTTP-Seite mit HTML-Datei, CSS-Datei, Script und JPG-Datei vier Verbindungen, die geöffnet werden. Der einzige Unterschied: Der Client-Port.

0

Es ändert sich der Client-Port.

Stell dir vor du lädst die Website zweimal parallel und die Seite hat ein dynamisches Element, welches bei den beiden Ladegängen unterschiedlich ist. Durch den unterschiedlichen Port weiss dein Browser daher in welches Tab welche Daten gehören.

Der Zielsocket bleibt immer identisch, denn die Charakteristik von Servern ist dass der Zielport identisch bleibt. Die IP-Adresse bleibt in der Regel ebenfalls identisch, in der Theorie kann sich diese natürlich ändern wenn man z.b. via Load Balancing mehr als einen Server hat.

Woher ich das weiß:Berufserfahrung – arbeite seit vielen Jahren in der IT

zu 3

also erstens kann ein server ja mehrere physikalische netzwerk karten haben udn zweitens auch mehrere IP adressen. im grossen umgebungen sind 10 oder 20 ip adressen keine seltenheit. man kann zum beispiel jedem dienst eine eigene IP geben, dann kannst du die zwischen verschiedenen servern umziehen, ohne die ip wechseln zu müssen. also jedenfalls wenn du im passenden sement bleibst.

Amago 
Fragesteller
 31.01.2021, 18:46

ah oke danke das wusste ich nicht. Ich dachte die Prozesse auf einem System unterscheiden sich eben nur durch die Portnummer. Oke danke

0
HarryXXX  31.01.2021, 18:50
@Amago

ja klar gibts auch
192.168.1.1:631 für cups
192.168.1.1:80 für web
192.168.1.1:389 für ldap
192.168.1.1:22 für ssh
usw
aber kann eben auch anders sein

1

Der Quellport ändert sich.