如果我在 OS X 上
- 启动 Firefox。
- 启动 Google Chrome。
在端口 80 上启动 Ruby on Rails 服务器(使用 RVM)
rvmsudo rails -p 80
使用 lsof 查看端口 80 上正在运行什么
sudo lsof -i:80
然后我在输出中看到“ruby”、“firefox”和“Google”。
我总是听说只有一个进程可以监听一个端口。所有这些进程怎么能同时使用端口 80?Firefox 和 Chrome 使用端口的方式与 Rails 使用端口的方式有何不同?
答案1
在了解、尝试sudo lsof -i
和sudo 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
。
服务器端进程有一个特定的端口,除非你更改,否则它们永远不会更改该端口,但另一方面,客户端只会打开一个随机的高端口并连接到服务器。该端口可能会再次使用,但相同的进程可能会再次使用,但你永远不知道,这也没关系。