IP 基礎知識總結
點擊藍色“程序員cxuan?”關注我喲
加個“星標”,及時接收最新文章

更多文章見?
https://github.com/crisxuan/bestJavaer
本文預計閱讀 15?分鐘
IP 協(xié)議
路由器對分組進行轉發(fā)后,就會把數(shù)據(jù)包傳到網(wǎng)絡上,數(shù)據(jù)包最終是要傳遞到客戶端或者服務器上的,那么數(shù)據(jù)包怎么知道要發(fā)往哪里呢?起到關鍵作用的就是 IP 協(xié)議。
IP 主要分為三個部分,分別是?IP 尋址、路由和分包組包。下面我們主要圍繞這三點進行闡述。
IP 地址
既然一個數(shù)據(jù)包要在網(wǎng)絡上傳輸,那么肯定需要知道這個數(shù)據(jù)包到底發(fā)往哪里,也就是說需要一個目標地址信息,IP 地址就是連接網(wǎng)絡中的所有主機進行通信的目標地址,因此,在網(wǎng)絡上的每個主機都需要有自己的 IP 地址。

在 IP 數(shù)據(jù)報發(fā)送的鏈路中,有可能鏈路非常長,比如說由中國發(fā)往美國的一個數(shù)據(jù)報,由于網(wǎng)絡抖動等一些意外因素可能會導致數(shù)據(jù)報丟失,這時我們在這條鏈路中會放入一些?中轉站,一方面能夠確保數(shù)據(jù)報是否丟失,另一方面能夠控制數(shù)據(jù)報的轉發(fā),這個中轉站就是我們前面聊過的路由器,這個轉發(fā)過程就是?路由控制。
路由控制(Routing)?是指將分組數(shù)據(jù)發(fā)送到最終目標地址的功能,即使網(wǎng)絡復雜多變,也能夠通過路由控制到達目標地址。因此,一個數(shù)據(jù)報能否到達目標主機,關鍵就在于路由器的控制。
這里有一個名詞,就是?跳,因為在一條鏈路中可能會布滿很多路由器,路由器和路由器之間的數(shù)據(jù)報傳送就是跳,比如你和隔壁老王通信,中間就可能會經(jīng)過路由器 A-> 路由器 B -> 路由器 C 。
那么一跳的范圍有多大呢?
一跳是指從源 MAC 地址到目標 MAC 地址之間傳輸幀的區(qū)間,這里引出一個新的名詞,MAC 地址是啥?
MAC 地址指的就是計算機的物理地址(Physical Address),它是用來確認網(wǎng)絡設備位置的地址。在 OSI 網(wǎng)絡模型中,網(wǎng)絡層負責 IP 地址的定位,而數(shù)據(jù)鏈路層負責 MAC 地址的定位。MAC 地址用于在網(wǎng)絡中唯一標示一個網(wǎng)卡,一臺設備若有一或多個網(wǎng)卡,則每個網(wǎng)卡都需要并會有一個唯一的 MAC 地址,也就是說 MAC 地址和網(wǎng)卡是緊密聯(lián)系在一起的。
路由器的每一跳都需要詢問當前中轉的路由器,下一跳應該跳到哪里,從而跳轉到目標地址。而不是數(shù)據(jù)報剛開始發(fā)送后,網(wǎng)絡中所有的通路都會顯示出來,這種多次跳轉也叫做多跳路由。
IP 地址定義
現(xiàn)如今有兩個版本的 IP 地址,IPv4 和 IPv6,我們首先探討一下現(xiàn)如今還在廣泛使用的 IPv4 地址,后面再考慮 IPv6 。
IPv4 由 32 位正整數(shù)來表示,在計算機內部會轉化為二進制來處理,但是二進制不符合人類閱讀的習慣,所以我們根據(jù)易讀性的原則把 32 位的 IP 地址以 8 位為一組,分成四組,每組之間以?.?進行分割,再將每組轉換為十進制數(shù)。如下圖所示

