繁体   English   中英

在任意端口上运行的应用程序如何从 Internet 获取数据包?

[英]How does application running on arbitrary port get packets from Internet?

在我学习互联网协议的时候,我突然想到了一个问题。 通常,我们可以将任何不用于典型用途的端口(例如,80 用于 HTTP,443 用于 HTTPS)分配给我们的应用程序。 例如,当我使用Node.js Express构建一个简单的服务器时,我可以将端口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。

谢谢你。

当一个数据包离开您的计算机时,它会通过 OSI model 的所有层。 它基本上包含六个具体信息。

目标和源 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 表在这两个地址之间建立链接:

NAT 表示例

它还剥离了内部端口并用随机可用端口(右侧)替换它。 这意味着访问同一个网站的两台不同的机器可以共享同一个本地端口。 目的端口保持不变。

最后,如果您收到来自路由器外部的请求。 您的路由器没有该数据包的 NAT 表条目,因为它不是由您发起的。 您需要使用端口转发来告诉您的路由器将传入数据包(发往某个端口)转发到某个内部 IP。

一些路由器(比如我的)不支持指定外部端口和内部端口。 所以这两者是相同的(你不能指定不同的外部和内部端口,所以你不能将外部 80 转发到内部 5000)。 在您的情况下,您需要指定 80/443 的外部端口和 5000 的内部端口,以使您的配置正常工作。 否则,它不应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM