01.05 想出網關?你需要懂得這些

最近沒事在看極客時間上劉超老師的《趣談網絡協議》那門課程,其中有一篇講得非常有意思,也有些難以理解,我以我的角度來談談。

MAC 頭和 IP 頭細節

想要跨網段訪問的話,有一關是必須要過的:網關( Gateway )

配置好 IP 地址和網關之後,就能夠自由訪問上網了,想訪問哪兒網站就訪問哪兒個網站,各種浪。但是在進行跨網訪問的時候,會牽扯到 MAC 地址和 IP 地址的變化,所以咱們先來知道一下 MAC 頭和 IP 頭的細節。

MAC 頭和 IP 頭的細節(畫的不是太好哈):


想出網關?你需要懂得這些


簡單來說一下內容:

目標 MAC 地址和源 MAC 地址應該不需要說明什麼了,協議類型是為了說明裡面是 IP 協議

版本( Version ):佔 4 位,用來表明 IP 協議實現的版本號,目前來說主流還是 IPV4

服務類型 TOS ( Type of Service ):佔 8 位,其中前 3 位比特為優先權字段,第 8 位保留未用,第 4 至 7 位分別代表延遲,吞吐量,可靠性和花費。

總長度:佔 16 位,說明整個數據報的長度(以字節為單位),最大長度為 65535 字節

標識:佔 16 位,用來唯一標識主機發送的每一份數據報,通常每發一份報文,它的值會加 1

標誌:佔 3 位,標誌一份數據報是否要求分段

片偏移:佔 13 位,如果一份數據報要求分段的話,該字段指明該段偏移距原始數據報開始的位置

生存期 TTL ( Time to Live ):佔 8 位,用來設置數據報最多可以經過的路由器數,由發送數據的源主機設置,通常為 32,64,128 等。沒經過一個路由器,它的值減 1,直到 0 時該數據報被丟棄。

協議:佔 8 位,用來說明 IP 層所封裝的上層協議類型,如 ICMP( 1 ), IGMP( 2 ), TCP( 6 ), UDP( 17 )等。 首部校驗和:佔 16 位,根據 IP 頭部計算得到的校驗和碼。

源 IP 地址,目標 IP 地址:各佔 32 位,用來標明發送 IP 數據報文的源主機地址和接收 IP 報文的目標主機地址。

在任何一臺機器上,如果想要訪問另一個 IP 地址時,都會先判斷,要訪問的目標 IP 地址,與當前機器 IP 地址是否在同一個網段內。

如果是同一個網段,這就好說了,直接將源地址和目標地址放入到 IP 頭中,然後通過 ARP 得到 MAC 地址,將源 MAC 和目標 MAC 放入 MAC 頭中,發出去就 OK 了。

但是如果不是同一個網段呢,這就需要發往默認網關 Gateway 了。Gateway 的地址一定是和源 IP 地址是同一個網段的,如果不是第一個,就是第二個。比如, 192.168.1.0/24 這個網段,Gateway 一般就是 192.168.1.1/24 或者 192.168.1.2/24 。因為網關和源 IP 地址在同一個網段內,所以發給 Gateway 的過程和上面同一個網段的過程是一樣的。網關接收到之後,接下來怎麼處理就是它自己的事情了。

做了上面那麼多的鋪墊,終於來到了今天想要說的主要內容:網關是怎麼將數據跨網段發送出去的。因為在這裡面涉及到了 IP 地址和 MAC 地址的變化。

MAC 地址是在一個局域網內才有效的地址,所以 MAC 地址只要經過網關,就一定會改變,因為經過網關就意味著換了局域網。主要在於 IP 地址是否改變。如果 IP 地址不改變,那我們就將網關稱為轉發網關;如果 IP 地址改變,則將網關稱為 NAT 網關。

轉發網關

先來說一下轉發網關:


想出網關?你需要懂得這些


如圖,我們能夠看到,服務器 A 的 IP 地址為 192.168.1.101/24 ,服務器 B 的 IP 地址為 192.168.4.101/24 ,現在服務器 A 想要訪問服務器 B,不在同一個網段內,怎麼辦呢?肯定要經過網關的,對吧(因為 IP 頭和 MAC 頭裡面的內容太多了,在這裡主要寫出 MAC 和 IP 內容)

此時,服務器 A 會給路由器 A 發送這樣的內容:

