2015-10-20 62 views
2
  1. 當同一主機上的兩個進程使用網絡 進行通信時,它們的套接字必須使用不同的端口嗎?兩個套接字不允許使用相同的端口嗎?

    我想是的,因爲一個套接字是通過IP地址和端口號 來標識的。如果進程的套接字使用相同的端口,那麼它是不可能區分它們的套接字的,對不對?

    但是主機可以有多個網絡接口,所以多個IP地址。同一主機上的多個網絡接口是否可以共享一個端口,以便兩個套接口共享相同的端口?

  2. 例如,SSH本地端口轉發由選項指定:

    -L [bind_address:]port:host:hostport 
    

    ,然後處理(例如Firefox)本地主機(其中 SSH客戶端運行)上附連到port

    • SSH客戶端是否創建了一個具有port作爲套接字端口的新套接字?

    • 是否port屬於SSH客戶端的插座,或過程的插座 (如火狐),或 SSH客戶端的兩個(即兩個插座和Firefox進程的插座使用相同的端口 port)?

的連接線由註釋並沒有解決我的問題(至少直接)。

+2

的可能重複:通過[TCP兩個不同的插座共享一個端口?](http://stackoverflow.com/questions/11129212/tcp-two-different-sockets-sharing-a-port) – Downvoter

+0

鏈接的螺紋評論沒有解決我的問題(至少直接)。 – Tim

+0

很高興知道您是否只對TCP或UDP或兩者都感興趣。他們不完全一樣。然後還有UNIX套接字,我沒有在我的答案中解決。 –

回答

0

你必須區分TCP和UDP。 TCP是面向連接的,UDP不是。

當您想要接收任何通常綁定到IN_ADDRANY和特定端口的套接字時。對於TCP,你會做一個監聽,併爲UDP一個recfrom。

最具體的事情將用於匹配。因爲您也可以綁定到特定的IP地址。在這種情況下,檢查傳入消息的目標IP地址和端口。如果有人正在監聽該IP地址和該端口(recfrom或listen),那麼將使用該套接字。如果找不到具體的人,則使用IN_ADDRANY來查找匹配。 如果您始終綁定到IN_ADDRANY,則不能讓2個UDP套接字執行recocket並將套接字綁定到同一端口,也不能在同一端口上有偵聽TCP套接字。

對於UDP,討論在此結束。

對於TCP而言,事情更復雜。 從端口A開始監聽套接字。此時,系統上只有一個套接字使用端口A. 現在,連接由正在連接的客戶端建立。監聽套接字被克隆在一個以accept方式返回的服務套接字中。該套接字不在監聽狀態!!!但它仍在使用端口A. 由於它不是偵聽套接字,TCP不會使用它來匹配傳入的連接請求,因此它只使用偵聽套接字。爲了匹配傳入的數據,它使用連接對的概念。哪一個是你自己的IP地址和端口,在這種情況下是A,以及源IP地址和端口。這4個參數唯一地標識了與以上答案非常不同的連接,它似乎聲稱套接字由5個參數唯一標識,它實際上是由4個參數標識的TCP連接。 因此,在連接之後,您的系統基本上都有兩個都使用端口A的套接字。一個監聽套接字和一個服務套接字。 建立的連接越多,將分配的服務套接字越多,並且使用相同端口的套​​接字越多。當然,如果連接關閉,那麼它們會再次消失。

我希望這能澄清一些事情。結論是,TCP連接由4個參數標識,而偵聽TCP套接字僅由2個標識.TCP連接完全與彼此隔離,當然也來自偵聽套接字,這個連接僅用於建立連接並處理非常先有TCP SYN消息。

對不起,冗長的答案和複雜性。一旦你理解它,它確實很簡單。

SSH客戶端是否創建了一個帶有端口作爲套接字端口的新套接字?

不,它不會,客戶端連接到一個衆所周知的服務器端口,但使用臨時端口。除非客戶端將套接字綁定到知名端口,但這不是正常情況。

是否端口屬於SSH客戶端的插座,或過程的插座(如火狐),或SSH客戶端的兩個(即兩個插座和Firefox進程的插座使用同一端口港口)?

短暫的端口屬於客戶端,衆所周知的ssh端口屬於服務器進程。

服務器和客戶端之間的TCP連接由套接字對標識。這一對的一端在客戶機上,另一端在服務器機器上。

在這一點上我還沒有解決什麼其他問題?

+1

謝謝。我希望你能直接理解和解決我的帖子中的問題。 – Tim

+0

連接到服務器的客戶端使用他自己的端口。通常是一個'短暫的'端口。因此,客戶端和服務器都使用自己的套接字進行特定的連接。服務器通常使用衆所周知的端口。 –

相關問題