[Note] 有關網路:Computer Networking – The Network Layer

此篇主要是紀錄 Coursera 平台上的課程 Google IT Support Professional Certificate 中 The Bits and Bytes of Computer Networking 的第二個星期的上課筆記,大致上是一些網路設備和網路模型的介紹。其他的預期要寫的筆記也一併附上,未來整理完成了下方文字可以直接連結到該筆記:

  • Introduction to Networking
  • The Network Layer (本篇)
  • The Transport and Application Layers
  • Networking Services
  • Connecting to the Internet
  • Troubleshooting and the Future of Networking

目錄


The Network Layer

The Network Layer

在 LAN(local area network,區域網路)上,節點可以透過它們的 MAC 位址互相通訊。這在小範圍的效果很好,因為交換器可以快速連接到彼此連接埠進行四次傳輸。每個網路介面都會有一個唯一的 MAC 位址,它們不會以任何系統性的方式排序,所以無法推測某個 MAC 在哪一個時間點位在哪個位置,也因此它不適合遠距離通訊。

IPv4 Addresses

IP 位址有 32 個 bit,是由四個八位數數組所組成的,這些八位數通常會用十進制描述,也就是說一個數組會是 0-255 之間,像是 192.34.1.78 就是有效的 IP 位址,這種格式稱為點分十進位(dot-decimal notation)。IP 位址是一大段分配給各個組織和公司的,並不是由硬體廠商決定的,也就是說 IP 位址屬於網路,而非網路設備。像是無論在哪使用筆電,同一台筆電的 MAC 都是相同的,但在網咖分配給這台電腦的 IP 和在家中被分配到的 IP 就會不同。像這種透過動態主機設定協定(DHCP)分配的 IP 稱為動態 IP,相反的則是靜態 IP,也就是必須手動配置。

IPv4 Datagram and Encapsulation

在 IP 協定下,一個封包通常會被稱為一個 datagram(中文應該是資料單元?),在乙太網路鏈路上的封包稱作乙太影格(Ethernet frames)。就像任何乙太網格一樣,IP datagram 是一系列高度結構化、被嚴格定義的字段。IP datagram 主要兩個部分是 header 和 payload。IP datagram 的 header 包含的資料比乙太影格的 header 要多。

第一個字段是四位數,表示正在使用的 Internet 協定版本。最常見的是 IPv4(IP version 4)。在擁有 header 長度字段、版本字段後,IPv6(IP version 6)也正得到更廣泛的採用。

下一段也是四位數,用於宣告整個 header 的長度。20 bytes 是 IP header 的最小長度,我們無法在任何更小的空間中容納格式正確的 IP header 所需的所有資料。

接下來一段是服務類型 service type field。這八個位數可以用於指定服務品質或是 QoS 技術。每組 bit 組合分別代表不同的意思。

下一段是一個 16 位數的字段,總長度 total length。它的用途如其名-表示 IP datagram 的總長度,IP 標準的傳輸單位就是 65535 bytes,也就是 \(2^{16}\),單個 datagram 的最大的大小。

如果需要發送的資料總量大於單個 datagram 所能容納的大小,則 IP layer 則需要將這些資料拆分成多個單獨的封包。發生這種狀況時候,就需要使用辨識符 identification field,以便讓接收端知道這些封包都是同一個傳輸的一小部分。

接下來兩個密切相關:旗標 flags 和片段偏移量 fragment offset。旗標用於表示是否對 datagram 進行分段或已經被分段,有時候大封包在經過一些傳輸單位較小的網路時,會被切割成較小的片段再進行傳送,傳輸後的順序不一定會和當初順序一樣。片段偏移量同時也叫做分割定位,會為各個片段做好定位紀錄,重組時就可以組出正確順序了。

再來是存活時間(TTL,Time to Live),這個字段有八個位數。當一個封包被賦予 TTL 值,表示封包在被丟棄之前可以經過多少路由器 hops(跳站數目),也就是說數值會以倒數的方式進行,每經過一個路由器就減一,TTL 降到 0 時就會被丟棄。這樣可以避免封包一直充斥在網路上(有可能因為一些原因不能到達目的地)

再下一段是協定字段(protocol field),也一樣有八個位數。這裡紀錄的是封包所使用的網路協定類型,最常見的傳輸層協議是 TCP 和 UDP。

