我是一個路由器

真正的知識是深刻淺出的,碼農翻身」 公共號將苦澀難懂的計算機知識,用形象有趣的生活中實例呈現給咱們,讓咱們更好地理解。html

本文源地址:我是一個路由器編程

前言:《我是一個網卡》發出之後,受到不少人喜歡,感謝你們的支持,這也促使我多寫一些網絡相關的文章,以饗讀者。
我注意到不少人提出了很好的問題,主要集中在數據包出了局域網之後的處理。因此特別寫下這一篇文章,試圖回答一下這些疑問。

我就是網卡TP-Link 7954常常和你們提起的網關路由器,我在網絡中的位置是這樣的:服務器

爲啥叫網關呢?由於你們想上網,必定得通過我這一關。網絡

這不是開玩笑,確實是這樣!全部的對局域網以外的訪問那非得通過我不可。
其實我直接和ISP(就是聯通)的網絡相連,我從聯通運營商那裏搞了一個外網的地址:61.52.247.112。
但是隻有這麼一個地址,咱們局域網內這麼多電腦,若是輪流着讓每一個電腦去用,那你們可就抱怨死了。 
因而我巧妙的構思了一個網絡世界,成功的欺騙了TP-Link 7954這些網卡們。架構

 一、NAT(網絡地址轉換)

還記得上次TP-Link 7954向我要地址的事兒嗎網站

由於我不只僅是個路由器,仍是一個DHCP服務器,掌握着這個局域網的IP生殺大權。
我給TP-Link 7954 分配的IP是 192.168.1.2,可是他拿這個地址是沒法直接上網的。由於這是屬於我管轄的內網地址,別的網站像www.baidu.com根本都不知道!
即便知道了也沒用,由於在這個世界上可能有無數的路由器都會分配192.168.xxx.xxx 這樣的地址,你到底要找哪個?
因此TP-Link 7954想上網必須得經過我,我須要施展一點點小魔法,好比說它想訪問百度,經過交換機給我發來這麼一個數據幀:spa

我把數據鏈路層的外衣去掉,發現IP數據包中的目標地址是115.239.211.112,我就知道這是要向外網發出請求了。(由於不是該網址不在當前局域網的網段中)
因而我就把IP數據包中的源地址192.168.1.2替換成我從聯通那裏搞到的外網地址61.52.247.112。
這還不夠,我會建立一個新的端口號2001,把TCP數據包中的源端口也替換掉,數據包就變成了這個樣子:3d

不知道你看出來其中的奧妙沒有,我把源地址和源端口都替換了,其實個人目的就是讓外部的網絡認爲這是我(路由器)發出的,他們根本不知道什麼TP-Link 7954 這個網卡!code

而後我須要查一下個人路由表,肯定到底轉發到哪一個輸出端口去,再給這個IP數據報穿上數據鏈路層的外衣,把數據包發給了聯通的網絡,剩下的事我就無論了。htm

注意看以太網幀的MAC地址,源地址已是我了,而不是TP-Link 7954了,由於這是我和聯通網絡之間的數據鏈路。

這個替換源地址和源端口的小把戲就叫作網絡地址轉換,人類簡稱爲NAT。

固然不僅是TP-Link7954經過我上網,還有不少別的電腦呢,我得把個人小把戲記下來,造成這麼一張表:

過了不久,baidu 網站的回覆就會經過別的路由器轉到我這裏。正如你所想的,我須要反過來處理一遍:首先去掉數據鏈路層的外衣,發現TCP和IP數據報中包含這樣的信息:目的地IP-61.52.247.112 ,端口-2001。 
這時候我就去查表,找到了192.168.1.2:3345,我就明白這是給TP-Link 7954的信了。 
那就再次把數據報中的IP地址和端口號改了吧,讓TP-Link 7954 認爲這個數據包就是我給他的。

就這樣,我成功的用區區一個外網的IP就支持了局域網內多個電腦的上網需求,而且他們根本就不知道是怎麼回事!

二、NAT穿越

欺騙終究是不能長久的,個人麻煩很快就來了。
TP-Link 7954 所在的機器爲了下載一個大電影,安裝了一個P2P軟件:電驢。 
所謂的P2P 就是Peer to Peer,即網絡中的機器是對等的。
全部使用電驢的機器不只僅是一個發起請求下載數據的客戶端,他們同時也是一個可以接受請求,向外發送數據的服務器。
這樣一來,當下載大文件的時候,你就能夠從不少安裝了電驢的機器上分塊下載,而不是僅僅從一個服務器上下載,速度快了不少。
人人爲我,我爲人人啊。 
但是TP-Link7954 很快就發現,當它試圖作服務器的時候,其餘電驢根本就連不上它,爲何? 
由於IP地址是我分配的啊,是個內網地址 192.168.1.2,外網的人根本就不知道,怎麼連?
TP-Link 7954 給我發了一封措辭嚴厲的信件,質問我爲何他無法做爲一個服務器接受外邊的鏈接,這強烈的阻礙了他們下載各類電影的需求。
我估摸着是瞞不住了,只好把全部的網卡都召集起來,開個會你們商量一下。
我解釋說:「如今IP地址很稀缺,我用這種NAT的方法也是不得已而爲之,要否則你們怎麼上網啊,大家以前不是過的也挺好嗎? 我據說電驢會佔用很大的流量,咱們公司很快就會禁止的。」
D-Link3925 說:「公司的政策根本不是你應該考慮的事,你考慮的是怎麼才能讓外網的電驢連上咱們!」
但是我實在是沒有辦法,就這一個外網的IP地址啊。 
TP-Link 7954卻是很聰明,他馬上就意識到了問題所在,想出瞭解決辦法:

「這樣吧,路由器你不是擅長搞玩小把戲嗎?能夠繼續玩下去。可是得容許咱們這些網卡參與進來玩,好比說我(ip地址192.168.1.2)會主動的要求你創建一個NAT映射 (192.168.1.2 : 4096) <-> (61.52.247.112: 3001)。

「你還能夠保存在你的NAT表中,而後我就會對外通告了,我是一個電驢服務器。誰要是想鏈接個人話,請到這裏來:61.52.247.112: 3001,當外網的鏈接來的時候,你必須把鏈接請求轉發到我這裏來。」

你們一致認爲這個方法很簡單、很實用,就這麼決定了。
「碼農翻身」公衆號注:這其實就是UPnP , 你打開你的無線路由器,就能看到 :

 

事情就這麼解決了,生活又恢復了平靜。固然,我做爲一個路由器,這些NAT、UPnP都是個人附加功能。我最重要的事情仍是創建路由表,作路由選擇、轉發IP數據包,下次再說吧。

「碼農翻身」 公共號 : 由工做15年的前IBM架構師建立,分享編程和職場的經驗教訓。

長按二維碼, 關注碼農翻身

相關文章
相關標籤/搜索