2012-02-20 133 views
0

我在通過udp以雙工方式通信的兩臺設備之間嗅探。我正在使用wireshark進行嗅探。第一個設備(一個被測硬件)的配置文件指出客戶端端口是54718,服務器是54717.在第二個設備(多年前寫的模擬器)的配置文件中,只指定了一個端口。這是54718.UDP:客戶端如何知道它的服務器?

這兩個設備通信沒有任何問題。

但是,第二個設備在不知情的情況下如何管理連接併發送給54717?

在wireshark中,我可以看到第一個設備發送到第二個設備,使得源端口是54717,目標是54718.我還可以看到第二個設備正在發送到第一個設備,端口是54718,目標是54717.

第一個設備首先發送,協議在Wireshark中被描述爲UDP的協議。模擬器也通過UDP回覆。隨後的交換被描述爲STUN ChannelData TURN消息。我不知道這個協議,但也許它解釋了爲什麼我沒有看到模擬器配置文件中的54717。

感謝您的幫助,

巴里

+0

你好巴里。這可能屬於serverfault,但我沒有足夠的信譽來傳輸你。 – 2012-02-20 09:49:21

+0

沒有錯。這兩個設備通信正常。我只是不明白如何。 – Baz 2012-02-20 09:51:45

+0

:)現在我明白了。 – Baz 2012-02-20 10:12:48

回答

1

首先,在UDP通信中,沒有「連接」動作。 UDP不是面向連接的。

其次,第二個設備將從recvfrom()api調用中獲得對端地址和端口。

+0

但是在發送之前不需要連接到服務器? – Baz 2012-02-20 10:06:31

+0

不,UDP傳輸是通過sendto()api調用的,在它之前不需要connect()。 – ciphor 2012-02-20 10:10:50

+0

我明白了。 connect()只是通知send()函數要發送的地址和端口。我應該使用sendto(),因爲這是對實際發生的事情的更好反映。 – Baz 2012-02-20 10:16:55

0

但如何在第二設備管理連接併發送至54717,當它毫不知情?

UDP是無連接的,如果沒有其它規定(在配置文件例如)你的程序有可能得到54717作爲默認的備用值。

+0

在硬件設備的配置文件中更改爲54716,並且所有內容仍按預期工作。 – Baz 2012-02-20 10:21:36

1

很可能,第一個設備使用術語「客戶端端口」和「服務器端口」並不是指客戶端設備中的兩個不同端口。相反,「客戶端端口」指的是要用作第一個設備內的起點的端口,而「服務器端口」是指遠程設備上的遠程目標端口,第一個設備的外出流量將作爲該目標端口發送。

另一方面,第二個設備可能從根本上說是一個「收聽」設備。它只知道它需要偵聽的UDP端口,並且等待任何發往該端口的查詢從任何地方到達。

因此,我會將「第一個設備」稱爲客戶端,將「第二個設備」稱爲服務器。

從客戶端發送到服務器的每個數據報包含兩組地址信息: 1)目標IP地址和端口以及 2)返回IP地址和端口。

服務器可以使用recvfrom()從每個傳入請求中提取完整的返回地址(包括端口號)。

這樣,我們實際上只需要預先定義一個端口號,並提前通過服務器和客戶端同意:服務器的端口號。

客戶端可以設想選擇使用任意隨機端口號作爲其原始端口(但按照慣例,它可能會選擇避免任何衆所周知的保留端口以避免潛在的互操作性問題),並且服務器可以動態讀取來自每個傳入請求的返回地址信息並動態地將其響應發送到正確的目標。