接下來是標頭檢驗值(header checksum field)。這個字段是檢查用的,確保封包被正確無誤地接收到。

在這些之後,有兩個非常重要的字段:來源位址(source IP address)和目的地位址(destination IP address)。來源位址就是發送端的 IP 位址,目的地位址就是接收端的 IP 位址,兩個長度都是 32 bits。

接下來有 IP options 和 padding 字段,IP options 字段比較少使用,用於某些需要特定控制的特殊封包。Padding 又可以稱為填充位元,只是一串的 0,用於確保 header 的總大小正確。

IPv4 Address Classes

IP 可以分為兩部分:Network ID 和 Host ID。以 9.100.100.100 為例子,Network ID 就是第一段,也就是 9 的部分,Host ID 就是第二、三、四段,也就是 100 的那幾節。

不過這樣肯定不夠,因此我們想,如果把 Network ID 增加,Host ID 就會減少,這樣雖然 IP 會減少至 \(2^{16}\),但是網路數量卻會增加至 \(2^{16}\)(也就是 65536 個),提供給更多較小的網路給更多公司使用。按 Network ID 我們可以分成三個不同的類別:Class A、Class B 以及 Class C。

Class A:首 8 個 bits 為 Network ID,IP 位址數量為 16777216,開頭為 0。
Class B:首 16 個 bits 為 Network ID,IP 位址數量為 65536,開頭為 10。
Class C:首 24 個 bits 為 Network ID,IP 位址數量為 256,開頭為 110。

我們還可以透過 IP 來判斷位址是屬於哪個類別。上面有提到開頭,以 Class A 為例子,第一段可能的數字是 0-127,所以開頭是 0-127 的 IP 都是 Class A:而 B 類開頭為 10,也就是說可能值為 129-191;依此類推,Class C 就是開頭 192-223 之間的地址。

Class D 始終是以 1110 開頭,並用於多播(multicasting),這是一次將單個 IP datagram 發送到整個網路的方式。從 224 到 239 之間的開頭。最後 Class C 構成所有剩下的 IP 位址,但是並未被分配,用於測試。

這些系統大部分已經被 CiDR(Classless Inter-Domain Routing,無類別域間路由)取代,但是位址分類系統在很多地方仍然存在。

Address Resolution Protocol

以上談到了 MAC 位址如何在 data link layer 使用以及 IP 位址如何在 network layer 使用。接下來要談到這兩種類型的位址如何互動和關聯。

ARP(Address Resolution Protocol,位址解析協定)是一種用於探索硬體位址以及特定 IP 的協定。只要 IP datagram 完全形成,就需要把它封裝在乙太影格中。這表示我們需要目標 MAC 位址完整乙太影格 header。幾乎所有有網路連接的設備都會保留 ARP 表格。表只是一個 IP 位址清單,MAC 位址和它們相關聯。

也就是說,當主機有一個封包要傳送給目標主機並已有目標 IP,那麼發送封包的主機會先檢查自己的 ARP 表格有沒有這個 IP 位址的 MAC 位址。有的話,就將 IP 對應的 MAC 位址填入 Layer 2 header;如果沒有,就向網路發出一個 ARP request 的廣播封包,查詢目標的實體位址。

另外這一部份老實說我聽不太懂,中文版維基百科針對這一部份的講解也爛得要死。這一篇文章雖然很舊了,但會比較好理解:[網路] 淺談 ARP (Address Resolution Protocol) 運作原理

Subnetting

Subnetting

子網路劃分是將一個大型網路分成許多較小子網路的過程。

位址類別讓我們將全球 IP 空間劃分為離散網路,像是 9.100.100.100 是 Class A。接著,它們透過查看查看 network ID 將訊息 route 到負責網路的閘道路由器,某個網路的出入口。一旦封包到達 9.0.0.0 Class A 網路的閘道路由器,路由器負責查看主機 ID 將資料發送到正確的系統。不過連接到同一個路由器的設備太多了,這就是子網路要作用的地方。使用子網路,這些單獨的子網路都有自己的路由器做為每個子網的出入口。

Subnet Masks

