主頁 > 後端開發 > 別再恐懼 IP 協議(萬字長文 | 多圖預警)

別再恐懼 IP 協議(萬字長文 | 多圖預警)

2021-03-03 06:23:08 後端開發

 

?? 盡人事,聽天命,博主東南大學碩士在讀,熱愛健身和籃球,樂于分享技術相關的所見所得,關注公眾號 @ 飛天小牛肉,第一時間獲取文章更新,成長的路上我們一起進步

?? 本文已收錄于 「CS-Wiki」Gitee 官方推薦專案,現已累計 1.5k+ star,致力打造完善的后端知識體系,在技術的路上少走彎路,歡迎各位小伙伴前來交流學習

?? 如果各位小伙伴春招秋招沒有拿得出手的專案的話,可以參考我寫的一個專案「開源社區系統 Echo」Gitee 官方推薦專案,目前已累計 330+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供詳細的開發檔案和配套教程,公眾號后臺回復 Echo 可以獲取配套教程,目前尚在更新中

0. 前言

對我個人來說,本科的時候,除去計算機組成原理,計算機網路堪稱復習難度最大的一門課,其中無窮無盡的 IP 地址的計算、子網劃分、路由轉發簡直就是夢靨,現在回過頭來再看,其實真的不難,只不過是當時的知識體系實在太亂,?? 本篇耗時長達十幾個小時,嘔心瀝血,相信大家看完必定有所識訓,

?? 計算機網路的細碎知識點真的是越扣越多......,本文主要講解 IP 協議相關的重要知識點,一些相對來說比較冷門的就不再說了

1. 從網路層說起

眾所周知,IP 協議屬于網路層,回顧一下之前文章 一文讀懂兩臺計算機之間是如何通信的 所說的,網路層的作用:

在計算機網路中進行通信的兩個計算機之間可能會經過很多個資料鏈路,也可能還要經過很多通信子網,網路層的任務就是選擇合適的網間路由和交換結點, 確保資料及時傳送

通俗點來說吧,資料鏈路層的作用很簡單,它是無腦的,只負責在兩個相鄰節點之間傳送資料,它并不知道它所傳送的資料最終目的地是哪,而網路層便是它的大腦,網路層負責指定源地址和目的地址,并告訴資料鏈路層該走哪條路線,下面這張圖可以說是非常形象了 ??:

運輸層交付給網路層的資料格式是 TCP/UDP 報文段,那么網路層會將這些報文封裝成 IP 資料報交付給資料鏈路層,在之前的文章中我們說過,每個資料鏈路上會規定一個最大傳輸單元 MTU,如果 IP 資料報的長度超過 MTU,那么網路層就會把這些報文分割成一個一個的小組(分組)進行傳送,資料鏈路層收到 IP 資料報之后將其封裝成幀,

為什么網路層的傳輸單元(協議單元)稱為 IP 資料報呢?那是因為在 TCP/IP 體系結構中,網路層使用 IP 協議,因此稱為 IP 資料報 ,簡稱資料報,下面我們就來詳細講解 IP 協議 ??

2. 什么是 IP 協議

IP 協議是整個 TCP/IP 協議族的核心,也是構成互聯網的基礎,位于 TCP/IP 模型的網路層,

IP 協議用于屏蔽下層物理網路的差異,為上層提供統一的 IP 資料報

? IP 協議提供無連接的、不可靠的、盡力的資料報投遞服務:

  • 1)無連接的投遞服務

    發送端可于任何時候自由發送資料,而接收端永遠不知道自己會在何時從哪里接收到資料,每個 IP 資料報獨立處理和傳輸, 一臺主機發出的資料報序列,可能會走不同的路徑, 甚至有可能其中的一部分資料報會在傳輸程序中丟失

  • 2)不可靠的投遞服務

    IP 協議本身不保證 IP 資料報投遞的結果, 在傳輸的程序中,IP 資料報可能會丟失、重復、延遲和亂序等, IP 協議不對內容作任何檢測,也不將這些結果通知收發雙方

    IP 資料報的丟失,通過路由器發 ICMP 報文 告知(后續文章會詳細講解 ICMP 協議,敬請期待); 必要時,由高層物體(如 TCP)負責差錯恢復動作

  • 3)盡力投遞服務

    每個資料鏈路上會規定一個最大傳輸單元 MTU,如果 IP 資料報的長度超過 MTU,那么網路層就會把這些報文分割成一個一個的小組(分組)進行傳送,以適應具體的傳輸網路