<code>源 MAC :服務器 A 的 MAC
目標 MAC : 路由器 A 的 MAC
源 IP : 192.168.1.101 (即服務器 A 的 IP )
目標 IP : 192.168.4.101 (即服務器 B 的 IP )
/<code>

路由器 A 接收到內容之後,發現是想訪問 192.168.4.0/24 的,根據配置的路由規則,將要發送的內容通過 192.168.2.1 這個口發送出去,發送給路由器 B 的內容是這樣的:


<code>源 MAC :路由器 A 的 MAC
目標 MAC : 路由器 B 的 MAC
源 IP : 192.168.1.101 (即服務器 A 的 IP )
目標 IP : 192.168.4.101 (即服務器 B 的 IP )
/<code>

路由器 B 接收到了來自路由器 A 的內容,它發現是想訪問 192.168.4.0 這個地址,根據配置的路由規則,需要從 192.168.4.1 這個口出去,這樣就能發給服務器 B,此時路由器 B 發送的包是這樣的:


<code>源 MAC :路由器 B 的 MAC
目標 MAC : 服務器 B 的 MAC
源 IP : 192.168.1.101 (即服務器 A 的 IP )
目標 IP : 192.168.4.101 (即服務器 B 的 IP )
/<code>

至此,服務器 A 發送的內容就到達了服務器 B 。

咱們來總結一下以上內容:在轉發網關下,我不 care 其他的,我只知道我要發給哪兒個 IP ,所以在整個過程中,源 IP 和目標 IP 都沒有發生改變。

NAT 網關

接下來咱們來說說 NAT 網關。照例,上個圖:


想出網關?你需要懂得這些


有沒有發現一個問題,服務器 A 的 IP 地址是 192.168.1.101 ,要訪問的服務器 B 的地址也是 192.168.1.101 ,如果只是看 IP 地址的話,是不是饒了一圈發現,這不就是自己訪問自己嘛?驚不驚喜。

但是實際上服務器 A 在北京,服務器 B 在上海,兩個地方有一個相同的 IP 地址罷了。問題就來了,服務器 A 怎麼就可以訪問到服務器 B 了呢?

就像上海人說上海話,北京人說北京話,一個區域內大家都聽得懂,但是如果北京人跑到上海去,想要交流怎麼辦呢?說普通話唄,對不對。在網絡中也可以這樣做。既然這兩個局域網之間沒有商量過,各自使用各自的,內部使用的話這都沒事兒,但是如果想要在外面也走的開,就需要制定規則。也就是說,路由器 A 和 B 在外網上需要有一個大家都公認的身份。

在圖中我們能夠看到路由器 A 在公網上的身份是 192.168.2.1/24 ,路由器 B 在公網上的身份是 192.168.2.2/24 。有了公認的身份之後,來看看接下來發送的內容:

服務器 A 發送給路由器 A 的內容:

<code>源 MAC :服務器 A 的 MAC 

目標 MAC : 路由器 A 的 MAC
源 IP : 192.168.1.101 (即服務器 A 的 IP )
目標 IP : 192.168.2.2 (即路由器 B 的公網 IP )
/<code>

路由器 A 接收到內容之後,根據配置的路由規則,通過 192.168.2.1/24 發送給路由器 B ,此時發送的內容為:


<code>源 MAC :路由器 A 的 MAC
目標 MAC : 路由器 B 的 MAC
源 IP : 192.168.2.1 (即路由器 A 的公網 IP )
目標 IP : 192.168.2.2 (即路由器 B 的公網 IP )
/<code>

內容到達路由器 B 之後,根據它的配置規則,發現是想要發送給服務器 B 的,此時:


<code>源 MAC :路由器 B 的 MAC
目標 MAC : 服務器 B 的 MAC
源 IP : 192.168.2.1 (即路由器 A 的公網 IP )
目標 IP : 192.168.1.101 (即服務器 B 的公網 IP )
/<code>

至此,服務器 A 發送的內容就到達了服務器 B 。

咱們來總結一下以上內容:在 NAT 網關下, MAC 地址和 IP 地址都是會改變的。 MAC 地址還好理解一些,要發送給誰,那麼目標 MAC 地址就是要發送的機器 MAC 地址即可。但是 IP 地址如果是跨網段訪問,則都需要通過公網 IP 來進行才可以。

以上就是想要分享的內容,感謝您的閱讀~

參考:

極客時間:《趣談網絡協議》



分享到:


相關文章: