簡體   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