IP 位址是一個 32 bit 的數字,沒有子網路的狀況下,一部分用於 network ID,一部分用於 host ID。而有子網路劃分的狀況下,有一部分的的 host ID 實際用於 subnet ID。在 Internet level,核心路由器只關心 network ID,並使用它來將封包沿適當的路由器發送至網路。閘道路由器會有一些額外的資訊,可以用將這些訊息將封包發送到目標機器,或是路徑中的下一個路由器,最後一個路由器使用 host ID 將封包傳送到接收機器。

Subnet ID 是透過子網路遮罩計算,遮罩和 IP 位址一樣是 32 bit,寫成十進制的四個八位數。以 9.100.100.100 為例子:

IP: 9.100.100.100
IP (in binary): 00001001.01100100.01100100.01100100
Subnet (in binary): 11111111.11111111.11111111.00000000

遮罩,或是全部為 1 的部分的目的是告訴路由器 IP 哪一個部分是 network ID,其餘部分是 host ID,子網域的大小完全由它的子網路遮罩定義。像是上方例子,只有最後八位數可以用於 host ID。可用於 host ID 包含數字 0-255,但通常不使用 0。而 255 通常保留為子網域的 broacast 位址,綜合起來只有 1-254 可用於分配給 host。一般還是會說有 256 個位址,因為那兩個即使沒有分配給節點,但仍是 IP 位址。

假設我們有個 subnet 遮罩是 255.255.255.224
由於二進位將寫成 11111111.11111111.11111111.11100000
一共 27 個 1 後面接上 5 個 0,因此我們能夠將整個 IP 寫為 9.100.100.100/27

CIDR

位址 classes 是劃分全球網路 IP 空間的第一次嘗試,當已經明顯不夠用時,引入了子網路劃分方法。隨著網路持續發展,傳統的子網路劃分又跟不上了。以先前題到的方法來說 Class A 網絡的網絡 ID 為 8 位,Class B 網絡為 16 位,Class C 網絡為 24 位。也就是說可能只存在 254 個 Class C 網路,但也意味著有 2097152 潛在的 Class C 網路。

Class C 網路中的 254 台主機對於許多情況來說太小了, 但 Class B 網路中可用的 65534 台主機通常又太大了。許多公司最終仔用各種相鄰的 Class C 網路來滿足需求。也就是說路由表會包含一堆 Class C 的條目,這些網路實際上都被 route 到同一個地方。

CIDR(classless inter-domain routing,無類別域間路由)。先前的模型中,我們利用 network ID、subnet ID 以及 host ID 將數據傳送到正確的位置。使用 CIDR 的方法, network ID 和 subnet ID 將合併為一。像是上上一堂課題到的那個速記斜槓也是從 CIDR 這個方法而來(9.100.100.100/27那個),這種方式就讓分配 IP 的彈性變大了。

CIDR 標記法用在防火牆的規則上,IP 是不是在所允許的範圍內,若和遮罩的結果等於所設定的字首,防火牆就放行。一樣拿 9.100.100.100 為例子,如果我將來源 IP 範圍設定成 9.100.100.100/32,就表示完全都要符合,也就是說我只限定我的 IP 可以通過防火牆。

Routing

Basic Routing Concepts

從最簡單的角度來看,路由器是一種網路設備,根據目標位址轉發流量。路由器至少具有兩個網路接口,因為必須要連接到兩個網路才能工作。基本上路由有幾個步驟:第一,路由器接收數據封包;第二,路由器檢查封包 IP;第三,路由器在路由表中找尋 IP 的目標網路;第四,路由器從這些可能路徑中選出最佳路徑。這些步驟會不斷重複,直到到達目的地。

Routing Tables

路由表的內容至少會有:network ID(目標位址的)、子網路遮罩(判斷 IP 所屬的網路)、下一站位址或介面(Next hop/interface 用英文好像比較準確,意思是在前往目標位址的過程中,下一站的位址)。另外依照各種目的性的不同,路由表有可能會有其他的內容,像是花費、品質等等。

Interior Gateway Protocols

為了瞭解周遭環境,路由器使用路由協定,這些是特殊協定,路由器用來互相交談以共享它們可能擁有的訊息,這就是地球一個角落的路由器如何了解抵達到地球另外一個角落的最佳路徑方式。

路由協定分為兩大類:內部閘道協定(interior gateway protocols)和外部閘道協定(exterior gateway protocols)。內部閘道協定又可以分為兩類:鏈路狀態路由協議(link state routing protocols)和距離向量路由協定(distance vector protocols)。

