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就可以直接通信了。