2010-04-11 62 views
6

我正在寫一個UDP服務器,這是我的第一個;我只做了一點TCP通信。而且我很難搞清楚如何區分哪個用戶是哪個用戶,因爲UDP只處理數據包而不處理連接,因此我無法確切知道我與誰進行通信。如何區分同一個IP地址上的兩個不同的UDP客戶端?

這是我目前的服務器循環的僞代碼:

DatagramPacket p; 
socket.receive(p); // now p contains the user's IP and port, and the data 
int key = getKey(p); 
if(key == 0) { // connection request 
    key = makeKey(p); 
    clients.add(key, p.ip); 
    send(p.ip, p.port, key); // give the user his key 
} else { // user has a key 
    // verify key belongs to that IP address 
    // lookup the user's session data based on the key 
    // react to the packet in the context of the session 
} 

在設計這個,我牢記以下幾點:

  • 多個用戶可以在同一個IP地址存在,因路由器的存在,因此用戶必須有一個單獨的識別密鑰。
  • 數據包可能被欺騙,因此應該根據其原始IP地址檢查密鑰,並在其他IP嘗試使用該密鑰時忽略該密鑰。
  • 客戶端的出站端口可能在數據包之間發生更改。

第三個假設是否正確,或者我可以簡單地假設一個用戶=一個IP +端口組合?這是通常完成的,還是應該繼續創建一個像我目前正在做的特殊鍵?

我並不完全清楚TCP協商連接的方式,所以如果您認爲我應該將其建模爲TCP,那麼請將我鏈接到一個很好的教程或關於TCP的SYN/SYNACK/ACK混亂的內容。

另請注意,如果IP發送0,並且該IP已具有掛起的密鑰,我確實有重新發送密鑰的規定;我省略了它以保持簡單的代碼片段。我知道UDP不能保證到達,我打算以後也爲主分組處理代碼增加可靠性。

回答

6

UDP包頭有一個源端口,通常用作回覆端口。如果不使用,它應該爲零,然後由高級協議來確定如何協調請求 - 響應活動與多個客戶端。

2

您的問題僅僅是您在使用UDP時需要注意的iceburg WRT洗衣清單的一部分。您應該期望NAT路由器無法提供您設計的任何有意義的UDP協議轉發。因爲路由器瞭解TCP狀態機並存儲每個會話的連接狀態,所以它們知道如何轉發它,因此TCP工作正常。他們將有不知道您的自定義UDP協議如何工作。 NAT設備包括用於衆所周知的UDP應用的特定協議處理程序。

如果發件人綁定到源端口和/或接口,發件人源端口保持不變直到解除綁定。

使用UDP,您可以將兩個對等端綁定到(dst)傳入消息或(src)傳出消息的已知源端口。對於客戶端/服務器應用程序,您通常希望客戶端綁定到動態源端口,以便多個客戶端可以共存於單個客戶端系統上。然後,服務器可以使用通過src端口提供的動態源端口響應客戶端請求,該請求用作響應中的目標端口。使用已知端口的對等方允許您在NAT設備中配置UDP轉發。

前客戶與服務器/服務器的已知端口3000

客戶端綁定到一個隨機端口(1234),但知道服務器3000端口監聽。 客戶端(SRC 1234) - >服務器(DST 3000) 服務器(DST 1234) - >客戶端(SRC 3000) ...

如果計算機具有多個接口,你應該預料到要麼需要明確綁定聽衆或發送者指定到特定的IP地址,或者能夠處理來自對等方的請求和響應,所述請求和響應基於計算機路由表的突發事件從隨機IP接收和接收。如果您選擇將請求綁定到特定的接口,那麼如果來自多宿主系統的消息需要通過不同的本地接口進行傳遞,則需要了解路由表。例如,如果你將UDP套接字綁定到127.0.0.1,你顯然不能用它發送到任何Internet可路由的IP地址。

就協議設計而言,它通常用於在UDP有效載荷中構造會話ID和序列字段,以便對等方可以跟蹤會話和單個交換。

爲了成功設計一個強大的UDP協議,您需要了解一些碎片,NAT共存,安全和擁塞問題。除非絕對必要,否則我會反對。

2
* The outbound port on the client side might change among packets. 

那是第三個假設是正確的

若客戶持續使用相同的出站插槽。發送第一個數據報將導致一個本地綁定,因此從此以後,套接字將位於一個固定的本地端口上。

+0

這是典型的UDP協議的工作原理。預計單個客戶端將在單個「事務」或「會話」期間繼續使用相同的端口。 – caf 2010-04-11 11:08:34

+0

準確地說,我的觀點。 – EJP 2010-04-29 01:05:59

相關問題