場景
再開發web微信掃碼登錄時,遇到了一個問題,手機掃碼後,生成二維碼時傳的回調地址沒有被觸發。這個觸發行為時其他服務器執行的,回調地址是本機的方法。這個問題已經遇到了很多次了,比如微信小程序開發,其他第三方應用集成,我們都需要被其他服務器主動訪問。
解決方式:內網穿透。
內網穿透是什麼?怎麼解決的以上問題?
舉個有趣的例子
在計算機裏有這樣的規則:
1.名字只能有特定的字符串構成且是有限的,我們人口太多不夠用。
2.沒有名字的話就無法與別人溝通。
為了解決這個問題,日常是這樣解決的:提供傳信服務的公司就默認的為某個地區的一片用户都配備了一個傳信員。
小花和aa是有自己的名字的,他們之間可以通信。
但是為了其他用户可以正常使用,如果小花接下來不想説話了或者太久沒放信到信箱了,用户2不能一直佔用這個信箱。這樣小花沒辦法主動找用户2
這時就有了一個好心人解決這個問題,讓有情人終成眷屬。
當然這裏注意:ab需要一直騷擾aa,且還要一直問小區a的用户2,他還需不需要服務。(怎麼感覺在欺負老實人)
與是小花在ab的幫助下就可以一直和小區a的用户2有一句沒一句的聊天了。
這裏小區a的用户2通過ab讓小花可以主動找他的行為,就是內網穿透的大致實現了。
迴歸現實
以上的場景的問題出現在我們日常開發中。
- 對於名字則對應着我們的公網ip(ipv4)
- aa對應着路由器
- 編號1,2,3...就對應着我們的局域網ip
- aa的信箱就對應路由器的端口,aa會維護一個NAT表去管理映射關係
- ab就是提供內網穿透的服務器
-
小花則是想要主動訪問我們電腦的第三方服務器
對於公網地址的數量缺少,我們的電腦一般都只有局域網ip。於是其他服務器想訪問我們的電腦就需要很大的代價(比如一直髮一些沒用的數據,保持NAT表中的映射(當然他們也不會這樣做))。
很顯然內網穿透的價值就是讓我們開發的時候省力一點,不用去部署到服務器看效果。總結與思考
這裏提供兩個已經用過的內網穿透方式:
- 運行sh -R 80:localhost:8080 localhost.run 這個是提供的免費映射運行後就自動給一個域名(缺點就是不是很穩定)
- 如果你有一個服務器就使用frp進行映射(這個比較穩定)
思考:很多局域網能實現的功能是不是用內網穿透就可以實現了呢,比如:遠程操控等