3. IP 協議的重要內容:IP 地址

① IP 地址初探

IP 地址是 IP 協議中非常重要的內容,IP 資料報中含有收/發方的 IP 地址, 那么什么是 IP 地址呢?

那就是給因特網上的每臺設備都規定了其全世界唯一的地址,叫做 “IP 地址”,正是由于有了 IP 地址,才保證了用戶在連網的計算機上操作時,能夠高效而且方便地從千千萬萬臺計算機中選出自己所需的物件來,

IP 地址就好像電話號碼(地址碼):有了某人的電話號碼,你就能與他通話了,同樣,有了某臺主機的 IP 地址,你就能與這臺主機通信了,

按照 TCP/IP 協議規定,IP 地址用二進制來表示,每個 IP 地址長 32 位元,也就是 4 個位元組(這里說的是 IPV4 地址長 32 位元 / 4 位元組,而 IPV6 地址占 128 位元 / 16 位元組),那么,IPV4 地址的最大值就是 ?,也就是說:最多給大約 43 億臺接入互聯網的設備配置其獨一無二的 IPV4 地址,

一個采用二進制形式的 IP 地址是一串很長的數字,人們處理起來也太費勁了,為了方便人們的使用,IP 地址習慣性地被寫成十進制的形式,使用 “.” 分開不同的位元組,這種表示法叫做點分十進制表示法,這顯然比一連串二進制地 1 和 0 容易記憶得多,舉個例子:

 

② IP 地址和 MAC 地址

?? 可能有些小伙伴會以為,一臺計算機只能有一個 IP 地址,這種觀點是錯誤的,實際上,IP 地址并不是根據主機臺數來配置的,而是根據網卡(網路配接器)來的,像服務器、路由器等設備都是有 2 個以上的網卡,也就是它們會有 2 個以上的 IP 地址,

說到這里,不知大家有沒有想起我們之前說的 MAC 地址,沒錯,MAC 地址(鏈路層地址)也是根據網卡來配置的,一臺主機擁有多少個網卡就有多少個 MAC 地址,

那么,既然有了 MAC 地址用來唯一標識這臺計算機了,那還需要 IP 地址干啥?回答這個問題只需要我們回到本文的第一幅圖:

  • 網路層指定了從哪個主機(「源 IP 地址」)發送到哪個主機(「目的 IP 地址」),源 IP 地址和目標 IP 地址在傳輸程序中是不會變化的

  • 而資料鏈路層則是根據 MAC 地址在一個接一個的區間中進行傳輸的,每個區間內的出發地址即「源 MAC 地址」,每個區間內的目的地址即「目的 MAC 地址」,顯然,隨著資料的傳輸,源 MAC 地址和目的 MAC 地址會不斷的發生變化

    比如上圖,網路層告知了 1-2-3 路線,那么資料鏈路層就會根據 MAC 地址依次找到 1、2、3,并在他們之間傳輸資料,

?? 這么說吧,舉個形象點的例子:我們把資料鏈路層當成乘坐高鐵從蘇州到南京,再在南京轉乘到北京,再在北京轉乘到西藏的旅客,那么網路層就相當于每個車站的作業人員,在資料鏈路層每次轉乘時,網路層為其購買了一張標有下一個 MAC 地址的車票,因此,即使旅客(資料鏈路層)不知道其最終目的地也沒有關系,作業人員(網路層)會給你做出指引,

而實際上,網路層做出指引的程序,我們將其稱為路由控制 (下文會詳細講解)

④ IP 地址的分類

互聯網誕生之初,32 位的 IP 地址(也就是 IPV4 地址)顯得很充裕,于是大佬們對這些看似龐大的 IP 地址進行了分類:

上圖中我們可以看到,A 類 IP 地址的首位是 0,B 類 IP 地址的前幾位是 10,C 類 IP 地址的前幾位是 110......,我們將這些稱之為分類號,用于區分 IP 地址的類別,