那么上面這個 32 位的 IP 地址就會被轉換為十進制的 156.197.1.1。
除此之外,從圖中我們還可以得到如下信息
每個這樣 8 位位一組的數(shù)字,自然是非負數(shù),其取值范圍是 [0,255]。
IP 地址的總個數(shù)有 2^32 次冪個,這個數(shù)值算下來是?4294967296?,大概能允許 43 億臺設備連接到網(wǎng)絡。實際上真的如此嗎?
實際上 IP 不會以主機的個數(shù)來配置的,而是根據(jù)設備上的?網(wǎng)卡(NIC)?進行配置,每一塊網(wǎng)卡都會設置一個或者多個 IP 地址,而且通常一臺路由器會有至少兩塊網(wǎng)卡,所以可以設置兩個以上的 IP 地址,所以主機的數(shù)量遠遠達不到 43 億。

IP 地址構造和分類
IP 地址由?網(wǎng)絡標識?和?主機標識?兩部分組成,網(wǎng)絡標識代表著網(wǎng)絡地址,主機標識代表著主機地址。網(wǎng)絡標識在數(shù)據(jù)鏈路的每個段配置不同的值。網(wǎng)絡標識必須保證相互連接的每個段的地址都不重復。而相同段內相連的主機必須有相同的網(wǎng)絡地址。IP 地址的?主機標識?則不允許在同一網(wǎng)段內重復出現(xiàn)。
舉個例子來說:比如說我在石家莊(好像不用比如昂),我所在的小區(qū)的某一棟樓就相當于是網(wǎng)絡標識,某一棟樓的第幾戶就相當于是我的主機標識,當然如果你有整棟樓的話,那就當我沒說。你可以通過xx省xx市xx區(qū)xx路xx小區(qū)xx棟來定位我的網(wǎng)絡標識,這一棟的第幾戶就相當于是我的主機標識。
IP 地址分為四類,分別是?A類、B類、C類、D類、E類,它會根據(jù) IP 地址中的第 1 位到第 4 位的比特對網(wǎng)絡標識和主機標識進行分類。
A 類:(1.0.0.0 - 126.0.0.0)(默認子網(wǎng)掩碼:255.0.0.0 或 0xFF000000)第一個字節(jié)為網(wǎng)絡號,后三個字節(jié)為主機號。該類 IP 地址的最前面為 0 ,所以地址的網(wǎng)絡號取值于 1~126 之間。一般用于大型網(wǎng)絡。B 類:(128.0.0.0 - 191.255.0.0)(默認子網(wǎng)掩碼:255.255.0.0 或 0xFFFF0000)前兩個字節(jié)為網(wǎng)絡號,后兩個字節(jié)為主機號。該類 IP 地址的最前面為 10 ,所以地址的網(wǎng)絡號取值于 128~191 之間。一般用于中等規(guī)模網(wǎng)絡。C 類:(192.0.0.0 - 223.255.255.0)(子網(wǎng)掩碼:255.255.255.0 或 0xFFFFFF00)前三個字節(jié)為網(wǎng)絡號,最后一個字節(jié)為主機號。該類 IP 地址的最前面為 110 ,所以地址的網(wǎng)絡號取值于 192~223 之間。一般用于小型網(wǎng)絡。D 類:是多播地址。該類 IP 地址的最前面為 1110 ,所以地址的網(wǎng)絡號取值于 224~239 之間。一般用于多路廣播用戶。E 類:是保留地址。該類 IP 地址的最前面為 1111 ,所以地址的網(wǎng)絡號取值于 240~255 之間。
為了方便理解,我畫了一張 IP 地址分類圖,如下所示

根據(jù)不同的 IP 范圍,有下面不同的地總空間分類

子網(wǎng)掩碼
子網(wǎng)掩碼(subnet mask)?又叫做網(wǎng)絡掩碼,它是一種用來指明一個 IP 地址的哪些位標識的是主機所在的網(wǎng)絡。子網(wǎng)掩碼是一個 32位 地址,用于屏蔽 IP 地址的一部分以區(qū)別網(wǎng)絡標識和主機標識。
一個 IP 地址只要確定了其分類,也就確定了它的網(wǎng)絡標識和主機標識,由此,各個分類所表示的網(wǎng)絡標識范圍如下

