[英]Java - Is there a way a client and a server can connect via IPv4 without port forwarding?
所以我試圖在一個 Java 應用程序中連接兩個客戶端,但在某種程度上,一個客戶端充當服務器,另一個客戶端充當......客戶端。 我設法在本地連接它們,效果很好,但我一直在研究是否可以將客戶端連接到不在同一網絡上的服務器(通過 IPv4 或 IPv6)。 我已經讀過我應該在我的路由器服務器端進行端口轉發。 我知道如何進行端口轉發,但不應該沒有端口轉發嗎? 如果我理解正確,只有服務器端應該被端口轉發並且服務器可以響應客戶端而不需要客戶端端口轉發他們的路由器? 因此,如果我是對的,另一種解決方案是“全局”第三方服務器(即端口轉發),它將通過從一個客戶端接收信息並將其傳遞到另一個客戶端來連接兩個客戶端?
我只是在這里學習,所以如果這里已經回答了這個問題,我很抱歉,但我沒有在一個地方找到所有這些的答案,我試圖得出一個結論。
不應該沒有端口轉發嗎?
是的,您可以在沒有port-forwarding 的情況下在兩台機器之間建立連接。
以 Web 服務器為例。 默認情況下,Web 服務器在那里偵聽端口80,其中 80 是約定為HTTP 分配的端口。
Web 客戶端(瀏覽器等)通過嘗試在端口 80 上進行連接來發送請求。如果沒有障礙物,則連接繼續進行。
但是,可能存在障礙。
一個常見的障礙:面向Unix的操作系統(BSD、macOS、Solaris、Linux、AIX 等)按照慣例,出於安全原因限制對編號低於 1,024 的端口的訪問。 操作系統會阻止端口 80 上的任何傳入連接。有了該安全阻止,Web 請求就永遠不會到達服務器。
克服此限制的一種方法是讓 Web 服務器偵聽不受限制的端口,即編號大於 1,024 的端口,最高可達 64K 限制,例如 8080。然后在服務器計算機的操作系統上配置數據包過濾器工具以執行端口-轉發。 對端口 80 的傳入請求被更改為轉到端口 8080。
然后在 Web 服務器和 Web 客戶端之間建立連接。
使用中間的包過濾工具即時更改數據包,服務器和客戶端都不會更了解數據包被更改。
您可能希望將防火牆配置為僅在 80 上允許來自機器外部的 HTTP 連接,包括阻止對 8080 的任何外部請求。在這種情況下,只有從 80 更改為 8080 的數據包才能到達您的 Web 服務器。 通常的做法是關閉服務器上盡可能多的端口。
僅供參考:對於加密的 HTTP ( HTTPS ),常規端口是 443 而不是 80。
請注意,這里沒有編程問題。 作為程序員,您的客戶端軟件應該嘗試連接您感興趣的服務器所記錄的端口號。 在服務器端機器或服務器端路由器上,將根據需要配置端口轉發。 您的客戶端編程不關心,甚至不知道任何可能存在或可能不存在的端口轉發。 端口轉發是一個網絡管理問題,對程序員來說應該是透明的。
作為網絡管理員問題,請查看姊妹站點,例如Server Fault和Network Engineering而不是Stack Overflow 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.