其中,A、B、C 類地址主要分為網路號和主機號兩個部分:

  • 什么是網路號:網路號表示其屬于互聯網的哪一個網路

  • 什么是主機號:主機號表示其屬于該網路中的哪一臺主機

大 ?? 可能有這個疑問:為什么要分離網路號和主機號

因為兩臺計算機要通訊,首先要判斷是否處于同一個廣播域內,即網路地址(網路號)是否相同:

  • 如果網路地址相同,表明接受方在本網路上(本地網路主機),那么可以把資料包直接發送到目標主機,無需轉發給其他的網路

  • 網路號不相同的主機稱之為遠程網路主機,遠程網路中的主機要相互通信必須通過本地網關(Gateway)來傳遞轉發資料

路由器尋址作業中,也就是通過這樣的方式來找到對應的網路號的,進而把資料包轉發給對應的網路內,

?? IP 地址分類的優點顯而易見,不管是路由器還是主機決議到一個 IP 地址時候,可以很快的找出網路地址和主機地址:

?? A、B、C 類地址對應的地址范圍和最大主機個數如下:

網路類別第一個可用的網路號最后一個可用的網路號每個網路中的最大主機數
A 1 126 ?
B 128.1 191.255 ?
C 192.0.1 223.255.255 ?

OK,看完上表大家必定有很多疑惑,下面一一為大家解答:

? 1)第一個可用的網路號如何計算出來的?很簡單,網路號全為 0 即可,看下圖,以 B 類地址為例:

由上圖,B 類地址的第一個可用的網路號應該是 128.0 啊,為什么是 128.1 呢?

?? 其實這是一個歷史問題,RFC 791 中說:A value of zero in the network field means this network. 即網路號全 0 代表本網路,因此真正可用的網路號應該是從 1 開始,

所以,B 類地址的第一個可用的網路號就是 128.1

A 類和 C 類地址同理,這里我就不再畫圖了,

不過實際上 128.0.0.1-128.0.0.255 這段地址已經有明確的歸屬,國家是 NL,而 128.0.1.0/24 這段同樣也分掉了,國家是 RO,而 192.0.0.1 這個地址查出來是沒有被分配的,在 RFC 3330 中里有關于這兩段地址的明確說明:

128.0.0.0/16 - This block, corresponding to the numerically lowest of
the former Class B addresses, was initially and is still reserved by
the IANA. Given the present classless nature of the IP address
space, the basis for the reservation no longer applies and addresses
in this block are subject to future allocation to a Regional Internet
Registry for assignment in the normal manner.
192.0.0.0/24 - This block, corresponding to the numerically lowest of
the former Class C addresses, was initially and is still reserved by
the IANA. Given the present classless nature of the IP address
space, the basis for the reservation no longer applies and addresses
in this block are subject to future allocation to a Regional Internet
Registry for assignment in the normal manner.

這個 RFC 發表于 2002 年,對于這兩段地址明確表示因為無類地址空間的原因,不再需要保留,地址將在今后進行分配,

? 2)最后一個可用的網路號如何計算出來的?同理,網路號全為 1 即可,看下圖,以 B 類地址為例:

? 3)每個網路中的最大主機數為什么都要減 2 呢?

首先我們要明白,計算網路中的最大主機數就是要看主機號的位數,比如 B 類地址的主機號占 8 位,那么 B 類地址的最大主機個數就是 ? 個,為什么要減 2 呢?

? 那是因為主機號全為 0 和主機號全為 1 的這兩個 IP 地址是特殊的,在主機號的分配程序中,應該去掉這兩種情況

  • 第一種情況:主機號全為 1 指定某個網路下的所有主機,用于廣播

  • 第二種情況:主機號全為 0 指定某個網路

④ IP 單播/廣播/多播

Ⅰ IP 廣播

上文中我們提到了主機號全為 1 指定某個網路下的所有主機,用于廣播,那么什么是廣播呢?

廣播地址用于在同一個鏈路中相互連接的主機之間發送資料包,即一個發送方對應多個接收方,接收方在接收到資料包之后,可以根據自己的需要選擇接識訓是丟棄,