用?1?表示 IP 網(wǎng)絡地址的比特范圍,0?表示 IP 主機地址的范圍。將他們用十進制表示,那么這三類的表示如下

保留地址
在IPv4 的幾類地址中,有幾個保留的地址空間不能在互聯(lián)網(wǎng)上使用。這些地址用于特殊目的,不能在局域網(wǎng)外部路由。

IP 協(xié)議版本
目前,全球 Internet 中共存有兩個IP版本:IP 版本 4(IPv4)和?IP 版本6(IPv6)。IP 地址由二進制值組成,可驅動 Internet 上所有數(shù)據(jù)的路由。IPv4 地址的長度為 32 位,而 IPv6 地址的長度為 128 位。
Internet IP 資源由?Internet 分配號碼機構(IANA)分配給區(qū)域 Internet 注冊表(RIR),例如 APNIC,該機構負責根 DNS ,IP 尋址和其他 Internet 協(xié)議資源。
下面我們就一起認識一下 IP 協(xié)議中非常重要的兩個版本 IPv4 和 IPv6。
IPv4
IPv4 的全稱是?Internet Protocol version 4,是 Internet 協(xié)議的第四版。IPv4 是一種無連接的協(xié)議,這個協(xié)議會盡最大努力交付數(shù)據(jù)包,也就是說它不能保證任何數(shù)據(jù)包能到達目的地,也不能保證所有的數(shù)據(jù)包都會按照正確的順序到達目標主機,這些都是由上層比如傳輸控制協(xié)議控制的。也就是說,單從 IP 看來,這是一個不可靠的協(xié)議。
前面我們講過網(wǎng)絡層分組被稱為?
數(shù)據(jù)報,所以我們接下來的敘述也會圍繞著數(shù)據(jù)報展開。
IPv4 的數(shù)據(jù)報格式如下

IPv4 數(shù)據(jù)報中的關鍵字及其解釋
版本字段(Version)占用 4 bit,通信雙方使用的版本必須一致,對于 IPv4 版本來說,字段值是 4。首部長度(Internet Header Length)?占用 4 bit,首部長度說明首部有多少 32 位(4 字節(jié))。由于 IPv4 首部可能包含不確定的選項,因此這個字段被用來確定數(shù)據(jù)的偏移量。大多數(shù) IP 不包含這個選項,所以一般首部長度設置為 5, 數(shù)據(jù)報為 20 字節(jié) 。服務類型(Differential Services Codepoint,DSCP)?占用 6 bit,以便使用不同的 IP 數(shù)據(jù)報,比如一些低時延、高吞吐量和可靠性的數(shù)據(jù)報。服務類型如下表所示

