2012-01-24 40 views
6

我曾經認爲我對TCP和UDP協議的理解雖然有限,但是是正確的。儘管最近,當我意識到共享一個公共洪流的對等端可以通過TCP或UDP協議相互連接而不需要實際的端口轉發時,我就感到困惑。路由器如何知道本地網絡中的哪臺機器將數據包轉發到哪裏?任何幫助清除這一點,將不勝感激。互聯網上的洪流協議圖表和文章被大大簡化,因此不包含任何有用的信息。Torrent點對點連接

+0

僅供參考:大多數路由器/防火牆的90%阻止UDP! –

+1

你從哪裏得到這個統計數據?我從來沒有遇到過我的UDP應用程序問題(家中有多個SOHO,咖啡店或辦公室),無論是tftp,遊戲還是自定義的東西。 –

+0

默認情況下,大多數路由器阻止UDP *廣播*。 –

回答

6

路由器(運行NAT)跟蹤所有傳出的數據包,然後允許傳入的數據包作爲對這些傳出數據包的響應。

因此,如果您向外發送TCP連接到google.com:80,那麼它將允許數據包從google.com:80返回(作爲響應)。如果兩個內部主機連接到同一個端口,可以區分它們,因爲本地端口不同,例如:

1)主機A與Google建立連接,路由器使用其自己的本地端口10001作爲TCP連接

2)主機B也有類似的連接和路由器使用它自己的本地端口10002 TCP連接

如果一個數據包從google.com:80進來,它解決了在端口10001路由器的WAN IP,則路由器知道將其發送到主機A.如果它的地址爲端口10002,路由器知道將其發送到主機B.

如果你在路由器後面有兩個對等主機(兩個NAT),那麼就沒有辦法建立連接,除非有什麼東西可以傳輸關於其他IP的信息(即,一個他們可以用來交換信息的服務器),他們可以嘗試猜測路由器將選擇哪個端口作爲本地端口,然後開始在該端口上將每個其他數據發送給路由器WAN IP。因爲兩臺路由器都看到數據發送出去,所以他們設置了一個允許數據輸入的規則。如果端口被猜測正確,那麼來自每邊的數據包都可以通過,因爲兩個路由器都有一個規則設置。這被稱爲UDP/TCP打孔。

http://en.wikipedia.org/wiki/UDP_hole_punching

相信Skype是它使用UDP和不打孔一個應用程序的一個例子。

+0

謝謝你的深刻反應!我相信我現在已經充分理解了這個話題,讓我的思想休息...現在。 順便說一句,Skype是一個聰明的野獸。我認爲它可能會檢測到您正在與本地網絡中的某個人進行對話時(在路由器重新啓動後仍然連接到Internet時,我可以與我的姐姐聊聊) – Neob91

1

嚴格來說,由於您沒有使用'NAT'來限定路由器路由器,因此答案是路由器使用ARP來確定目標主機的MAC地址,然後將具有該MAC地址的以太網幀作爲目標地址。

但我認爲這不是你的意思。

你的意思是NAT路由器如何知道在哪裏轉發入站數據包?

答案是路由器維護一個活動的「連接」列表,使其能夠進行地址轉換。它使用外部端口號映射到內部主機地址和端口號。在TCP的情況下,「連接」的概念僅僅是是否存在TCP連接(儘管通常有超時停止泄漏)。在UDP的情況下,它更難,因爲沒有UDP連接本身,所以通常是通過超時跟蹤它的情況。