?? 比如說學校的廣播通知哪幾個同學來辦公室,那么雖然所有同學都接收到了這條訊息,但是不需要去辦公室的同學就不必理會

當主機號全為 1 時,就表示該網路的廣播地址,例如把 172.20.0.0/16 用二進制表示如下:

10101100.00010100.00000000.00000000

將這個地址的主機部分全部改為 1,則形成廣播地址:

10101100.00010100.11111111.11111111

再將這個地址用十進制表示,則為 172.20.255.255

廣播地址可以分為本地廣播和直接廣播兩種:

1)在本網路內廣播的叫做本地廣播,例如網路地址為 192.168.0.0/24 的情況下,廣播地址是 192.168.0.255,因為這個廣播地址的 IP 包會被路由器屏蔽(即路由器不轉發該廣播包,廣播包無法穿透路由器),所以不會到達 192.168.0.0/24 以外的其他鏈路上,

2)在不同網路之間的廣播叫做直接廣播,例如網路地址為 192.168.0.0/24 的主機向 192.168.1.255/24 的目標地址發送 IP 包,收到這個包的路由器,將資料轉發給 192.168.1.0/24,從而使得所有 192.168.1.1 ~ 192.168.1.254 的主機都能收到這個包,

?? 由于直接廣播有一定的安全問題,多數情況下會在路由器上設定為不轉發廣播包,即本地廣播,廣播包無法穿透路由

Ⅰ IP 單播

廣播模式下,有一個發送方,多個接收方,而在單播模式下,只有一個發送方和一個接收方,單播是可以穿透路由器的,也即路由器會對資料包其進行轉發:

Ⅲ IP 多播

上面我們講了 A、B、C 類地址,D、E 類還沒講,D 類和 E 類地址是沒有主機號的,所以不可用于主機 IP,

多播使用 D 類地址,因此如果首位是 1110,就可以認為是多播地址,而剩下的 28 位可以稱為多播的組編號,E 類是預留的分類,暫時未使用,

那么什么是多播(組播)呢?多播用于將包發送給特定組內的所有主機(可以穿透路由器),即一個發送方,特定的多個接收方,由于其直接使用 IP 協議,因此也不存在可靠傳輸,

?? 在人們使用多播功能之前,一直采用廣播的方式,通過廣播將資料發送給所有終端主機,再由這些主機 IP 之上的一層去判斷是否有必要接收資料,這種方式會給那些毫無關系的網路或主機帶來影響,造成網路上很多不必要的流量,再者,由于我們在大部分情況下使用的本地廣播是無法穿透路由的,所以多播這種既能夠穿透路由,又可以實作只給那些必要的組發送資料包的技術就成為必選之路了,

⑤ 子網劃分

子網劃分應該是整個 IP 協議中最讓人頭大的部分,寫這部分的時候我也參考了很多資料,對于如何能夠循序漸進講完這部分知識點絞盡腦汁,構思了很久,相信大家看完一定能夠有所識訓 ??

Ⅰ 為什么要進行子網劃分

為什么要進行子網劃分呢?那是因為傳統的 IP 地址分類可能會造成資源浪費:??

上文我們說過,網路號相同的計算機屬于同一個鏈路,以 B 類網路為例,網路號 16 位(除首位 “10”,啊hi有 14 位),也就是說理論上一個鏈路上允許大約 ? 萬臺計算機連接,然而,在實際架構中,一般不會出現一個鏈路上連接這么多計算機的情況,因此,直接使用 A 類、B 類或 C 類地址,確實有些浪費資源,

為此,人們開始一種新的組合方式以減少這種浪費,

Ⅰ 子網劃分初探

所謂子網劃分就是:將傳統的兩級 IP 地址(網路號 + 主機號)轉換成粒度更小的三級 IP 地址(網路號 + 子網號 + 主機號),也就是將主機地址劃分為子網號和子網內的主機號

同樣的,子網主機號不能全 0 或全 1