擁塞通告(Explicit Congestion Notification,ECN)?占用 2 bit,它允許在不丟棄報文的同時通知對方網(wǎng)絡擁塞的發(fā)生。ECN 是一種可選的功能,僅當兩端都支持并希望使用,且底層網(wǎng)絡支持時才被使用。最開始 DSCP 和 ECN 統(tǒng)稱為 TOS,也就是區(qū)分服務,但是后來被細化為了 DSCP 和 ECN。數(shù)據(jù)報長度(Total Length)?占用 16 bit,這 16 位是包括在數(shù)據(jù)在內的總長度,理論上數(shù)據(jù)報的總長度為 2 的 16 次冪 - 1,最大長度是 65535 字節(jié),但是實際上數(shù)據(jù)報很少有超過 1500 字節(jié)的。IP 規(guī)定所有主機都必須支持最小 576 字節(jié)的報文,但大多數(shù)現(xiàn)代主機支持更大的報文。當下層的數(shù)據(jù)鏈路協(xié)議的最大傳輸單元(MTU)字段的值小于 IP 報文長度時,報文就必須被分片。標識符(Identification)?占用 16 bit,這個字段用來標識所有的分片,因為分片不一定會按序到達,所以到達目標主機的所有分片會進行重組,每產(chǎn)生一個數(shù)據(jù)報,計數(shù)器加1,并賦值給此字段。標志(Flags)?占用 3 bit,標志用于控制和識別分片,這 3 位分別是0 位:保留,必須為0;
1 位:
禁止分片(Don’t Fragment,DF),當 DF = 0 時才允許分片;2 位:
更多分片(More Fragment,MF),MF = 1 代表后面還有分片,MF = 0 代表已經(jīng)是最后一個分片。如果 DF 標志被設置為 1 ,但是路由要求必須進行分片,那么這條數(shù)據(jù)報回丟棄
分片偏移(Fragment Offset)?占用 13 位,它指明了每個分片相對于原始報文開頭的偏移量,以 8 字節(jié)作單位。存活時間(Time To Live,TTL)?占用 8 位,存活時間避免報文在互聯(lián)網(wǎng)中迷失,比如陷入路由環(huán)路。存活時間以秒為單位,但小于一秒的時間均向上取整到一秒。在現(xiàn)實中,這實際上成了一個跳數(shù)計數(shù)器:報文經(jīng)過的每個路由器都將此字段減 1,當此字段等于 0 時,報文不再向下一跳傳送并被丟棄,這個字段最大值是 255。協(xié)議(Protocol)?占用 8 位,這個字段定義了報文數(shù)據(jù)區(qū)使用的協(xié)議。協(xié)議內容可以在 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml 官網(wǎng)上獲取。首部校驗和(Header Checksum)?占用 16 位,首部校驗和會對字段進行糾錯檢查,在每一跳中,路由器都要重新計算出的首部檢驗和并與此字段進行比對,如果不一致,此報文將會被丟棄。源地址(Source address)?占用 32 位,它是 IPv4 地址的構成條件,源地址指的是數(shù)據(jù)報的發(fā)送方目的地址(Destination address)占用 32 位,它是 IPv4 地址的構成條件,目標地址指的是數(shù)據(jù)報的接收方選項(Options)?是附加字段,選項字段占用 1 - 40 個字節(jié)不等,一般會跟在目的地址之后。如果首部長度 > 5,就應該考慮選項字段。數(shù)據(jù)?不是首部的一部分,因此并不被包含在首部檢驗和中。
在 IP 發(fā)送的過程中,每個數(shù)據(jù)報的大小是不同的,每個鏈路層協(xié)議能承載的網(wǎng)絡層分組也不一樣,有的協(xié)議能夠承載大數(shù)據(jù)報,有的卻只能承載很小的數(shù)據(jù)報,不同的鏈路層能夠承載的數(shù)據(jù)報大小如下。

IPv4 分片
一個鏈路層幀能承載的最大數(shù)據(jù)量叫做最大傳輸單元(Maximum Transmission Unit, MTU),每個 IP 數(shù)據(jù)報封裝在鏈路層幀中從一臺路由器傳到下一臺路由器。因為每個鏈路層所支持的最大 MTU 不一樣,當數(shù)據(jù)報的大小超過 MTU 后,會在鏈路層進行分片,每個數(shù)據(jù)報會在鏈路層單獨封裝,每個較小的片都被稱為?片(fragement)。

每個片在到達目的地后會進行重組,準確的來說是在運輸層之前會進行重組,TCP 和 UDP 都會希望發(fā)送完整的、未分片的報文,出于性能的原因,分片重組不會在路由器中進行,而是會在目標主機中進行重組。
當目標主機收到從發(fā)送端發(fā)送過來的數(shù)據(jù)報后,它需要確定這些數(shù)據(jù)報中的分片是否是由源數(shù)據(jù)報分片傳遞過來的,如果是的話,還需要確定何時收到了分片中的最后一片,并且這些片會如何拼接一起成為數(shù)據(jù)報。
針對這些潛在的問題,IPv4 設計者將?標識、標志和片偏移放在 IP 數(shù)據(jù)報首部中。當生成一個數(shù)據(jù)報時,發(fā)送主機會為該數(shù)據(jù)報設置源和目的地址的同時貼上標識號。發(fā)送主機通常將它發(fā)送的每個數(shù)據(jù)報的標識 + 1。當某路由器需要對一個數(shù)據(jù)報分片時,形成的每個數(shù)據(jù)報具有初始數(shù)據(jù)報的源地址、目標地址和標識號。當目的地從同一發(fā)送主機收到一系列數(shù)據(jù)報時,它能夠檢查數(shù)據(jù)報的標識號以確定哪些數(shù)據(jù)是由源數(shù)據(jù)報發(fā)送過來的。由于 IP 是一種不可靠的服務,分片可能會在網(wǎng)路中丟失,鑒于這種情況,通常會把分片的最后一個比特設置為 0 ,其他分片設置為 1,同時使用偏移字段指定分片應該在數(shù)據(jù)報的哪個位置。
IPv4 尋址
IPv4 支持三種不同類型的尋址模式,分別是
單播尋址模式:在這種模式下,數(shù)據(jù)只發(fā)送到一個目的地的主機。

