轉:http://blog.csdn.net/suhuaiqiang_janlay/article/details/60466333
本人找幾篇講得好的來整理一下。
(1)問題的由來:
(2)動態ip具體分析:
有一個私有網絡192.168.0.2,client a是其中的一台計算機,這個網絡的網關natA(一個nat設備)的外網ip是202.103.142.29(應該還有一個內網的ip地址,比如10.0.0.10)。如果client a中的某個進程(這個進程創建了一個socket,這個socket綁定1234端口)想訪問外網主機129.208.12.38的2000端口,那么當數據包通過nat時會發生什么事情呢?
(192.168.0.2:1234->129.208.12.38:2000)
(202.103.142.29:62000->129.208.12.38:2000)。
其他的ip發送到這個端口的數據將被nat拋棄,這就是真正頭痛的問題)這樣client a就與server s1建立以了一個連接。
答案是net決定的,不同的net有不同的答案。
NAT設備的類型對於TCP穿越NAT,有着十分重要的影響,根據端口映射方式,NAT可分為如下4類,前3種NAT類型可統稱為cone類型。
(1)全克隆( Full Cone) : NAT把所有來自相同內部IP地址和端口的請求映射到相同的外部IP地址和端口。任何一個外部主機均可通過該映射發送IP包到該內部主機。
(2)限制性克隆(Restricted Cone) : NAT把所有來自相同內部IP地址和端口的請求映射到相同的外部IP地址和端口。但是,只有當內部主機先給IP地址為X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包。
(3)端口限制性克隆( Port Restricted Cone) :端口限制性克隆與限制性克隆類似,只是多了端口號的限制,即只有內部主機先向IP地址為X,端口號為P的外部主機發送1個IP包,該外部主機才能夠把源端口號為P的IP包發送給該內部主機。
(4)對稱式NAT ( Symmetric NAT) :這種類型的NAT與上述3種類型的不同,在於當同一內部主機使用相同的端口與不同地址的外部主機進行通信時, NAT對該內部主機的映射會有所不同。對稱式NAT不保證所有會話中的私有地址和公開IP之間綁定的一致性。相反,它為每個新的會話分配一個新的端口號。
所以關鍵是第二和第三種net類型。
只有當內部主機先給IP地址為X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包”
同時在該端口號上啟動偵聽(保證net類型3也能成功) B嘗試與A的經過NAT-A轉換后的公網IP地址和端口進行connect(這就是所謂“打洞”) (4)讓內網主機做服務器
(5)花生殼是什么
數據庫),是用不上這個軟件的。
但是還有一種辦法,如果你已經有一台有靜態ip的服務器,在上面部署一個代理服務器(比如nginx),然后把這個動態的ip通知它就可以了。