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

alles eindeutig.
Siehe dazu auch die Ausgabe von `netstat`.
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."