廣播尋址模式:在此模式下,數(shù)據(jù)包將被尋址到網(wǎng)段中的所有主機。這里客戶端發(fā)送一個數(shù)據(jù)包,由所有服務器接收:

組播尋址模式:此模式是前兩種模式的混合,即發(fā)送的數(shù)據(jù)包既不指向單個主機也不指定段上的所有主機

IPv6
隨著端系統(tǒng)接入的越來越多,IPv4 已經(jīng)無法滿足分配了,所以,IPv6 應運而生,IPv6 就是為了解決 IPv4 的地址耗盡問題而被標準化的網(wǎng)際協(xié)議。IPv4 的地址長度為 4 個 8 字節(jié),即 32 比特, 而 IPv6 的地址長度是原來的四倍,也就是 128 比特,一般寫成 8 個 16 位字節(jié)。
從 IPv4 切換到 IPv6 及其耗時,需要將網(wǎng)絡中所有的主機和路由器的 IP 地址進行設置,在互聯(lián)網(wǎng)不斷普及的今天,替換所有的 IP 是一個工作量及其龐大的任務。我們后面會說。
我們先來看一下 IPv6 的地址是怎樣的

版本與 IPv4 一樣,版本號由 4 bit 構成,IPv6 版本號的值為 6。流量類型(Traffic Class)?占用 8 bit,它就相當于 IPv4 中的服務類型(Type Of Service)。流標簽(Flow Label)?占用 20 bit,這 20 比特用于標識一條數(shù)據(jù)報的流,能夠對一條流中的某些數(shù)據(jù)報給出優(yōu)先權,或者它能夠用來對來自某些應用的數(shù)據(jù)報給出更高的優(yōu)先權,只有流標簽、源地址和目標地址一致時,才會被認為是一個流。有效載荷長度(Payload Length)?占用 16 bit,這 16 比特值作為一個無符號整數(shù),它給出了在 IPv6 數(shù)據(jù)報中跟在鼎昌 40 字節(jié)數(shù)據(jù)報首部后面的字節(jié)數(shù)量。下一個首部(Next Header)?占用 8 bit,它用于標識數(shù)據(jù)報中的內容需要交付給哪個協(xié)議,是 TCP 協(xié)議還是 UDP 協(xié)議。跳限制(Hop Limit)?占用 8 bit,這個字段與 IPv4 的 TTL 意思相同。數(shù)據(jù)每經(jīng)過一次路由就會減 1,減到 0 則會丟棄數(shù)據(jù)。源地址(Source Address)?占用 128 bit (8 個 16 位 ),表示發(fā)送端的 IP 地址。目標地址(Destination Address)?占用 128 bit (8 個 16 位 ),表示接收端 IP 地址。
可以看到,相較于 IPv4 ,IPv6 取消了下面幾個字段
標識符、標志和比特偏移:IPv6 不允許在中間路由器上進行分片和重新組裝。這種操作只能在端系統(tǒng)上進行,IPv6 將這個功能放在端系統(tǒng)中,加快了網(wǎng)絡中的轉發(fā)速度。
首部校驗和:因為在運輸層和數(shù)據(jù)鏈路執(zhí)行了報文段完整性校驗工作,IP 設計者大概覺得在網(wǎng)絡層中有首部校驗和比較多余,所以去掉了。IP 更多專注的是快速處理分組數(shù)據(jù)。
選項字段:選項字段不再是標準 IP 首部的一部分了,但是它并沒有消失,而是可能出現(xiàn)在 IPv6 的擴展首部,也就是下一個首部中。
IPv6 擴展首部
IPv6 首部長度固定,無法將選項字段加入其中,取而代之的是 IPv6 使用了擴展首部
擴展首部通常介于 IPv6 首部與 TCP/UDP 首部之間,在 IPv4 中可選長度固定為?40 字節(jié),在 IPv6 中沒有這樣的限制。IPv6 的擴展首部可以是任意長度。擴展首部中還可以包含擴展首部協(xié)議和下一個擴展字段。
IPv6 首部中沒有標識和標志字段,對 IP 進行分片時,需要使用到擴展首部。

