兩層網路 三層網路的理解

2021-08-19 10:51:24 字數 3022 閱讀 2520

對於搞it的同行而言,大部分人都不會直接和網路打交道,因此除非從事網路開發,否則對網路內部機制也不會太關心,但是明白網路資料是怎麼走的,這對每個it工程師應該是很重要的基礎知識。網路資料報如何在網路上遊蕩,長久以來也困擾了我很長時間,現在把這部分內容總結分享一下。

說起網路,大家不約而同會想起大學課本上那個臭名昭著的iso七層模型,但是iso模型只是提供了乙個參考,並不是具體實現,目前我們使用最多的實現其實是tcp/ip協議族。但是對於tcp/ip,除了表示層和會話層沒有體現,其它幾層和iso基本是對應的,從這個角度講iso模型還是有參考意義的。

不扯那麼多,我們落地一點:

理解了網路各層的概念後,我們再回過頭來看,在這七層中網路層、鏈路層、物理層屬於低三層,其餘屬於高四層,從字面上可以看出傳輸層以下才是真正通過網路傳輸資料的層面。對於物理層,主要定義的是各種傳輸介質的訊號傳輸方式,比如時鐘頻率、電平高低、通道編碼等,這一層只是機械的傳輸,不涉及資料報選路邏輯,鏈路層(l2層)和網路層(l3層)才是我們要理解的地方。

首先看l2鏈路層,這一層以幀(frame)為單位組織物理訊號,每個幀都需要有乙個源位址和目的位址,絕大多數情況下使用的都是網絡卡mac位址。這一層主要的資料**裝置是集線器和交換機,對於集線器,由於每乙個資料幀都會被複製到各個埠,使每個連線主機收到很多跟自己無關的資料幀,這直接導致主機和集線器之間通道衝突劇烈(衝突域屬於物理層概念),因此現在基本不用該裝置。而交換機則具有mac位址學習功能,能夠向各個埠準確投放資料幀,這樣就大大提高了資料傳輸效率。對於l2層,交換機只能**乙個子網內的資料幀(子網是通過ip位址劃分的),如果要將乙個資料幀跨網**,則需要借助於l3層的路徑規劃功能,這個一會再說。

現在假設有如下網路拓撲結構,abcd四台主機屬於10.0.0.0子網,閘道器都指向路由器的10.0.0.1埠,efgh屬於10.0.1.0子網,閘道器指向路由器的10.0.1.1埠。

先看同一子網內的通訊的情況(a向c傳送資料,這種情況下都是通過ip位址指定的),假如所有的主機、交換機和路由器都剛剛加電,內部沒有快取任何mac對映表和路由表。a在傳送之前,發現c和a在同乙個子網內,於是a試圖先在物理子網內找一下c,但是在同一物理子網內是通過硬體mac位址來定址的,而a此時並不知道c的mac位址,於是a通過arp廣播來試圖獲取,發出的廣播包包括如下類似內容:(注:廣播時用的mac位址是ff:ff:ff:ff:ff:ff)

交換機1在收到這個arp廣播包後,首先學習到了主機a原來是和1口連線的,然後在快取中查詢c的mac位址,但是最終沒有找到,於是交換機1將這個包從所有埠(連線a的1口除外)發出去,交換機2收到後也會繼續廣播出去。當主機b和d收到這個廣播包之後,發現和自己無關,於是便直接丟棄這個包,不做任何處理;c收到這個廣播包後,發現原來是找自己的,於是它發出如下類似格式的回應內容,來告知a自己的身份。

這個過程對於所有參與的交換機也是個學習的過程,因此交換機1和交換機2也學習到了a和c的位置。至此ac相互找到對方後,便可以在同一物理子網之間直接通過指定mac位址通訊了,他們傳送資料幀的類似格式如下:

下面再來看跨物理網路通訊的情況(a向e傳送資料),同樣假設裝置都剛剛加電,快取為空。a發現e的ip也是同一網段的,於是又開始廣播,但是這次bcd都沒有回應。我們此時把視線轉到路由器1上,當路由器1收到這個arp廣播包後,為了避免廣播風暴的產生,路由器1不會繼續廣播這個arp包,但是路由器1會把自己的mac告訴a,回發如下類似格式的內容:

a在等待超時後,發現當前物理子網內找不到e,但是a已經知道了閘道器路由器的mac位址,於是便會將發給e的資料報扔給閘道器(也就是路由器1的1口),路由器1收到這個包後,發現e的ip在自己內部也沒有快取,於是路由器1也開始了尋找e的過程。相比交換機的子網內「廣播找人」,路由器的選路範圍更大也更複雜,很多情況下是整個internet,並且要誇多個運營商,所以在l3層面路由器的路徑計算協議較多,包括:rip、ospf、is-is、bgp、igrp等協議。路由器之間計算路徑時,任何一台路由器都是無法窺探整個網路的,因此每台路由器都只是通過選路演算法找到下一跳的最優路徑,這些最優路徑連線起來便形成了一條完整的路徑。換句話說,路由器的**路徑不是乙個路由器選擇出來的,而是一群路由器共同選擇出來的下一跳位址序列。具體的路由選路無法一一講解,大家感興趣可以自己調查一下,這裡假設路由器1直接找到了路由器2。

我們繼續往下探索,當路由器2接到尋找主機e的廣播包後,發現e位於自己的網路中(當然也提前需要乙個廣播學習的過程才能知道),便向前一跳路由器(即路由器1)反饋自己離主機e最近,最終經過這樣乙個「a→閘道器路由器→路由器間選路→找到主機e所在子網」的過程a終於可以與e進行通訊了,由於a和e之間經歷了多個物理子網,因此需要多次的l2**才能實現資料報的到達,這個過程中l3層ip包外包幀的mac位址會不斷變換。a→b→a這個過程中,資料幀和ip包的位址經歷過程如下(假設a使用的是本機的88埠,b使用的是本機的99埠):

在這個過程中,資料報在路由器1和2的14口之間傳遞時,由於是在乙個裝置內部,因此可以直接**,而不用變換幀頭,從而提高**效率。如果a要與其它子網的fgh主機通訊,過程基本是一樣的,只不過剛開始不會先在當前子網內「廣播找人」,而是直接將資料報投遞給出口閘道器。

本文旨在向大家展示l2交換機和l3路由器在**網路資料時的乙個主要流程,希望能給大家帶來幫助。由於3層跨子網計算ip包投送路徑協議比較多,先請大家自己參考其它資料。

兩層網路,三層網路的理解

對於搞it的同行而言,大部分人都不會直接和網路打交道,因此除非從事網路開發,否則對網路內部機制也不會太關心,但是明白網路資料是怎麼走的,這對每個it工程師應該是很重要的基礎知識。網路資料報如何在網路上遊蕩,長久以來也困擾了我很長時間,現在把這部分內容總結分享一下。說起網路,大家不約而同會想起大學課本...

兩層卷積網路分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input data 讀取資料 mnist input data.read data sets mnist data one hot true x為訓練影象...

PyTorch搭建兩層網路

舉乙個很簡單的例子來熟悉使用pytorch構建和訓練神經網路的整個過程。import torch import torch.nn as nn n,d in,h,d out 64,1000 100,10 隨機建立一些訓練資料 x torch.randn n,d in y torch.randn n,d...