2016-01-06 72 views
1

相關的職位之間的成功的TCP連接在服務器和客戶端

的帖子在這裏In UNIX forum介紹

  • 服務器將繼續listeninig上的端口號。

  • 服務器將接受客戶connect()請求使用accept()。只要服務器接受客戶端請求,內核就會爲服務器分配一個隨機端口號碼send()和,因爲服務器上的同一端口號不能用於發送和偵聽,而前一個端口仍然監聽新的連接

問題

我有一個服務器應用程序S這是在端口18333不斷聽取(這實際上是bitcoindtestnet)。當另一個客戶端節點C在53446(隨機端口)上與它連接時。根據上面的帖子,S將只能從端口53446.

發送/接收「C」的數據但是當我運行一個bitcoindtestnet。這完全與其他節點通信,只需要在端口18333中使用一個套接字連接,而不需要另一個節點進行發送/接收。下面是片段,我甚至驗證了這一點

bitcoin-cli -testnet -rpcport=16591 -datadir=/home/user/mytest/1/ 

    { 
    "id": 1, 
    "addr": "178.32.61.149:18333" 
    } 

任何人都可以幫助我瞭解什麼是正確的工作在TCP套接字連接?

+1

我不太清楚你在問什麼。您是否困惑源端口和目標端口? – CodeCaster

+0

你能提供關於在一個簡單的客戶端 - 服務器應用程序中應該發生的事情的指針嗎?也許那麼,我會盡力與比特幣相匹配。 –

+0

首先谷歌命中「tcp源目標端口」:http://stackoverflow.com/questions/21253474/source-port-vs-destination-port – CodeCaster

回答

0

服務器將接受客戶connect()請求使用accept()。由於 服務器接受客戶端請求,內核將爲服務器分配 隨機端口號,以進一步處理send()

對於正常的TCP流量,情況並非如此。如果一個網絡服務器正在偵聽端口80,所有發送回客戶端的數據包將通過服務器端口80(例如可以使用WireShark進行驗證) - 但每個連接將會有一個不同的socketsrcIP:port - dstIP:port)。該信息在網絡數據包的標頭中發送 - IP標頭中的IP和協議代碼(TCP,UDP或其他),端口號作爲TCP或UDP標頭的一部分)。

但是在通過ftp進行通信時可能會發生端口更改,其中可能存在控制端口(通常爲21)和協商數據端口。

+0

當然,端口號不是ip頭的一部分,但是tcp標題或udp標題。 IP地址是IP報頭的一部分。我想這就是你的意思,但我會建議適應這個答案,以避免downvotes。 –

+0

@PhilipStuyck - 是的,當然 - 現在更新,謝謝。 –

2

TCP連接由插座對來標識,這唯一地由4個參數標識:

  • 源IP
  • 源端口
  • 目的IP
  • 目的端口

對於建立到服務器的每個連接,套接字基本上都是克隆的,並且正在使用相同的端口。因此,對於每個連接,您都使用同一個服務器端口的套接字。所以當有n個連接時,你有n + 1個使用相同端口的套​​接字。

TCP內核能夠區分所有這些套接字和連接,因爲套接字處於偵聽狀態,或者它屬於考慮所有4個參數的套接字對。

您的第二個子彈因此是錯誤的,因爲正如上面解釋的那樣使用相同的端口。

+0

謝謝!我現在明白了。但我的問題實際上是特定於比特幣應用的。服務器正在偵聽18333端口。可以說,許多客戶端通過相同的目標端口連接到該服務器。那麼服務器端的端口18333可以用來發送/接收數據嗎?它是不是鎖定只能聽連接?但不知何故,比特幣通過相同的端口進行通信和收聽 –

+0

否,因爲每個連接都有自己的套接字,並且仍然有一個監聽套接字。在上面的解釋中用+1表示。如果沒有連接,則只有偵聽套接字。它將僅用於偵聽新的傳入連接。 –