Entwickler-Ecke

Internet / Netzwerk - Frage zu Netzwerk > Transport-Layer


Jakob Schöttl - Mi 28.07.10 22:19
Titel: Frage zu Netzwerk > Transport-Layer
Hallo,

wie können denn zwei Anwendungen (z.B. iexplore.exe und firefox.exe) am selben PC über den gleichen Port laufen?
Ich lerne nämlich gerade was über Netzwerktechnik, und da gibt es die Transportschicht mit Sockets, mit denen man eben einen Prozess mit einem Server verbinden kann (z.B. Firefox mit delphi-forum.de).

Und so ein Socket besteht ja aus IP-Adresse und Port-Nummer. Ja, wie geht das jetzt, wenn zwei Programme (wie die Browser) den gleichen Port benutzen, woher wissen die wer dann gemeint ist?

Danke schon mal!


Flamefire - Mi 28.07.10 22:24

AFAIK geht das NICHT.
Sie könne sich zwar zum gleichen Port verbinden, hören aber auf verschiedenen.
z.b. FF auf Port 3100 und IE auf Port 3101 verbinden sich zum delphi-forum auf Port 80

BTW: Uni Rechnernetze LV?


Jakob Schöttl - Mi 28.07.10 22:41

In der Ausbildung haben wir grad einen Kurs "Netzwerktechnik Level 1"...

hm, HTTP läuft also nur beim Server auf Port 80? Und Jeder Browser/Jedes Programm benutzt seinen eigenen Port...?

naja, ich weiß nicht ob die dann für FF und iexplore registriert sind, hier in der Liste find ich sie jedenfalls nicht: http://www.bekkoame.ne.jp/~s_ita/port/port3100-3199.html

danke jedenfalls schonmal


Martok - Mi 28.07.10 22:55

Grundsätzlich musst du zwischen Listening Sockets (volgo Server) und Connecting Sockets (vulgo Client) unterscheiden.
Das ist aber nicht mehr Netzwerklayer, sonsern drüber (je nach Modell, allerdings).

Was richtig ist: Punkt-zu-Punkt-Verbindungen sind immer an einen Port gebunden. Sonst würde ein IP-Stack z.B. ein Datenpaket nicht einem Socket zuordnen können.
Also:
HostA:PortA <-> HostB:PortB
(wobei PortA und PortB auch gleich sein könnten, s.u.)

Wenn ich einen Listening Socket öffne (also z.B. einen HTTP-Server starte), dann muss der Port 80 z.B. dazu frei sein. Ist da schon jemand (Skype z.B., wenn man Ausweichports erlaubt), dann kann der Socket nicht geöffnet werden. Ist eben exklusiv.

Wenn ich mich aber als Client mit einem entfernten Socket verbinden möchte, sage ich i.allg. nur "Mach mir mal eine Verbindung nach HostB:PortB", und gebe dabei nicht an was mein lokaler Port sein soll. Im interaktiven Teil des letzten EE-AGS musste man das allerdings, war Teil des Rätsels... aber ich schweife ab.
Jedenfalls: die API wählt dann selbstständig einen Port aus, von dem sie weiß dass er frei ist. Die genaue Nummer kann man nicht vorhersagen. Sie ist aber definitiv größer als 1024, wie in irgend einer RFC nachzulesen ist.

Kurzes Beispiel (DNS etc spar ich mir mal und nehm mal an, dass wir grade persistente Verbindungen brauchen):
Firefox verbindet sich zu delphi-forum.de:80
Ergibt die vom OS geknotete Verbindung: localhost:XXXX <-> delphi-forum.de:80

Firefox verbindet sich zu google.de:80
Ergibt die vom OS geknotete Verbindung: localhost:YYYY <-> google.de:80

IE verbindet sich zu delphi-forum.de:80
Ergibt die vom OS geknotete Verbindung: localhost:ZZZZ <-> delphi-forum.de:80

:arrow: alles eindeutig.

Siehe dazu auch die Ausgabe von `netstat`.


Jakob Schöttl - Do 29.07.10 17:20

Danke Martok, jetzt sind alle meine Fragen beantwortet!

Ich hab u.a. auch nicht ganz überrissen, dass nur der HTTP-Server auf Port 80 hört.

Meine Zusammenfassung:
Anderen Programmen (Clients) wird also irgendein freier Port zugeteilt, über den sie dann zum Server verbinden. Und der Port vom Server muss eben bekannt sein.

Genau und an netstat hab ich mich auch schwach erinnert und aber mir ists nicht mehr eingefallen, sonst hätt ichs mir auch gleich damit anschaun können.

Vielen Dank, bis bald...