?? 注意:某單位劃分子網后,對外仍表現為一個網路,即本單位外的網路看不見本單位內的子網劃分,如下圖所示,將網路地址 145.13.0.0 劃分成 3 個子網,子網的網路地址分別為 145.13.3.0145.13.7.0145.13.21.0

  • 所謂網路地址就是只指定了網路號,未指定主機號,主機號全 0,

  • 子網的網路地址就是指定了網路號和子網號,未指定主機號,主機號全 0,

Ⅱ 子網掩碼

那么,子網具體是怎么劃分的呢?

這里就需要引出一個新的概念:子網掩碼 subnet mask子網掩碼只有一個作用,就是將某個 IP 地址劃分成網路地址和主機地址兩部分(為什么需要將 IP 地址分成網路地址和主機地址兩部分,在上文我們已經說過了,這里不再贅述),

子網掩碼由一連串的 0 和 1 構成(0 或 1 必須連續),二級 IP 地址中的網路號和三級 IP 地址中的網路號 + 子網號對應到子網掩碼中都用 1 來表示,而主機號對應到子網掩碼中用 0 來表示,因此 A、B、C 類的子網掩碼如下:

 

將 IP 地址與子網掩碼做按位 AND(與)運算(只有兩個都為 1,結果才為 1,否則為 0),得出的就是網路地址

?? 舉個子網劃分的例子:假設對 C 類地址進行子網劃分,網路地址 192.168.1.0(二級 IP 地址),使用子網掩碼 255.255.255.192 對其進行子網劃分:

子網掩碼 255.255.255.192 中共有 26 個 1,即代表網路號 + 子網號共 26 位,而 C 類地址的網路號(加上分類號)共 24 位,由此可知,需要從 8 位主機號中借用 2 位作為子網號,由于子網網路地址被劃分成 2 位,那么子網地址就有 ? 個,分別是 00、01、10、11,具體劃分如下圖:

劃分后的 4 個子網如下表格:

?? 另外說明一點,子網掩碼還有一種更為簡單明了的寫法,子網掩碼的作用不就是用來分離網路號和主機號的嘛,我們直接在 IP 地址的后面注明網路號的位數(網路號 + 子網號)不就行了,

以網路地址 192.168.1.0(C 類二級 IP 地址),子網掩碼 255.255.255.192 為例,我們可以寫成:192.168.1.0/26,表示網路號 + 子網號共 26 位,

4. 拯救枯竭的 IPV4 地址

隨著全球上網用戶量越來越大,現行的 IPV4 地址越來越不夠用,拯救枯竭的 IPV4 地址勢在必行:

  • 方案一:無分類 IP 地址 CIDR

  • 方案二:NAT 地址轉換

  • ........

然而,這些方案僅僅是解決燃煤之急,相對緩解了 IPV4 地址不夠用的問題,但是 IPV4 地址的數量本身有限的事實無法改變,最根本的解決辦法還是使用 128 位元的 IPV6 地址(本文最后會粗略講解)

① 無分類 IP 地址 CIDR

直到 20 世紀 90 年代中期,向各種組織分配 IP 地址都以 A、B、C 等分類為單位進行,對于架構大規模的組織,一般會分配一個 A 類地址;反之,對于小規模的組織,分配一個 C 類地址,?? 然而,A 類地址的派發在全世界最多也無法超過 128 個,加上 C 類地址最多允許 254 臺計算機相連,導致眾多組織開始申請 B 類地址,其結果就是 B 類地址也開始嚴重缺乏,無法滿足需求,

于是,人們開始放棄 IP 地址的分類,采用任意長度分割 IP 地址的網路號和主機號,這種方式叫作無分類 IP 地址 CIDR,意為 “無型別域間選路”,

CIDR 的表現形式為 a.b.c.d/x,其中 /x 表示前 x 位屬于網路號(網路前綴),網路號的長度可以根據需要變化,例如 128.14.35.7/20 表示該 IP 地址的前 20 位為網路號,剩余 12 位是主機號,

? CIDR 把網路號(這里用網路前綴可能更好理解,大家看下面這個例子就明白了)都相同的連續 IP 地址組成一個 CIDR 地址塊,這樣,我們就可以把原來的多個 IP 地址合并成同一個網路,更有效的利用 IPV4 地址,舉個例子,應用 CIDR 技術將 203.183.224.1203.183.225.254 的地址合并為同一個網路(它們本來是 2 個 C 類地址):