具體的擴展首部表如下所示

下面我們來看一下 IPv6 都有哪些特點
IPv6 特點
IPv6 的特點在 IPv4 中得以實現(xiàn),但是即便實現(xiàn)了 IPv4 的操作系統(tǒng),也未必實現(xiàn)了 IPv4 的所有功能。而 IPv6 卻將這些功能大眾化了,也就表明這些功能在 IPv6 已經(jīng)進行了實現(xiàn),這些功能主要有
地址空間變得更大:這是 IPv6 最主要的一個特點,即支持更大的地址空間。
精簡報文結構: IPv6 要比 IPv4 精簡很多,IPv4 的報文長度不固定,而且有一個不斷變化的選項字段;IPv6 報文段固定,并且將選項字段,分片的字段移到了 IPv6 擴展頭中,這就極大的精簡了 IPv6 的報文結構。
實現(xiàn)了自動配置:IPv6 支持其主機設備的狀態(tài)和無狀態(tài)自動配置模式。這樣,沒有?
DHCP 服務器不會停止跨段通信。層次化的網(wǎng)絡結構:IPv6 不再像 IPv4 一樣按照 A、B、C等分類來劃分地址,而是通過 IANA -> RIR -> ISP 這樣的順序來分配的。IANA 是國際互聯(lián)網(wǎng)號碼分配機構,RIR 是區(qū)域互聯(lián)網(wǎng)注冊管理機構,ISP 是一些運營商(例如電信、移動、聯(lián)通)。
IPSec:IPv6 的擴展報頭中有一個認證報頭、封裝安全凈載報頭,這兩個報頭是 IPsec 定義的。通過這兩個報頭網(wǎng)絡層自己就可以實現(xiàn)端到端的安全,而無需像 IPv4 協(xié)議一樣需要其他協(xié)議的幫助。
支持任播:IPv6 引入了一種新的尋址方式,稱為任播尋址。
IPv6 地址
我們知道,IPv6 地址長度為 128 位,他所能表示的范圍是 2 ^ 128 次冪,這個數(shù)字非常龐大,幾乎涵蓋了你能想到的所有主機和路由器,那么 IPv6 該如何表示呢?
一般我們將 128 比特的 IP 地址以每 16 比特為一組,并用?:?號進行分隔,如果出現(xiàn)連續(xù)的 0 時還可以將 0 省略,并用?::?兩個冒號隔開,記住,一個 IP 地址只允許出現(xiàn)一次兩個連續(xù)的冒號。
下面是一些 IPv6 地址的示例
二進制數(shù)表示

用十六進制數(shù)表示

出現(xiàn)兩個冒號的情況

如上圖所示,A120 和 4CD 中間的 0 被 :: 所替換了。
總結
這篇文章我們主要介紹了 IP 地址等相關內容,也為你引出了 IPv4 和 IPv6 的報文構造和基本特征。
如果你覺得本文還不錯的話,歡迎點贊、在看、分享、留言!
我是 cxuan,我們下篇文章見!
完
?往期推薦?
?
閱片無數(shù)的 cxuan 給你推薦比某 hub 更爽的網(wǎng)站
另外,cxuan 肝了六本 PDF,公號回復 cxuan ,領取全部。

