簡單說一下 TCP打洞和UDP打洞


1, TCP協議通信:

現在有兩台電腦A和B。在

假設A的地址為 192.168.0.100

假設B的地址為 192.168.0.102

A想給B發送一個字符串Hello,  如果A,B之間采用TCP協議,那么B收到Hello的過程是怎樣的呢?

首先建立連接(3次握手成功之后,A和B的鏈接才算成功),然后A在給B發送數據。

 

如果A,B不在一個局域網內,A,B通信就需要打洞了。

假設A通過路由器S1上網。B通過路由器S2上網。

S1的外網IP:114.66.5.211          本地IP:192.168.0.1

S2的外網IP:14.153.27.47          本地IP:192.168.1.1

A的本地地址:192.168.0.100

B的本地地址:192.168.1.102

 

先暫時不說A和B的通信。我們來說一下A訪問www.baidu.com

發送的源地址就是192.168.0.100  ,目標地址就是61.135.169.105(www.baidu.com經過DNS解析之后的地址)。 

由於A的網內沒有這個61.135.169.105地址,所以會把數據發給默認網關。這里的默認網關地址就是192.168.0.1(路由器S1的本地地址)

路由器S1拿到數據之后,會做什么事情呢?

他會做NAT映射,然后把之前的源地址192.168.0.100換成外網IP:114.66.5.211.

它是怎么映射的呢?

他會把192.168.0.1:22124轉換成一個外網端口號。假設轉換的端口號為1481。

22124為A電腦從哪個端口發出去的。1481為路由器計算出來的值,具體計算方法不需要知道,只需要知道這個值在NAT表中,是唯一的。

如下表:

 

那么發給百度服務器的內容是 源IP為114.66.5.211:1481  目標IP為61.135.169.105:8080。 百度收到請求后,把源IP換成目標IP發送數據。

最終數據會傳到路由器S1. 傳到路由器之后,它開始根據端口號查NAT表。如果這個端口號在表中存在,那么就把src的值取出,並把數據中的目標地址

替換為src的值。這樣A就收到了百度服務器的數據。

 

根據這個思路,可以得出,A,B要想通信,路由器S1必須知道,B在路由器S2中的映射。同樣的,路由器S2必須知道A在S1中的映射。

平常做法是需要借助一台服務器T,A和B都去訪問服務器T,那么T會得到A和B在各自路由器中的映射,然后把B在路由器S2中的映射發給S1。

把A在路由器S1中的映射發給S2.這樣A和B就可以直接通信了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM