[TOC]
原本標題想命名為“局域網中,不同子網之間的通信",但因為太長所以放棄了
## 給局域網通信的手段——NAT
大學時,常在淘寶購物,那時候我寫的收貨地址是學校食堂旁邊的中通快遞,快遞小哥收到后,總是會主動送到我們公寓門口,這服務真是太贊了。
剛開始的時候,我還一直納悶,快遞小哥是如何知道我公寓的?作為一只好奇的貓,我還是忍不住問了,對方回答是我第一次去取貨的時候,他問我要了公寓地址。
他還給我看了那個本子,大概200個左右吧,每條記錄是這樣的:
**收件人電話:XXX
收件人地址:XXX公寓
時間:XXX**
原來他是根據電話找到我的工具的,天才 ):
這樣下去你的本子夠記嗎,學校每年進來那么多新生,
他笑著回答:這個很簡單,我的本子只是用半年,半年后我就換新的本子,并且那些超過半年沒有寄東西或者收東西的人,我就刪除了
我頓時五體投地!
最近我在學習TCP/IP的時候遇到一個類似的問題:
我向百度發送一個請求,百度怎么回復給我的呢?畢竟我的電腦可是在局域網內,估計全世界IP和我相同的人不下一萬。
一開始我向的是,百度收到我的請求后,拿到我的MAC地址,然后給我的MAC地址發送應答。。。
估計我現在被你鄙視了吧,要知道,經過一個路由器的轉發,源MAC地址就是路由器的地址,目的MAC地址就是下一站路由器或者真正目的地的MAC地址。
也就是說,當不是在同一個子網內通訊,MAC地址是會變化的。
所以百度不知道我的MAC。
后來我又想,我是做PHP的,拿到的IP是客戶端的公網IP,所以,百度已經是發到我的公網IP所在的路由器,也就是我家的路由器上面,然后路由器轉給我。。。
可是不對啊,我家的路由器連接的是小區的網,小區連接的是XXX的網,不知道N層路由器之后才到的公網,那豈不是公網IP路由器受到一個數據包之后,就要采用暴力的廣播方式,讓所有路由器都受到,然后所有的路由器都再廣播。。。一層層下去。
這不是網絡風暴嗎?可是我平時上網不卡啊?所以也不對。
直到后來,我看到了一種技術:NAT
NAT是現在的路由器必須支持的基本功能,1991年推出。
和快遞差不多,當我向百度發送一個請求的時候,路由器就記錄我的IP和端口,然后源IP換成路由器的IP,源端口就隨機用一個未使用的端口,記錄在表中:
**方向:出
局域網IP :192.168.1.2
端口:12345
換成的IP:172.12.11.23
換成的端口:20000**
如果收到一個數據包,是172.12.11.23:20000就還原成192.168.1.2:12345回來,然后通過在同一個子網的通訊方式將數據報發送給我。
這個方式是很好的,因為不管經過多少層的路由器,依然可以根據NAT表將數據發送給正確的主機。
當然咯。NAT表是有限的,所以會有超時限制,為了不斷開連接,P2P軟件可是會沒事干就發送一天信息,以更新NAT記錄的時間。
**這里有好的資源:**
[ 路由器直連網絡可以互通,還需要做NAT?](http://bbs.51cto.com/thread-796705-1.html)

[NAT詳解:基本原理、穿越技術(P2P打洞)、端口老化等](http://www.cnblogs.com/imstudy/archive/2016/05/04/5458133.html)
