TCP打洞和UDP打洞

2021-07-09 05:45:31 字數 1163 閱讀 6152

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和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表中,是唯一的。

如下表:

最終資料會傳到路由器s1. 傳到路由器之後,它開始根據埠號查nat表。如果這個埠號在表中存在,那麼就把src的值取出,並把資料中的目標位址

根據這個思路,可以得出,a,b要想通訊,路由器s1必須知道,b在路由器s2中的對映。同樣的,路由器s2必須知道a在s1中的對映。

平常做法是需要借助一台伺服器t,a和b都去訪問伺服器t,那麼t會得到a和b在各自路由器中的對映,然後把b在路由器s2中的對映發給s1。

把a在路由器s1中的對映發給s2.這樣a和b就可以直接通訊了。

關於TCP打洞和UDP打洞

解決辦法是 a向b的公網ip傳送乙個資料報,則nat a能接收來自nat b的資料報並 給a了 即b現在能訪問a了 再由s命令b向a的公網ip傳送乙個資料報,則nat b能接收來自nat a的資料報並 給b了 即a現在能訪問b了 以上就是 打洞 的原理。但是tcp和udp在打洞上卻有點不同。這是因為...

簡單說一下 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...

linux udp打洞 UDP打洞和心跳包設計

一 裝置終端 class deviceclient int deviceid int ip int port char connectid 16 time t lasttime struct event timeoutev 超時器 typedef list devicelist 二 移動控制終端 c...