遠程主機發送數據包,路由器是怎么將數據包轉發到我這臺電腦上的?
假設,一個遠程主機向我發送數據包,我已經了解到,在公網流動的都是公網ip,那么這個遠程主機向我發送包的時候,目標地址應該是我的公網ip,也就是最終發送到了公網上的路由器上。那么,這個路由器是怎么將數據包轉發到我這臺電腦上的呢?
類似抽象的問題,可以用具體的例子來分析。比如問你,當微信服務器有一個消息需要推送給你的微信,微信服務器是如何將這條消息推送到你的手機、微信的?
正如你所說,微信服務器知道你的微信客戶端的公網IP,微信服務器只要將消息保溫的目的IP = 微信客戶端的公網IP就可以了。
問題來了,微信服務器如何知道微信客戶端的公網IP的?
微信服務器撓撓頭,微信客戶端主動告訴我的啊,微信客戶端不主動告訴我,我怎么會知道?另外由于微信安裝在移動終端上,微信處于不同的移動網絡,IP地址隨時都在變,對應的公網IP也在變。當微信客戶端處于一個網絡時,會主動告訴(登錄)服務器自己的公網IP。
其實微信客戶端并不知道自己的公網IP,但是沒有關系,只要微信客戶端的報文能夠到達服務器,服務器就會獲得客戶端的公網IP。因為在客戶網關、運營商網關上會做一次或多次NAT操作,將微信IP變換成公網IP。
接上文,服務器知道客戶端的公網IP并不是微信客戶端的,而是網關的公網IP。很顯然服務器的報文會到達網關。網關接下來怎么操作,其實很簡單啊,只要做一次NAT操作的逆操作即可。
什么是逆NAT操作呢?
NAT操作是將微信私有IP變換成網關的公網IP。那么逆NAT操作就是將報文的公網IP變換成微信的私有IP。當然有一次NAT操作,就會有一次逆NAT操作。有二次NAT操作,就會有二次逆NAT操作。
為了讓NAT逆操作工作變得簡單,要求在NAT操作時,動態生成NAT表。那么逆操作查表即可完成。當然為了公網IP的利用率,動態NAT表有一個生命周期,一旦生命周期內沒有流量刷新,那么就會被刪除。這將意味著微信服務器發送給客戶端消息無法到達客戶端。為了避免類似事情的發生,只要讓客戶端周期發送Keepalive。
如果你說的是,當登錄知乎網站時,知乎的服務器是如何將消息推送到客戶端的?
其實和上文原理是一樣的,這里不再重復。之所以寫這一點,是要分析一下反向的流量是如何流動的?即我們訪問知乎服務器時,客戶端的數據包是如何到達知乎服務器的?通常知乎的服務器也使用私有IP?
域名解析是服務器的公網IP,那么報文就到達公網IP對應的設備上。接下來該設備如何才能將數據包搬運到知乎服務器上?
基于目的IP地址的NAT轉換
在我們數據包到達之前,NAT設備已經生成一個公網IP、服務器私有IP的轉換表,那么查表即可轉換,并將報文發給對應服務器。通常需要手工配置。
基于負載均衡的調度
負載均衡設備,根據服務器當前負載狀態,選取其中某一臺服務器,建立TCP連接,將來自客戶端的數據包通過TCP連接發給服務器。服務器處理之后發給負載均衡設備。負載均衡設備從TCP連接提取字節流,將其轉發給客戶端,這樣就完成了雙向的通信。