因此,当我在 VSCode IDE 中运行节点应用程序时,我编写的大部分代码(来自一本书)都有“监听端口 3000”的程序,然后我转到 localhost:3000(哪个 8080,以哪个为准)。但是,当我访问真正的网站(如 superuser.com)时,我的计算机是在监听自己的端口 X,还是在监听另一台计算机的端口 X?另一个网站的端口 X?
答案1
我想你可能对这个问题有些困惑。让我们澄清一下选项:
- 当你开发一个列出端口的应用程序时,你就成为了“服务器”,在这种情况下,操作系统会要求你的应用程序从特定端口获取所有数据,然后您的电脑正在列出到该端口。在你的情况下,当你在端口 3000 上运行服务时,你会得到本地主机:3000,在这种情况下您实际上正在列出这个端口。
- 当您访问 superuser.com 时,superuser.com 正在列出到端口 443 (https) 并等待客户端(如您)并打开套接字进行通信。
在每种情况下,您都会向任何端口请求/发送数据,大多数情况下您会等待回复,因此在大多数协议中,您使用随机端口并列出回复。(因为您必须从某个端口发出请求...)
答案2
但是,当我访问一个真实的网站,比如 superuser.com 时,我的计算机是在监听它自己的端口 X,还是另一台计算机的端口 X?另一个网站的端口 X?
当您连接到 superuser.com:80 时,您的计算机确实从它自己的端口 X 发送数据包,并期望接收到发送到它自己的端口 X 的回复数据包。(每个连接的端口号是随机分配的。)
因此数据包如下所示:
computer:X --> superuser.com:80 TCP SYN
superuser.com:80 --> computer:X TCP SYN <ack>
computer:X --> superuser.com:80 TCP data (HTTP request)
superuser.com:80 --> computer:X TCP data (HTTP response)
然而,这是不一样为“监听端口”,即接受新连接。端口 X 严格用于仅适用于该传出连接– 没有任何东西可以从外部连接到它。
(事实上,只要 VSCode 实际在监听端口 3000,它就被视为“繁忙”,并且操作系统永远不会使用相同的端口 3000 进行传出连接。总是其中之一。)