問題描敘:比如我的電腦,處於兩層路由下面,第一層路由本地IP:192.168.1.1,第二層路由對於第一層路由的IP:192.167.1.111,第二層路由對於路由下面的路由IP:192.168.7.1,我的電腦本地IP:192.168.7.101,那麼外網的資訊是怎麼傳到我電腦上的呢?比如我訪問一個網站,網站怎麼將返回的資訊準確的返回到我的電腦上呢?(這裡討論的不是底層,具體屬於哪一層我也不好說,才疏學淺,不好定位,還請見諒!)
已知:某網站外網IP:220.181.111.148,第一層路由的外網IP:60.177.33.204,當然這內網電腦對於外網都是這個IP。查得,本地電腦上的瀏覽器訪問外網,外網檢測到使用的連接埠號碼為:43403,使用軟體檢測到我的電腦使用的連接埠號碼為:1939。第一層路由本地IP:192.168.1.1,第二層路由本地IP:192.168.7.1。
求:外網怎麼將我電腦請求的網頁內容發送到我的電腦上呢?
解:做http網站,一般都使用80連接埠,那麼,我們訪問這個網站,則是給這個外網IP發送一個或一系列的特定命令。因網站的IP和連接埠都很明確,因此給網站發送訊息就很簡單了,IP+連接埠號碼。那麼網站又是怎麼給我電腦發送資訊的呢?
首先,我的電腦有給外網網站發送資訊,那麼,它就知道了我的電腦訪問它是使用的什麼IP,什麼連接埠。比如60.177.33.204:43403。
當然,最開始時,我還沒有使用軟體研究連接埠號碼。開始時我只知道,內網本地在外網上的外網IP都是相同的,資訊怎麼發送給特定的電腦呢?開始我有限的知識,只能想到:廣播。但很明顯,這種方法是不可行的,雖然能夠達到目的,但我們本地這麼多電腦,都在上網聊天什麼的,這樣廣播起來還怎麼上網?
開始時,在網上查,根本就沒查到我想要的,或許我沒有找對關鍵字吧,找到的都是怎麼串連二級路由什麼的。後來在詢問別人這個問題時,別人給我提到一個關鍵詞:NAT。我再上網一查,於是一切明了!
結果就是:網路位址轉譯(NAT)
答:先拿我的電腦給給外網網站發送一條命令舉例,我的電腦本地IP:192.168.7.101,使用的連接埠號碼為:1939,目的地:220.181.111.148:80。因為中間有路由,那麼,這條命令首先發送給第二級路由:192.168.7.1,二級路由收到這條資訊後,開啟一個連接埠A,並將連接埠A映射到我的電腦的1939連接埠上,即映射到192.168.7.101:1939上。那這條命令的發送地址就由原來的192.168.7.101:1939變成了:192.168.1.111:A。這條命令再由二級路由傳給一級路由,一級路由同樣開啟一個連接埠:B(43403),映射到192.168.1.111:A。
這時,第一層路由已處於外網,於是將IP地址轉為它所處外網的IP:60.177.33.204:43403(B),那麼,網站收到的資訊顯示的IP地址和連接埠就是:60.177.33.204:43403(B)。網站伺服器將收到的命令處理後,將返回的資訊(msg)發送給60.177.33.204:43403(B)。一級路由收到後,尋找到這個連接埠號碼對應192.168.1.111:A,於是將目的地址改為:192.168.1.111:A並發送出去,於是二級路由收到這條資訊,並查得這個連接埠號碼對應192.168.7.101:1939,並將目的地址改為192.168.7.101:1939並發送出去,於是,我的電腦就收到資訊了!
總結:
註:這裡,兩個路由開通的連接埠是有時限性的。比如,開通的連接埠號碼1分鐘(具體多長時間沒細研究)沒有資料轉送,則銷毀這個連接埠,重新分配,則如果這個時間之後,網站還給這個連接埠發送資訊,則網站所想發送到的電腦幾乎不肯能收到。
本部落格有TCP/IP和UDP的通訊常式,使用時,需要至少知道一方的IP地址,和能固定連接埠。具體使用方法如下:
假設條件也和我一樣,或者有更多層的路由,道理是一樣的,上層路由對於下層路由來說,上層路由的IP和連接埠號碼是知道的!
例如我的電腦作為下層(具體下到多少層?能用就行,多少層應該沒關係)路由上串連的一台電腦,IP地址為:192.168.7.101,我的上層(具體上到多少層?應該都可以)路由上的一台電腦IP地址為:192.168.1.103。那麼,是用上層路由上的電腦作為伺服器,使用某一連接埠號碼D通訊,可在程式中設定。下層電腦作為用戶端,用戶端設定好伺服器的IP和連接埠號碼,例如:192.168.1.103:D,並設定好用戶端本地的IP地址和使用的連接埠號碼,例如:192.168.7.101:E。
那麼,先開啟伺服器端,再開啟用戶端,伺服器端接收到小心,並且明確用戶端對於伺服器端是用的什麼IP,什麼連接埠號碼,並且使用此連接埠號碼和用戶端通訊。
常式代碼實測,我的電腦能和我上一層路由的電腦通訊!