Mein Webserver und mein Webbrowser verwenden offenbar gleichzeitig Port 80

1053
David Winiecki

Wenn ich unter OS X

  1. Starten Sie Firefox.
  2. Starten Sie Google Chrome.
  3. Starten Sie einen Ruby on Rails-Server an Port 80 (mithilfe von RVM).

    rvmsudo rails -p 80 
  4. Verwenden Sie lsof, um zu sehen, was auf Port 80 ausgeführt wird

    sudo lsof -i:80 

Dann sehe ich in der Ausgabe "Ruby", "Firefox" und "Google".

Ich höre ständig, dass nur ein Prozess einen Port abhören kann. Wie können alle diesen Port 80 gleichzeitig verwenden? Wie unterscheidet sich Firefox und Chrome diesen Port von der Art, wie Rails den Port verwendet?

1
Wie sind Sie zu dem Schluss gekommen, dass die aufgelisteten Prozesse wirklich an Ihrem lokalen Port 80 _listen_ sind? Run CMD vor 7 Jahren 1
Ich weiß, dass Rails zuhört (über WEBrick), denn es handelt sich um einen Webserver. Ich kann Anfragen von einem Webbrowser an den Rails-Server an Port 80 stellen, beispielsweise mit der URL http: // localhost /. David Winiecki vor 7 Jahren 0
Ich glaube jedoch, dass ich falsch lag, dass Firefox und Chrome den _local_-Port 80 überhaupt verwenden. David Winiecki vor 7 Jahren 0

3 Antworten auf die Frage

1
David Winiecki

After learning about and trying sudo lsof -i and sudo lsof -iTCP, and reading "Do web browsers use different outgoing ports for different tabs?", I think I'm just reading the output from lsof incorrectly.

Here's an example:

$ sudo lsof -iTCP:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ... firefox xxxx user xxxxxx IPv4 xxxxxxxxx xxxxxx TCP 192.168.0.100:12345->stackoverflow.com:http (ESTABLISHED) 

Looking at this example and other output from sudo lsof -i I think it's pretty clear that this line from Firefox appears in the output because Firefox is connecting to port 80 on a remote server, from the local port 12345. Firefox is not connecting to a remote server from the local port 80.

I don't know if it is possible for a client like Firefox to connect from port 80 while a local server is listening on port 80, but what is happening here at least doesn't seem to challenge that idea, because that is not what Firefox is doing.

sudo lsof -i:80 -s TCP:^LISTEN shows the connections to port 80 on remote computers, unless a local client uses local port 80 to connect to something. It's strange there doesn't seem to be an option to just list which local ports are in use.

Es kann nur ein Socket-Deskriptor für einen bestimmten Port in einer Betriebssysteminstanz vorhanden sein. Die Verwendung von "Prozessen" ist hier jedoch ungenau, da es möglich ist, diesen Deskriptor mit untergeordneten Prozessen zu teilen. Die Grundidee ist offensichtlich, dass über der Transportschicht keine weitere Unterscheidung erforderlich ist, was sinnvoll ist, weil sie ineffizient ist. Das Betriebssystem kann einem lokalen Port nur einen Socket-Deskriptor zuordnen (siehe "man 3posix connect"). Außerdem beginnen clientseitige Portnummern normalerweise bereits bei 1000, um sie von serverseitigen Ports zu unterscheiden. Run CMD vor 7 Jahren 1
Der von einer Anwendung verwendete zufällige Port (ein Browser, der das Betriebssystem nach einem Port fragt) wird aus einem hohen Bereich stammen, sicherlich über 1024. Arjan vor 7 Jahren 0
0
vembutech

Generally all browsers ( client side ) connecting to port 80 on web server ( server side ). So at the server side only port 80 is on listening state. Browsers use any TCP connection to port 80 on web server.

-1
sysfiend

Short answer: a port cannot be shared

As you only have one IP and you may be recieving a lot of data coming to you at the same exact time, ports are being used to send the data to the process meant to recieve it. This lead us to the first line: ports cannot be shared.

Server side processes have an specific port and they never change it unless you do so but, in the other hand, the client just opens a random high port and connects to the server. That port may be used again but the same process again or not, but you never know and it doesn't matter.

Das ist kein guter Ausdruck. Streng genommen muss das Tupel (lokale IP-Adresse, lokaler TCP-Port, Remote-IP-Adresse, Remote-TCP-Port) eindeutig sein. Natürlich können einige Implementierungen weitere Einschränkungen auferlegen, um es einfach zu halten. Daniel B vor 7 Jahren 0