為什麼發送請求時除了 IP 之外還必須提供連接埠號碼?

為什麼發送請求時除了 IP 之外還必須提供連接埠號碼?

我對連接埠的實際使用及其工作原理有相當的了解。不過,我有幾個問題想澄清一下。

  1. 如果我們發送請求時沒有指定伺服器套接字的端口,會發生什麼情況?
  2. 有沒有一種方法可以設定一台機器,這樣我就可以讓發送到我的 IP 位址的所有請求都由同一進程處理,而不是讓進程偵聽特定連接埠?在這種情況下,客戶端可以省略請求中的連接埠。
  3. 基於問題 2,如果我只想在 Raspberry Pi 之類的設備上運行某種伺服器,我可以擁有它,以便我的 IP 位址路由到我的 RPi,它使用同一台伺服器處理所有傳入的網路請求?也就是說,人們只需連接到 IP 位址(無需連接埠號)即可連接到我的伺服器。

答案1

為什麼發送請求時除了 IP 之外還必須提供連接埠號碼?

因為 TCP(和 UDP)協定需要它。它是協議規範的一部分。

如果我們發送請求時沒有指定伺服器套接字的端口,會發生什麼情況?

好吧,如果您不指定連接埠號,API 呼叫的該部分可能會為零。端口 0 是保留端口,某些實現使用它來表示由系統動態分配的端口。

有沒有一種方法可以設定一台機器,這樣我就可以讓發送到我的 IP 位址的所有請求都由同一進程處理,而不是讓進程偵聽特定連接埠?

如果您使用 TCP 或 UDP 傳輸層協定或任何基於它們建構的應用程式層級協定,則不會。例如HTTP

在某些作業系統中,有一個進程作為作業系統的一部分,但它會放棄與特定應用程式的連接。

我可以擁有它,以便我的 IP 位址路由到我的 RPi

您可以設定路由器將所有傳入連線請求路由到您的 rPi

人們只需連接到 IP 位址(無需連接埠號)即可連接到我的伺服器。

不使用 HTTP 等標準協定。

我認為使用 Berkely Sockets 等標準 API 是不可能的。我想您可以透過一些努力,使用您自己設計的不同的或新的傳輸層協定。你需要一些非常充分的理由來解決所有這些不便。

答案2

如果我們發送請求時沒有指定伺服器套接字的端口,會發生什麼情況?

不能,根據定義,套接字是 IP + 連接埠。連接埠的原因是因為一台機器上的多個程式可以發送/接收流量,並且連接埠用於區分兩端的進程。

有沒有一種方法可以設定一台機器,這樣我就可以讓發送到我的 IP 位址的所有請求都由同一進程處理,而不是讓進程偵聽特定連接埠?

您可以讓進程開啟 65535 個套接字,每個連接埠一個。如果沒有某種奇怪的中間程式(您可能必須自己編寫),您就無法讓現有程式執行此操作,而該程式不是為執行此操作而編寫的。

在 Linux 上,您也許能夠建立iptables執行此操作的配置或等效的配置。

如果我只想在 Raspberry Pi 之類的設備上運行某種伺服器,我可以讓我的 IP 位址路由到我的 RPi,它使用同一台伺服器處理所有傳入的網路請求嗎?

大多數標準住宅路由器的預設情況是您的路由器忽略外部發送的任何流量。

在幾乎所有此類路由器上,您都可以執行連接埠轉發,這告訴您的路由器將特定連接埠上的傳入流量轉發到路由器後面的專用網路上的特定係統。

您也可以告訴您的路由器將任何未經請求的傳入流量轉送到路由器後方的專用網路上的特定 IP。這稱為 DMZ。

答案3

連接埠對於允許多個進程在伺服器之間通訊的協定至關重要。這不僅僅是一個實際的考慮。

知名服務已指派連接埠:DNS=53、HTTP=80、HTTPS=443、SMTP=25、Telnet=23、SSH=22、FTP=20&21 等。在給該服務的連接埠上執行)。指派的連接埠列在 Unix/Linux 平台上的 /etc/services 中。

  1. 對於 TCP 和 UDP,沒有連接埠就無法建立連線。標頭包括來源連接埠和目標連接埠的欄位。這些欄位中始終會有一個值,即使它為零。
  2. 可以擷取到達介面的所有資料包。這就是 tcpdump 等工具的工作原理。
  3. 如 1 所述,所有傳入請求都將具有連接埠號碼。 SOHO 路由器通常支援 DMZ,並將所有未以其他方式路由的傳入請求轉送至已指派給 DMZ 的 IP 位址。在大多數情況下,您只需將服務所需的連接埠轉送到伺服器(您的 Raspberry Pi)。這將允許您有多個 Raspberry Pi 運行不同的服務。

相關內容