2012-02-27 184 views
0

端口號是與硬件機器上特定軟件的邏輯連接。然後,Web服務器中的一組軟件與請求的URL中使用的端口號之間應該有關係。但是,似乎Port No和HTTP(80),FTP(21),Telnet(23)等使用的應用層協議(從Internet Protocol Suite)之間存在關係。爲什麼這樣?URL中的協議和端口號之間的關係或對應關係

我在stackoverflow上提到了一個類似的問題here。正如Aaron Maenpaa回答的,協議和港口之間並沒有嚴格的一一對應關係。這只是一個慣例。我們也可以在其他端口上監聽HTTP(比如8080)。那我們怎麼做呢?

這會導致另一個問題。 我們如何將自定義服務器程序映射到某個非標準的TCP端口號?

回答

0

任何應用程序都可以bind()爲任何可用端口,但可能需要管理權限的低編號端口除外。絕對沒有強制什麼類型的應用程序監聽什麼端口號,只是慣例。這是因爲端口號本身只是數據包頭中的一個16位字段,操作系統無法知道應用程序級別發生了什麼。

通常,應用程序監聽的端口號由應用程序本身決定:它必須決定將什麼端口交給bind()調用。在應用程序的外部,您可以在路由器或防火牆中使用NAT(網絡地址轉換)將任何端口號重定向到任何其他端口號。

請注意,TCP端口完全獨立於UDP端口。使用TCP端口12345的應用程序與使用UDP端口12345的應用程序完全沒有關係。防火牆允許或阻止一個不會自動允許或阻止另一個。

不幸的是,IANA(關於哪些應用程序使用哪些端口號的非強制約定的守護者)已決定爲UDP和TCP端口分配服務名稱,即使該服務僅使用一個端口其中。

+0

這裏你是什麼意思的應用程序。在Container中部署的人正確嗎?例如。使用Tomcat,該應用程序是在webapps內部署的。那麼我怎樣才能爲我的應用程序配置端口號? – whitehat 2012-02-28 08:26:28

+0

「應用程序」只是指在系統上運行的進程。端口號由'bind()'系統調用決定。 – 2012-02-28 15:41:12