【Linux】IP協議

我們知道互聯網是將一個一個的計算機連接起來的龐大的系統,由於計算機很多所以,互聯網也很複雜,那麼怎樣在複雜的網絡中找到一個合適的路徑呢?
這裏寫圖片描述
如上圖所示,就是在複雜的互聯網中找合適路徑的過程。
先來介紹幾個基本概念:
主機:配有IP地址,但是不進行路由控制的設備;
路由器:既配有IP地址,又能進行路由控制;
節點:主機和路由器的統稱
來看一下·IP協議報頭的結構:
這裏寫圖片描述
下面對報頭信息字段進行解釋:
(1)4位版本號:指定IP協議的版本,對於IPV4來說就是4
(2)4位報頭長度:IP報頭的長度是多少個32bit,也就是length*4的字節數,4bit表示最大的數字是15,因此IP報頭最大長度是60字節
(3)8位服務類型:3位優先權字段(已經棄用),4位TOS字段和1位保留字段(必須置爲0)4位TOS分別表示:最小延時,最大吞吐量,最高可靠性,最小成本,這四者相互衝突,只能選擇一個。對於ssh/telnet這樣的應用程序,最小延時比較重要;對於ftp這樣的程序,最大吞吐量比較重要。
(4)16位總長度:IP數據報整體佔多少個字節
(5)16位標識:唯一的標識主機發送的報文。如果IP報文在數據鏈路層被分片了,那麼每一個片裏面的這個id都是相同的
(6)3位標誌字段:第一位保留(保留的意思是現在不用,但是沒想好說不定以後要用到),第二位置爲1表示禁止分片,這時候如果報文長度超過MTU,IP模塊就會丟棄報文,第三位表示“更多分片”,如果分片了的話,最後一個分片置爲1,其他是0,類似於一個結束標記
(7)13爲分片偏移:是分片相對於原始IP報文開始處的偏移,其實就是在表示當前分片在原報文中處在哪個位置,實際偏移的字節數是這個值乘八得到的。因此,除了最後一個報文外,其它報文的長度必須是8的整數倍(否則報文就不連續了)
(8)8位生存時間:數據報到達目的地的最大報文跳數。一般是64,每次經過一個路由,TTL-=1,一直減到0還沒到達,那麼就丟棄了,這個字段主要是用來防止出現路由循環
(9)路由協議:表示上層協議的類型
(10)16位頭部校驗和:使用CRC進行校驗,來鑑別頭部是否損壞
(11)32位源地址和32位目的地址:表示發送端和接收端
(12)選項字段:不定長,最多40字節,包含各種選項
網段劃分:
IP地址分爲兩個部分:網絡號和主機號
(1)網絡號:保證相互連接的兩個網段具有不同的標識
(2)主機號:同一網段內,主機之間具有相同的網絡號,但是必須有不同的主機號
這裏寫圖片描述
(1)不同子網其實就是把網絡號相同的主機放在一起
(2)如果在子網中新增一臺主機,則這臺主機的網絡號和這個子網的網絡號一致,但是主機號必須不能和子網中的其他主機重複
(3)通過合理設置主機號和子網號,就可以保證在不相同相互連接的網絡中,每臺主機的IP地址都不相同
針對那麼多子網和主機,手動管理子網內的IP,是一件相當麻煩的事情。
(1)有一種技術叫做DHCP,能夠自動的給子網內新增主機節點分配IP地址,避免了手動管理IP的不便
(2)一般的路由器都帶有DHCP功能,因此路由器也可以看做一個DHCP服務器
現在已知的一種劃分網絡號和主機號的方案,把所有IP地址分爲五類,如下圖所示
這裏寫圖片描述
各類地址的IP範圍:
A類:0.0.0.0-127.255.255.255
B類:128.0.0.0-191.255.255.255
C類:192.0.0.0-223.255.255.255
D類:224.0.0.0-239.255.255.255
E類:240.0.0.0-247.255.255.255
隨着Intenet的飛速發展這種劃分方案的侷限性很快顯現出來,大多數組織都申請B類網絡地址,導致B類地址很快被分配完了,而A類浪費了大量地址
例如:申請了一個B類地址,理論上一個子網內能允許6萬5千多個主機,A類地址的子網中的主機更多
然而實際網絡中,不會存在一個子網中有這麼多的情況,因此大量的IP地址都被浪費掉了。
針對這種情況提出了新的劃分方案,稱爲CIDR
(1)引入一個額外的子網掩碼來區分網絡號和主機號
(2)子網掩碼也是一個32位的正整數,通常用一串“0”結尾
(3)將IP地址和子網掩碼進行“按位與”操作,得到的結果就是網絡號
(4)網絡號和主機號的劃分與這個IP地址是A類、B類還是C類無關
下面舉兩個例子:
例子1:
這裏寫圖片描述
例子2:
這裏寫圖片描述
由上面兩個例子可以看出,IP地址與子網掩碼作與運算可以得到網絡號,主機號從全0到全1就是子網的地址範圍
補充:IP地址和子網掩碼還有一種更簡潔的表示辦法:例如140.252.20.68/24,表示IP地址位140.252.20.68,子網掩碼的前24位是1也就是255.255.255.0
特殊的IP地址
(1)將IP地址中的主機地址全部設爲0,就成了網絡號,代表整個局域網;
(2)將IP地址中的主機地址全部設爲1,就成了廣播地址,用於給同一個鏈路中相互連接的所有主機發送數據包
(3)127.*的IP地址用於本機環回測試,通常是127.0.0.1
loopback設備:
這裏寫圖片描述
IP地址的數量限制:
我們知道,IP地址(IPV4)是一個4字節32位的正整數,那麼一共只有2的32次方個IP地址,大概是43億左右,而TCP/IP協議規定,每個主機都需要有一個IP地址
實際上,由於一些特殊的IP地址的存在,數量遠不足43億,另外IP地址並非是按照主機臺數來配置的,而是每一個網卡都需要配置一個或者多個IP地址
CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率,減少了浪費,但是IP地址的絕對上限並沒有增加),仍然不是很夠用,這時候有三種方式來解決:
(1)動態分配IP地址:只給接入網絡的設備分配IP地址,因此同一個MAC地址的設備,每次接入互聯網中,得到的IP地址不一定是相同的
(2)NAT技術
(3)IPV6:IPV6並不是IPV4的簡單升級版,這是互不相干的兩個協議,彼此並不兼容;IPV6用16字節128位來表示一個IP地址,但是目前IPV6還沒有普及