上例中,合并該區間的地址后,主機數為 ? 個,也就是說從 203.183.224.1203.183.225.254 的這個網路內允許接入 510 臺主機:

② NAT 地址轉換

上文我們說過,IP 地址并不是根據主機臺數來配置的,而是根據網卡(網路配接器)來的,像服務器、路由器等設備都是有 2 個以上的網卡,也就是它們會有 2 個以上的 IP 地址,32 位的 IPV4 地址最多給大約 43 億臺接入互聯網的設備配置其獨一無二的 IP 地址,

現在家家戶戶連入互聯網遠不止一臺電腦吧,再加上若干部手機、若干部平板......,如果這些設備都被分配了全球獨一無二的 IP 地址,43 億的 IP 地址容量顯然是不夠的,盡管我們采用了無分類 IP 地址(CIDR)的方法來級訓 IPV4 地址的消耗速度,但是互聯網的用戶增速是非常驚人的,所以 IPv4 地址依然有被耗盡的危險,

于是就誕生了一種可以更換 IP 地址的技術: NAT,使得可連接的計算機數能夠遠遠超過 43 億臺,

NAT(Network Address Translator 網路地址轉換):用于在本地網路中使用私有地址,在連接互聯網時使轉而使用全域 IP 地址的技術,雖然說 NAT 實際上是為正在面臨地址枯竭的 IPV4 而開發的技術,不過在 IPV6 中,為了提高網路安全也在使用 NAT,

NAT 的作業機制如下圖所示:

以 10.0.0.10 主機與 163.221.120.9 主機的通信為例,利用 NAT,途中的 NAT 路由器將發送源 IP 地址 10.0.0.10 轉化為全域唯一的 IP 地址 202.244.174.37 后,再發送資料,反過來,當資料包從地址 163.221.120.9 發送過來時,目標 IP 地址 202.244.174.37 先被轉換成私有 IP 地址 10.0.0.10 后,再被轉發,

很顯然,實作網路地址轉換的關鍵就在于 NAT 路由器,在 NAT 路由器的內部,有一張自動生成的用來轉換地址的表,當 10.0.0.10 主機向 163.221.120.9 主機發送第一個資料包的時候生成這張表,并按照表中的映射關系進行處理,

?? 現在很多互聯網服務都仍然基于 IPV4,如果這些服務不能放到 IPV6 中,那么 IPV6 網路環境的優勢也就無從談起了,為了解決這個問題,就產生了 NAT-PT 規范,NAT-PT 是將 IPV6 的首部轉換成 IPV4 首部的一種技術,這樣,那些只有 IPV6 地址的主機也能夠與 IPV4 地址的主機進行通信了,

6. 路由控制

?? 把路由控制放到最后面講的原因就是,大家對 IP 地址有了一個健全的認識之后,再來學習路由控制,會比較容易上手,

① 路由控制初探

路由控制 Routing 是指將 IP 資料報發送給最終目標地址的功能,即使網路非常復雜,也可以通過路由控制確定到達最終目的地的通路,一旦這個路由控制的運行出現例外,分組資料極有可能迷失方向,無法到達目標地址,

為了將資料包發送給目標主機,所有主機和路由器都維護著一張路由控制表(Routing Table),該表記錄著如下兩個欄位:

  • IP 地址

  • 如果想要到達這個 IP 地址,在當前路由器,資料包的下一步應該是發送到哪個路由器

在發送 IP 資料報時,首先要確定 IP 資料報首部中的目標地址,再從路由控制表中找到與該地址具有相同網路地址的記錄,根據該記錄將 IP 資料報轉發給相應的下一個路由器,如果路由控制表中存在多條相同網路地址的記錄,就選擇相同位數最多的網路地址,也就是最長匹配

