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...