PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ports?!



bischi
12-11-2003, 07:39
Gibt es eigentlich irgendwelche Regeln, welche Ports ein Programm brauchen kann, welche bereits besetzt sind,...

MfG Killerdo

peschmae
12-11-2003, 08:41
ich glaube ab 1000 darf ein normaler User Ports öffnen

<1000 brauchts root-Rechte

keine Ahnung wieso.

Ausserdem gibts irgendwo ne Organisation, die ne Liste mit Programmen/Diensten führt, die diesen und jenen Port nutzen (keine Ahnung wo)

MfG Peschmä

anda_skoa
12-11-2003, 10:03
Priviligierte Ports bis 1024, d.h. nur ein Programm mit Superuserrechten kann diese zu Listen öffnen.

Eine einfache Sicherheitsmaßnahme, damit nicht ein normaler User vorgeben kann, ein Systemservice zu sein.

Ciao,
_

peschmae
12-11-2003, 10:16
ist das allgemein so, oder nur auf Unix-stämmigen Betriebssystemen?

Ausserdem gibts afaik diverse Diskussionen, das bei Linux mal zu ändern (um den verschiedenen user-gruppen feiner granulierte Rechte zum Port-Öffnen zuzuordnen)

MfG Peschmä

Pingu
12-11-2003, 11:22
Siehe ICANN (http://www.icann.org)
Specifically, ICANN coordinates the assignment of the following identifiers that must be globally unique for the Internet to function: Internet domain names
IP address numbers
protocol parameter and port numbers
Zur ICANN (http://www.icann.org) gehört die IANA (http://www.iana.org), die für die Verwaltung der Nummern selbst zuständig ist mehr Infos hier (http://www.iana.org/numbers.html).

Pingu

peschmae
12-11-2003, 12:38
ah, voilà: ftp://ftp.iana.org/assignments/port-numbers

Hatte das Teil schon mal durchgeschaut, aber nicht gebookmarkt.

MfG Peschmä

bischi
12-11-2003, 12:45
Danke für die Hilfe.

Wenn ich jetzt ne Server-Client-Anwendung in Java schreibe - worauf muss ich bei der Vergabe der Ports genau achten? (Darf ich einfach irgendeinen nehmen, oder gibt es da Regeln?)

MfG Bischi

anda_skoa
12-11-2003, 12:48
Original geschrieben von peschmae
ist das allgemein so, oder nur auf Unix-stämmigen Betriebssystemen?

Ich denke bei allen Systemen.


Original geschrieben von bischi

Wenn ich jetzt ne Server-Client-Anwendung in Java schreibe - worauf muss ich bei der Vergabe der Ports genau achten?


Du kannst irgendeinen nehmen, aber wenn du schon weißt, dass er häufig benutzt wird, ist es vielleicht keine so gute Wahl :)

Ciao,
_

fs111
12-11-2003, 12:53
Original geschrieben von anda_skoa
Ich denke bei allen Systemen.



Du kannst irgendeinen nehmen, aber wenn du schon weißt, dass er häufig benutzt wird, ist es vielleicht keine so gute Wahl :)

Ciao,
_

Das ist nicht ganz richtig, unter Win kann man als jeder Benutzer, jeden Port öffnen.

fs111

peschmae
12-11-2003, 12:57
nur auf der Win9x-Schiene oder auch bei den NTs? (Die kennen ja offenbar ein wenig Benutzerrechte)

MfG Peschmä

bischi
12-11-2003, 12:58
Du kannst irgendeinen nehmen, aber wenn du schon weißt, dass er häufig benutzt wird, ist es vielleicht keine so gute Wahl

Wieso? Ist es dann langsamer oder läuft es gar nicht?

MfG Bischi

PS: Danke für die Links

anda_skoa
12-11-2003, 12:59
Original geschrieben von fs111
Das ist nicht ganz richtig, unter Win kann man als jeder Benutzer, jeden Port öffnen.


Hmm, muss ich mal ausprobieren.
Das letzte mal als ich dort was mit Sockets gemacht habe war da unter Win98, das kannte noch keine Rechtetrennng.

Ciao,
_

peschmae
12-11-2003, 13:01
Original geschrieben von bischi
Wieso? Ist es dann langsamer oder läuft es gar nicht?


wenn da schon ein Dienst draufsitzt hast du einen kleinen Konflikt

MfG Peschmä

bischi
12-11-2003, 13:03
wenn da schon ein Dienst draufsitzt hast du einen kleinen Konflikt

und da will heissen?

MfG Bischi

peschmae
12-11-2003, 13:07
hab ich nie ausprobiert. Aber das kann ja wohl nicht gehen.

Schliesslich stören sich die Dienste ja dann gegenseitig indem jeder Daten schriebt oder liest, die der andere gar nicht versteht. Also das totale Chaos.

Ob das überhaupt geht? :confused:

MfG Peschmä

bischi
12-11-2003, 13:10
Wie kann ich dann herausfinden, ob der Port bereits besetz ist? (ich meine, es könnte ja jemand sein Programm geschrieben haben ohne dies zu beachten...).

:confused: MfG Bischi

peschmae
12-11-2003, 13:16
nu ja,

Java wirft ne Exception, wenn der Port besetzt ist (je nach dem wie du auf ihn Zugreifen möchtest natürlich)

Etwa so:


public ServerSocket(int port)
throws IOException