用于進行路由控制的是IP 地址中的網路地址這一部分,?? 舉個例子:

  • 主機 A 要發送一個 IP 資料報,其源地址是 10.1.1.30 ,目標地址是 10.1.2.10,由于沒有在主機 A 的路由表找到與目標地址 10.1.2.10 的網路地址,于是把包被轉發到默認路由(路由器 1

  • 路由器 1 收到 IP 資料報后,也在路由器 1 的路由表匹配與目標地址相同的網路地址記錄,發現匹配到了,于是就把 IP 資料報轉發到了 10.1.0.2 這臺路由器 2

  • 路由器 2 收到后,同樣對比自身的路由表,發現匹配到了,于是把 IP 資料報從路由器 210.1.2.1 這個介面出去,最終經過交換機把 IP 資料報轉發到了目標主機

上面我們提到了默認路由,什么是默認路由呢?

  • 默認路由 Default Route 就是指路由表中任何一個地址都能與之匹配的記錄,如果一張路由表中包含所有的網路和子網資訊,將會造成無端的浪費,這時,默認路由就是一個不錯的選擇,默認路由一般標記為 0.0.0.0/0default

此外,我們還需要注意一個地址:環回地址,大家對于 localhost127.0.0.1 一定不陌生吧,沒錯,這就是環回地址,環回地址是同一臺計算機上的程式之間在進行網路通信時所使用的一個默認地址,當計算機使用這個特殊的 IP 地址或主機名時,資料包就不會流向網路

② 路由協議

路由控制表的形成有兩種方式:

  • 一種是管理員手動設定,也叫靜態路由控制

  • 另一種是路由器與其他路由器相互交換資訊時自動重繪,也叫動態路由控制

為了讓動態路由即時重繪路由控制表,在網路上互聯的路由器之間必須設定好某種協議,保證正常讀取路由控制資訊,這種協議就稱為路由協議

當然,隨著 IP 網路的發展,只使用一種協議對所有網路進行統一管理是不可能的,因此,人們根據路由控制的范圍將路由協議大致分為兩類:

  • 外部網關協議 EGP(包含 RIP、OSPF 等協議)

  • 內部網關協議 IGP(包含 BGP 等協議)

沒有 EGP 就不可能有世界上各個不同組織機構之間的通信,沒有 IGP 就不可能有機構內部的通信

路由協議其實又是一個重難點,不過在面試中鮮有人問津,大多出現在考試卷上,本文的拉鋸時間確實有點太久了,此處就不再詳細解釋,后續可能會單獨出一篇路由協議的文章(如果大家需要的話),

7. 總結

?? 這篇文章花費的時間長達十多個小時,很大一部分時間都花在理順整篇文章的邏輯上,讓別人懂和讓自己懂真的是天壤之別,OK,關于 IP 協議本身的重要內容至此就基本說完了,不過和 IP 協議相關的技術(比如 ICMP 網際報文控制協議,IGMP 網際組管理協議,DNS 域名決議協議,ARP 地址決議協議,DHCP 動態主機配置協議)還有很多,諸位任重而道遠,我們下期再見 ??

 

?? 關注公眾號 | 飛天小牛肉,即時獲取更新

  • 博主東南大學碩士在讀,利用課余時間運營一個公眾號『 飛天小牛肉 』,2020/12/29 日開通,專注分享計算機基礎(資料結構 + 演算法 + 計算機網路 + 資料庫 + 作業系統 + Linux)、Java 基礎和面試指南的相關原創技術好文,本公眾號的目的就是讓大家可以快速掌握重點知識,有的放矢,希望大家多多支持哦,和小牛肉一起成長 ??

  • 并推薦個人維護的開源教程類專案: CS-Wiki(Gitee 推薦專案,現已累計 1.5k+ star), 致力打造完善的后端知識體系,在技術的路上少走彎路,歡迎各位小伙伴前來交流學習 ~ ??

  • 如果各位小伙伴春招秋招沒有拿得出手的專案的話,可以參考我寫的一個專案「開源社區系統 Echo」Gitee 官方推薦專案,目前已累計 330+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供詳細的開發檔案和配套教程,公眾號后臺回復 Echo 可以獲取配套教程,目前尚在更新中,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265293.html

標籤:其他

上一篇:使paramiko庫執行命令時,在給定的時間強制退出

下一篇:Python Tkinter 視窗的管理與設定(三):視窗外形設定

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more