私有IP地址和公網IP地址介紹:
如果一個組織內部組建局域網,IP地址只用於局域網內的通信,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC1918規定了用於組建局域網的私有IP地址
(1)10.*,前八位是網絡號,共16,777,216個地址
(2)172.16到172.31.,前12位是網絡號,共1 048 576個地址
(3)192.168.*,前16位是網絡號,共65536個地址,包含在這個範圍中的,都成爲私有IP,其餘的則稱爲全局IP(或公網IP)

這裏寫圖片描述
(1)一個路由器可以配置兩個IP地址,一個是WAN口IP,一個是LAN口IP(子網IP)
(2)路由器LAN口連接的主機,都從屬於當前這個路由器的子網中
(3)不同的路由器,子網IP其實都是一樣的(通常都是192.168.1.1),子網中的IP地址不能重複但是,子網之間的IP地址就可以重複了
(4)每一個家用路由器,其實又作爲運營商路由器的子網中的一個節點,這樣的運營商路由器可能會有很多級,最外層的運營商路由器,WAN口IP就是一個公網IP了
(5)子網內的主機需要和外網進行通信時,路由器將IP首部中的IP地址進行替換(替換成WAN口IP),這樣逐級替換,最終數據包中的IP地址成爲一個公網IP,這種技術稱爲NAT
(6)如果希望我們自己實現的服務器程序,能夠在公網上被訪問到,就需要把程序部署在一臺具有外網IP的服務器上,這樣的服務器可以再阿里雲/騰訊雲上購買

路由:在複雜的網絡結構中,找出一條通向終點的路線
路由的過程就是這樣一跳一跳問路的過程所謂一跳就是數據鏈路層中的一個區間,具體在以太網中指從源MAC地址到目的MAC地址之間的幀傳輸區間
這裏寫圖片描述

IP數據包的傳輸過程也和問路一樣:
(1)當IP數據包,到達路由器時,路由器會先查看目的IP
(2)路由器決定這個數據包是能直接發送給目標主機,還是需要發送給下一個路由器
(3)依次反覆,一直到達目的IP地址

如何判定這個數據包發送到哪裏呢?這個就要依靠每個節點內部維護一個路由表
這裏寫圖片描述

(1)路由表可以使用route命令查看
(2)如果目的IP命中了路由表,就直接轉發即可
(3)路由表中的最後一行,主要由下一跳地址和發送接口兩部分組成,當目的地址與路由表中其他行都不匹配時,就按缺省路由條目規定的接口發送到下一跳地址
假設某主機上的路由表如圖所示:
這裏寫圖片描述

(1)這臺主機有兩個網路接口,一個網絡接口連到192.168.10.0/24網絡,另一個網絡接口連到192.168.56.0/24網絡
(2)路由表的Destination是目的網絡地址,Genmask是子網掩碼,Gateway是下一跳的地址,Iface是發送接口,Flags中的U標誌表示此條目有效(可以禁用某些條目),G標誌表示此條目的下一跳地址是某個路由器的地址,沒有G標誌的條目表示目的網絡是與本機接口直接相連的網絡不必經由路由器轉發

轉發過程例1:如果要發送的數據包的目的地址是192.168.56.3
(1)跟第一行的子網掩碼作與運算得到192.168.56.0,與第一行的目的網絡地址不符
(2)再跟第二行的子網掩碼作與運算得到192.168.56.0,正是第二行的目的網絡地址,因此從eth1接口發送出去
(3)由於192.168.56.0/24正是與eth1接口直接相連的網絡,因此可以直接發到目的主機,不需要經路由器轉發

轉發過程例2:如果要發送數據包的目的地址是202.10.1.2
(1)依次和路由表前幾項進行對比,發現都不匹配
(2)按缺省路由條目,從eth0接口發送出去,發往192.168.10.1路由器
(3)由192.168.10.1路由器根據它的路由表決定下一跳地址

發佈了108 篇原創文章 · 獲贊 134 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章