应用程序在任意端口运行时如何从互联网接收数据包?

3

当我学习互联网协议时,有一个问题突然浮现在我的脑海中。通常,我们可以为没有典型用途的端口(例如HTTP的80端口,HTTPS的443端口)分配给我们的应用程序。例如,当我使用Node.jsExpress构建一个简单的服务器时,我可以像下面这样为这个进程分配5000端口。

const express = require('express')
const app = express()
const port = 5000

// some code to configure server

app.listen(port, () => {
  console.log(`Server is now running on port ${port}`)
})

我的 Node.js 应用程序将监听端口5000。如果我的IP地址是例如10.10.10.10,则只要有人访问10.10.10.10:5000,我的应用程序就会收到请求。然而,如果这是一个HTTP/HTTPS请求,那么数据包不应该来自端口80 / 443吗?有没有人能告诉我为什么不是这种情况,或者解释一下为什么监听不同端口的应用程序可以接收来自80 / 443的数据包。

谢谢。

1个回答

2
当数据包离开您的计算机时,它经过了OSI模型的所有层。它包含基本上六个特定信息。
目标和源IP地址(服务器的IP地址和您的IP地址),目标和源端口(服务器上它要到达的端口和您计算机上使用的端口)以及目标和源MAC地址(它即将到达的计算机的MAC地址(本地)和您计算机的MAC地址)。
在简单的配置中(路由器后面的计算机),当您发送这个数据包时,它会使用路由器的MAC地址重新路由到路由器。操作系统保留一个路由表,其中包含有关对哪个IP地址执行什么操作的信息。无论是"On-Link"还是它需要将数据包发送到默认网关。您可以通过在Windows CMD中键入`route print`来打印计算机的路由表。如果您加入外部服务器,则数据包将被发送到默认网关。它可能需要进行ARP请求以获取默认网关的MAC地址(或根据您计算机此时的ARP表格而不需要)。您可以通过在Windows CMD中键入`arp -a`来查看ARP表格。
一旦数据包到达路由器,路由器会剥离源IP(您的内部网络IP)并将其替换为其外部接口的IP(您的公共IP)。它使用NAT表来链接这两个地址:

Example of NAT table

它还会剥离内部端口并用一个可用的随机端口(向右)替换它。这意味着访问同一网站的两台不同计算机可以共享相同的本地端口,而目标端口保持不变。
最终,如果您从路由器外部收到请求,则您的路由器没有该数据包的NAT表条目,因为它不是由您发起的。您需要使用端口转发告诉您的路由器将传入的数据包(发送到某个特定端口)转发到特定的内部IP地址。
一些路由器(如我的)不支持指定外部端口和内部端口。因此,这两者相同(您无法指定不同的外部和内部端口,因此无法将外部80转发到内部5000)。在您的情况下,您需要指定一个外部端口为80/443,一个内部端口为5000,发送到10.10.10.10,才能使您的配置正常工作。否则,它将无法工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接