路由器使用內部閘道協定在單個自治系統內共享訊息,自治系統是指在網際網路中,一個或多個實體管轄下的所有 IP 網路和路由器的組合,它們對網際網路執行共同的路由策略。最好的例子是一家公司需要在很多辦公室之間傳送資料,每個辦公室都有自己的區域網路。另一個例子是網路服務提供商使用很多覆蓋範圍為全國性的路由器,

鏈路狀態路由協議和距離向量路由協定目標非常相似,但使用它們的路由器共享不同類型的資料來完成。距離向量路由協定是一個較舊的標準,基本上只獲取它的路由表,上面是它已知的每個網路的列表以集這些網路在每一站的距離。但使用這個協定,路由器並不真正了解自治系統的總體狀態,它們只知道一些鄰居的訊息。

以上圖來說,假設路由器 A 有一個包含一堆列表的路由表,這些列表之一用於 10.1.1.0/24 網路,稱之為網路 X。路由器 A 認為到網路 X 的最快路徑是透過接口 2,而路由器 C 連接到這個接口。路由器 A 知道通過接口向路由器 C 發送用於網絡 X 的數據意味著它需要 4 個 hops 才能到達目的地。不過路由器 B 只距離 X 網路 2 個 hops,就算路由器 A 到 路由器 B 還要再 1 hop,但總共也才 3 hops。如果將資料轉發到路由器 B 而不是路由器 C,則路由器 A 就會更新路由表,為了以最快的方式達到網路 X,改用接口 1 將流量轉發到路由器 B。因此路由器對遠離它的網路變化的反應可能會很慢,這就是為什麼後來會有鏈路狀態路由協議。

鏈路狀態路由協議採用更複雜的方式來確定網路的最佳路徑。每個路由器都會宣告每個接口的鏈路狀態, 這些接口可以連接到其他路由器,也可以直接連接到網絡。關於每個路由器的訊息會被傳播到自治系統上的其他路由器,也就是說每個路由器都知道系統中其他路由器的所有詳細訊息,並且用這些訊息進行複雜的算法,確定到達任何目標網路的最佳路徑。

鏈路狀態路由協議需要更多的記憶體來保存所有的資料,也需要更多的處理能力,因為它必須針對資料進行演算法以確定更新路由表的最快路徑。

Exterior Gateways, Autonomous Systems, and the IANA

外部閘道協定在代表自治系統邊緣的路由器之間傳送資料。由於使用內部閘道協議共享數據的路由器都在同一個組織的控制之下,當路由器需要在不同組織之間共享訊息時,它們會使用外部閘道協議。

網際網路是一個巨大的自治系統網,在最高等級中,核心路由器需要了解自治系統才能正確轉發流量,將資料傳輸到自治系統的邊緣路由器是核心路由器的首要目標。

IANA(Internet Assigned Numbers Authority,網際網路號碼分配局)是一個幫助管理 IP 分配等事務的非營利組織。如果沒有單一授權,網際網路就無法運行,否則任何人都可以嘗試使用他們想要的任何 IP 空間導致完全混亂。除了管理 IP 分配外,IANA 還負責 ASN(Autonomous System Number,自治系統編號)的分配。ASN 是分配給各個自治系統的編號,和 IP 位址一樣,ASN 是 32-bit,但和 IP 不同的是,他們通常是單個十進制的數字,而沒有被拆分,因為一個 ASN 不需要為了更多的網路或是主機而改變,只是需要更新路由表以了解 ASN 代表什麼。另外我們查看 ASN 的頻率遠低於 IP 位址,除非我們是網際網路服務提供商。

Non-Routable Address Space

不可路由位址空間(Non-Routable Address Space)是預留給無法路由的任何人使用的 IP 範圍,並非每台聯接到網際網路的電腦都需要能夠和其他電腦進行通訊。不可路由位址空間允許此類網絡上的節點相互通訊,但閘道路由器不會嘗試將流量轉發到這類網路。

RFC 1918 定義了三個 IP 位址範圍,這些位址永遠不會被核心路由器 route 到任何地方,它們不屬於任何人,任何人都可以使用它。它們的流量在網際網路上移動的方式是分開的,因此沒有限制多少人可以將這些位址用於內部網路。不可路由位址空間主要三個範圍是:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

這些範圍可供任何人免費用於其內部網絡。

讓我知道你在想什麼!