Creates a server socket, bound to the specified port. A port of 0 creates a socket on any free port.

...

Throws:
IOException - if an I/O error occurs when opening the socket.


dann wechselst du halt den Server einfachauf den nächsthöheren Port. Das Problem ist allerdings dann, dass der Client nicht weiss, auf welchem Port genau der Server läuft.

Das könnte man evtl. mit einer Art "Handshake" lösen - der Client zählt einfach selbst ports rauf, bis er zu dem Kommt, auf dem der passende Server läuft.

Allerdings kann das dauern, wenn du Java den Port einfach selbst aussuchen lässt - das wären dann ja im schlimmsten Fall ein paar 1000 Anfragen :eek:

MfG Peschmä

Pingu
12-11-2003, 14:16
Original geschrieben von bischi
und da will heissen?
Das ist ganz einfach. Es ist wie mit einem Hotel. Stell Dir vor die Telefonnummer eines Hotels ist die IP Adresse des Hotels. Einen Gast im Hotel kann man jetzt anrufen indem man die Telefonnummer des Hotels wählt (ok ohne die 0 am Ende) und dann die Zimmernummer des Gastes anhängt. Die Zimmernummer des Gastes ist also sowas wie die Portnummer. Wenn kein Gast in dem jeweiligen Zimmer da ist, kann man dort auch keinen erreichen - der Dienst läuft also nicht. Bestimmte Zimmernummern sind nunmal für bestimmte Gäste festvergeben, z.B. bekommen in höherwertigen Hotels bestimmte Gäste immer das gleiche Zimmer - ein Dienst bekommt immer die gleiche Portnummer. Dies muß natürlich einmal zugewiesen werden. Bevor ein Gast seinen Zimmerschlüssel bekommt, muß er sich ersteinmal an der Rezeption anmelden - der Dienst muß sich zum Starten im System anmelden. Wenn jetzt dummerweise das Zimmer belegt ist (ein anderer Gast ist schneller gewesen), dann verweigert die Rezeption den Zimmerschlüssel, weil das Zimmer halt belegt. Das gleiche mit dem Dienst, es meldet sich am System an und möchte einen bestimmten Port haben, wenn der aber schon belegt, dann gibt es halt eine Fehlermeldung. Normallerweise hat der Gast jetzt zwei Möglichkeiten, entweder erfährt jetzt wieder nach Hause, belegt also kein Zimmer, oder fragt die Rezeption nach dem nächsten freien Zimmer. Das gleiche der Dienst, entweder er gibt jetzt auf und startet nicht, oder er fragt im System nach dem nächsten freien Port, dies macht z.B. der Browser so. Er fragt im System nach einem freien Port, bekommt ihn und benutzt ihn dann und am Ende gibt er Ihn wieder frei - achso der Gast checkt am Ende natürlich auch wieder aus. Was passiert jetzt wenn jetzt in einem Zimmer ein anderer Gast ist als den ich erwarte, wenn ich anrufe. Ganz einfach der andere Gast weiß nicht was ich von ihm will. Das gleiche mit dem Dienst, wenn auf einem Port ein Serverdienst schon läuft und ein Client erwartet aber einen anderen reden sie aneinander vorbei.

Wie Du das ganze nun programmierst, hängt jetzt von deiner Programmiersprache ab. Aber in jeder Programmiersprache gibt es jetzt entsprechende Funktionen um einen Port zu öffnen (sich an der Rezeption anzumelden) und dann teilt einem das System über einen Rückgabewert der Funktion mit ob des jetzt gut gegangen ist oder nicht.

Ich will jetzt nicht böse oder herablassend klingen, aber bevor Du Dich schon konkret mit irgendwelchen Ports auseinadersetzt, würde ich mir ersteinmal ansehen wie in der Programmiersprache meiner Wahl die Socketprogrammierung funktioniert. Persönlich muß ich jetzt sagen, ich habe noch keine Socketprogrammierung in irgendeiner Sprache durchgeführt, ich weiß nur wie es prinzipiell funktioniert. In PHP wäre eine entsprechende Beschreibung z.B. hier zu finden: http://www.php.net/manual/de/ref.sockets.php
Die Frage welche Port, die stellt man als allerletztes. Denn der dann verwendete Port wird meistens über eine Konstante eingestellt. Meine Apachen kann ich ja auch über die Konfiguration mitteilen, dass er demnächst nicht mehr auf Port 80 sondern meinetwegen auf Port 8080 laufen soll.

Gruß

Pingu

bischi
12-11-2003, 16:00
@pingu: Danke vielmals für die ausführliche Erklärung. Ich glaub, jetzt hab ichs verstanden. Zu der Programmiersprache: Ich verwende Java und hab mich schon damit auseinandergesetzt. Mein einziges Problem war, dass ich nicht gewusst habe, welche Ports ich zuweisen darf,...

MfG Bischi

fs111
12-11-2003, 20:23
Original geschrieben von anda_skoa
Hmm, muss ich mal ausprobieren.
Das letzte mal als ich dort was mit Sockets gemacht habe war da unter Win98, das kannte noch keine Rechtetrennng.

Ciao,
_

Das ist unter Win AFAIK völlig losgelöst von anderen Rechten. Jeder Benutzer kann bspw. problemlos einen Apach auf Port 80 betreiben, auch unter den NT-basierten.

fs111