我的 Web 服务器和 Web 浏览器似乎同时使用端口 80

我的 Web 服务器和 Web 浏览器似乎同时使用端口 80

如果我在 OS X 上

  1. 启动 Firefox。
  2. 启动 Google Chrome。
  3. 在端口 80 上启动 Ruby on Rails 服务器(使用 RVM)

    rvmsudo rails -p 80
    
  4. 使用 lsof 查看端口 80 上正在运行什么

    sudo lsof -i:80
    

然后我在输出中看到“ruby”、“firefox”和“Google”。

我总是听说只有一个进程可以监听一个端口。所有这些进程怎么能同时使用端口 80?Firefox 和 Chrome 使用端口的方式与 Rails 使用端口的方式有何不同?

答案1

在了解、尝试sudo lsof -isudo lsof -iTCP阅读之后“网络浏览器是否对不同的标签使用不同的传出端口?”,我想我只是错误地读取了输出lsof

以下是一个例子:

$ 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)

看看这个例子和其他输出,sudo lsof -i我认为很明显,Firefox 的这一行出现在输出中,因为 Firefox 正在连接远程服务器上的 80 端口,本地端口 12345。Firefox 未连接到远程服务器本地端口80。

我不知道当本地服务器正在监听端口 80 时,像 Firefox 这样的客户端是否可以从端口 80 进行连接,但这里发生的事情至少似乎并没有挑战这个想法,因为这不是 Firefox 正在做的事情。

sudo lsof -i:80 -s TCP:^LISTEN显示远程计算机上到端口 80 的连接,除非本地客户端使用本地端口 80 连接某个东西。奇怪的是,似乎没有一个选项可以列出哪些当地的端口正在使用中。

答案2

通常,所有浏览器(客户端)都连接到 Web 服务器(服务器端)的端口 80。因此,在服务器端,只有端口 80 处于监听状态。浏览器使用任何 TCP 连接连接到 Web 服务器上的端口 80。

答案3

简短回答:a port cannot be shared

由于您只有一个 IP,并且可能会在同一时间收到大量数据,因此会使用端口将数据发送到要接收数据的进程。这引出了第一行:ports cannot be shared

服务器端进程有一个特定的端口,除非你更改,否则它们永远不会更改该端口,但另一方面,客户端只会打开一个随机的高端口并连接到服务器。该端口可能会再次使用,但相同的进程可能会再次使用,但你永远不知道,这也没关系。

相关内容