網絡基礎 -- 網絡層(IP協議)

目錄

網絡層

IP協議

 IP報文格式(IPv4)

網段劃分(地址管理)

CIDR

特殊的IP地址

IP地址的數量限制

私有IP地址和公網IP地址

路由選擇

ICMP協議


網絡層

介於傳輸層和數據鏈路層之間, 它在數據鏈路層提供的兩個相鄰端點之間的數據幀的傳送功能上, 進一步管理網絡中的數據通信, 將數據設法從源端經過若干個中間節點傳送到目的端, 從而向運輸層提供最基本的端到端的數據傳送服務.

圖片來源於網絡

 

  • 基本概念 : 
  • 主機 : 配有IP地址, 但不能進行路由控制的設備;
  • 路由器 : 既配有IP地址, 又能進行路由控制;
  • 節點 : 主機和路由器的統稱

在網絡層中, 最重要的協議就是IP協議, 我們來看看IP協議.

IP協議

IP是Internet Protocol(網際互連協議)的縮寫,是TCP/IP體系中的網絡層協議. 設計IP的目的是提高網絡的可擴展性:一是解決互聯網問題,實現大規模、異構網絡的互聯互通;二是分割頂層網絡應用和底層網絡技術之間的耦合關係,以利於兩者的獨立發展。根據端到端的設計原則,IP只爲主機提供一種無連接、不可靠的、盡力而爲的數據報傳輸服務.

IP是整個TCP/IP協議族的核心,也是構成互聯網的基礎。IP位於TCP/IP模型的網絡層(相當於OSI模型的網絡層),對上可載送傳輸層各種協議的信息,例如TCP、UDP等;對下可將IP信息包放到鏈路層,通過以太網、令牌環網絡等各種技術來傳送。

 IP報文格式(IPv4)

          

4位版本協議(version) : 通信雙方的IP協議必須要達到一致, IPv4的版本就是4

4位首部長度(header length) : 定義了IP協議首部(報頭)的長度, 以4字節爲單位, IP報頭是不定長的, 首部長度範圍 [5, 15] 即 [20字節,  60字節]

8位服務類型(Type Of Service, TOS) : 3 位優先權字段(已經棄用), 4位TOS字段, 和一位保留字段(此位必須置0), 思維TOS分別表示 : 最小延遲, 最大吞吐量, 最高可靠性, 最小成本. 這四者相互衝突, 只能有一個置1. 對於ssh/telnet這樣的應用程序, 最小延時標膠重要, 對於ftp(文件傳輸協議)類型的程序, 最大吞吐量比較重要.

16位總長度 : IP數據報整體佔多少個字節(單位是字節), 16位能表示的最大數是 65535, 即65535字節, 即64k, 那麼TCP的數據肯定不能大於64k -20-20, 一個20是IP報頭最次小長度, 一個20是TCP報頭的最小長度;  UDP的數據肯定不能大於64K-20-8, 第一個20也是IP報頭的最短長度, 8是UDP報頭的長度. TCP會在傳輸層根據MSS(最大分段大小, Maxitum Segment Size)自動進行數據分段; UDP在傳輸層不會分段;  傳輸的IP報文還受到下層數據鏈路層的MTU(最大傳輸單元, Maximum Transfer Unit)的限制; 而TCP中的MSS就是根據數據鏈路層的MTU計算的. UDP在在傳輸層不會分段, 所以當UDP數據大小 大於 MTU 而小於64k 20-8 時, 數據就會在網絡層進行分片

16位(分片)標識 : 在進行數據分片重組的時候表示數據分片屬於那個完整的UDP報文, 具體來說,  IP在存儲器中維持一個計數器, 每產生一個 數據報, 計數器就加1, 並將此值賦給標識字段. 但這個標識並不是平常的序號,因爲IP是無連接, 不可靠服務, 數據報不存在按序接收的問題. 當數據報由於長度超過鏈路層的MTU而必須分片時, 這個標識字段的值就被複制到所有的數據報片的標識字段中, 等到對端重組的時候, 相同標識符的值的數據報就會被重新組裝成一個數據報.

3位(分片)標誌 : 高位未用,  中間位DF置1, 表示不能進行分片,置0纔可以進行分片操作. 最低位MF, 置1表示後面還有數據分片,MF=0表示這已經是最後一個數據分片了.

13位片偏移 : 標識一個分片在原始UDP報文中的位置, 以8字節爲單位, 例如將一個10001的UDP報文按256字節分片後, 第一片的數據報的片偏移就是0, 第二片數據報的片偏移就是256/8 = 32, 第三片就是512/8=64, 第四片就是768/8=96, 第四片並沒有256個字節, 如果分片前的數據不能夠被8整除, 那麼分片後的最後一個數據大小就是分片前的數據報大小除以8的餘數. 可以看到不管分片前的大小能不能被8整除, 片偏移永遠是8的整數倍.

8位TTL : 報文在網絡中的生存週期 -- 即跳數, 指的是能夠經過多少路由器, 每經過一個路由器就稱爲一跳, 該值就減1, 爲0時就被網絡丟棄掉, 8位TTL, 最大值爲2^8 - 1 = 255.

8位協議 : 標識傳輸層使用的是什麼協議, 用於數據分用

16位校驗和 : 二進制反碼求和, 用於校驗數據的一致性

32位源地址 / 32位目的地址 :用於標識源端/對端主機, 路由器就是根據對端主機IP地址進行路徑選擇的

選項字段(不定長, 最多40字節) : 基本很少用到


網絡層功能的實現, 就是地址管理與路由選擇, 

網段劃分(地址管理)

IP地址分爲兩個部分, 網絡號和主機號

  • 網絡號 : 保證相互連接的兩個網段具有不同的標識, 簡單來說就是標識網絡 (網段:一段範圍內的IP, 具體是網絡號相同的所有IP)
  • 主機號 : 同一網段內, 主機之間具有相同的網絡號, 但是必須有不同的主機號, 簡單來說就是標識同一網段下的不同主機.
  • 子網 : IP地址是以網絡號和主機號來表示網絡上的主機的, 只有在一個網絡號下的計算機之間才能“直接”互通, 不同網絡號的計算機要通過網關(Gateway)才能互通. 但這樣的劃分在大多數情況下顯得並不十分靈活. 爲此IP網絡還允許劃分成更小的網絡, 稱爲子網(Subnet).

通過合理的設置網絡號和主機號, 就可以保證在相互連接的網絡中, 每臺主機的IP地址都不同

那麼問題來了, 手動管理子網內的IP, 是一件不現實的事情, 該如何解決?

DHCP動態主機配置協議 : 首先, 這是一個應用層協議, 可以自動給子網內新增的主機節點分配IP地址.  一般的路由器都帶有DHCP功能, 因此路由器也可以看做是一個DHCP服務器.

在早期, 人們將所有的IP地址劃分爲5類, 要組建多大的局域網, 就選擇相應的網段, 然後給局域網內的主機分配相應的主機號, IP地址分類如下:

  • A類 : 高1位固定 + 7位網絡號 + 24位主機號. 範圍 : 0.0.0.0 ~ 127.255.255.255, 網段的選擇就是0 ~ 127, 最多容納2^24-2臺主機, 即16777214臺主機, 用於組建超大型的網絡
  • B類 : 高2位固定 + 14位網絡號 + 16位主機號 -- 128.0.0.0 ~ 191.255.255.255  網段的選擇就是128.0 ~ 191.255, 最多容納2^16-2臺主機, 即65534臺主機, 用於組建中型網絡
  • C類 : 高3位固定 + 21位網絡號 + 8位主機號 -- 192.0.0.0 ~ 223.255.255.255  網段的選擇就是192.0.0 ~ 223.255.255, 最多容納2^8-2臺主機, 即254臺主機, 用於組建小型網絡
  • D類 : 高4位固定 + 28位多播組號 -- 224.0.0.0 ~ 239.255.255.255
  • E類 : 高5位固定 + 27位留用 -- 240.0.0.0 ~ 247.255.255.255

隨着互聯網的飛速發展, 這種劃分方案的侷限性很快就顯現出來, 大多數組織都申請B類網絡地址, 導致B類地址很快就分配完了, 而A類卻浪費了大量地址. 這是因爲申請一個B類地址, 理論上一個子網內能允許6萬5千多個主機. A類地址的子網內的主機數更是達到數千萬之多, 然而實際網絡架設中, 不會存在一個子網內有這麼多主機的情況. 因此大量的A類IP地址都被浪費掉了.

CIDR

對於這種情況, 人們提出了新的劃分方案, 稱爲CIDR(Classless Interdomain Routing) :

  • 引入一個額外的子網掩碼(subnet mask)來區分網絡號和主機號(和IP地址一樣也用點分10進制來表示)
  • 子網掩碼也是一個32位的無符號整數. 通常用一串 "0" 來結尾, (所以說子網掩碼的二進制從高位到低位的1肯定是連續的)
  • 將IP地址和子網掩碼進行 按位與 操作, 得到的結果就是網絡號
  • 網絡號和主機號的劃分與這個IP地址是A類, B類還是C類無關

例子1 : IP : 140.252.20.68 子網掩碼 : 255.255.255.0   ==> 網絡號 : IP和子網掩碼按位與 :140.252.20.0

            ==> 子網地址範圍就是主機號的二進制從全0到全1, 140.252.20.0 ~ 140.252.20.255

例子2 : IP : 140.252.20.68 子網掩碼 : 255.255.255.240   ==> 網絡號 : IP和子網掩碼按位與 :140.252.20.64

            ==> 子網地址範圍就是主機號的二進制從全0到全1, 140.252.20.53 ~ 140.252.20.79

IP地址和子網掩碼還有一種更加簡潔的表示方法, 例如 : 140.252.20.68/24, 表示IP地址是140.252.20.68, 子網掩碼的搞24位全爲1, 也就是255.255.255.0

最大的主機號 + 1 就是局域網中主機的個數. 再看一個例子:

某公司網絡的網段是192.168.2.0/24, 現在公司想從這個網段中劃分出四個子網, 給公司的四個部門, 問, 每個子網的網絡號以及子網掩碼是多少, 以及每個子網中的IP地址範圍是多少?

首先, 這是一個C類網絡, 一個C類網絡可以有256個主機號, 分爲4個子網, 則每個子網的主機號個數就是64, 那每個子網中最大主機號就是64 - 1 = 63, 這個值就是子網掩碼取反後的值, 那子網掩碼就是63取反的值, 爲255.255.255.192

四個子網的子網掩碼是一樣的, 因爲其能分配的主機數都是一樣的, 這道題中子網掩碼爲255.255.255.192

第一個子網IP範圍 : 192.168.2.0 ~ 192.168.2.63  -- 網絡號 : 192.168.2.0

第一個子網IP範圍 : 192.168.2.64 ~ 192.168.2.127  -- 網絡號 : 192.168.2.64

第一個子網IP範圍 : 192.168.2.128 ~ 192.168.2.191  -- 網絡號 : 192.168.2.128

第一個子網IP範圍 : 192.168.2.192 ~ 192.168.2.255  -- 網絡號 : 192.168.2.192

特殊的IP地址

  • IP地址中的主機號全爲0, 就成了網絡號, 代表這個局域網
  • 將IP地址中的主機號的二進制全部設爲1, 就成爲了廣播地址, 用於給同一個鏈路中相互連接的所有主機發送數據包(此時目的地址當然就被設爲了廣播地址)
  • 127.0.0.1. 它代表設備的本地虛擬接口, 所以默認被看作是永遠不會宕掉的接口. 所以通常在安裝物理網卡前就可以ping通這個本地迴環地址. 一般都會用來檢查本地網絡協議、基本數據接口等是否正常的.
  • 0.0.0.0 標識本機上的所有網卡, 用與TCP服務端程序的綁定地址, 相當於監聽本機的所有網卡.

IP地址的數量限制

IP地址(IPv4)是一個4字節32位的正整數. 那麼一共只有 2的32次方 個IP地址, 大概是43億左右. 而TCP/IP協議規定, 每個主機都需要有一個IP地址. 這意味着, 一共只有43億臺主機能接入網絡麼?

實際上, 由於一些特殊的IP地址的存在, 數量遠不足43億; 另外IP地址並非是按照主機臺數來配置的, 而是每一個網卡
都需要配置一個或多個IP地址.CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率, 減少了浪費, 但是IP地址的絕對上限並沒有增加), 仍然不是很夠用. 這時候有三種方式來解決:

  • 動態分配IP地址 : 利用DHCP協議, 給接入網絡的設備動態分配IP地址. 因此同一個MAC地址的設備, 每次接入互聯網中, 得到的IP地址不一定是相同的
  • NAT技術(下面說)
  • IPv6: 在2019年11月26日15時35分, 位於荷蘭阿姆斯特丹的IP地址管理機構正式宣佈, 全球43億(具體是2^32)個 IPV4地址已經全部分配完畢, 但我們還有IPv6協議可以用, IPv6並不是IPv4的簡單升級版. 這是互不相干的兩個協議, 彼此並不兼容; IPv6用16字節128位來表示一個IP地址; 目前IPv6已經開始部署, 但還沒有完全普及.

私有IP地址和公網IP地址

私有IP地址 : 在局域網中使用的IP

公網IP地址 : 在互聯網中使用的地址

如果一個組織內部組建局域網,IP地址只用於局域網內的通信,而不直接連到互聯網上, 理論上 使用任意的IP地址都可以,但是RFC 1918規定了用於組建局域網的私有IP地址 : 

  • 10.* , 前8位是網絡號,共16777216個地址, 用於組建大型局域網
  • 172.16.到172.31.前12位是網絡號,共1048576個地址, 用於組建中型局域網
  • 192.168.*,前16位是網絡號,共65536個地址, 用於組建小型局域網.
  • 包含以上範圍中的, 都成爲私有IP, 其餘的則稱爲全局IP(或公網IP)
  • 一個路由器可以配置一個WAN口IP, 一個或多個LAN口IP(私有IP).
  • 路由器LAN口連接的主機, 都屬於當前這個路由器的子網中.
  • 不同的路由器, 子網IP其實都是一樣的(通常都是192.168.1.1). 子網內的主機IP地址不能重複. 但是子網之間的IP地址就可以重複了.
  • 每一個家用路由器, 其實又作爲運營商路由器的子網中的一個節點. 這樣的運營商路由器可能會有多級,最外層的運營商路由器, WAN口IP就是一個公網IP了(如下圖所示).
  • 子網內的主機需要和外網進行通信時, 路由器將IP首部中的IP地址進行替換(替換成WAN口IP), 這樣逐級替換, 最終數據包中的IP地址成爲一個公網IP. 這種技術稱爲NAT(Network Address Translation,網絡地址轉換).
  • 如果希望我們自己實現的服務器程序, 能夠在公網上被訪問到, 就需要把程序部署在一臺具有外網IP的服務器上. 可以購買雲服務器(比如阿里雲, 騰訊雲, 華爲雲等)


路由選擇

                     

路由選擇過程如下 :

  • 當 IP數據包到達路由器, 路由器會先查看目的地址
  • 通過判斷目的IP, 判定目的主機的所在網絡是否與自己相連
  • 若相連, 則直接發送給目標主機
  • 若不相連, 則發送給下一個路由器(下一個路由器就如上面圖中的上一級路由器)(這個過程中源IP地址會被替換爲路由器的WAN口地址)
  • 重複這個過程, 一直到達目的IP(或者TTL爲0時被丟棄)

具體如何判定當前這個數據報該發送到哪兒, 這就依靠每個節點(包括主機和路由器)內部都維護着一張路由表

  • 路由表可以使用route命令查看
  • 如果目的IP命中了路由表, 則直接轉發即可
  • 逐行判斷, 當判斷到最後一行(之前所有行都不匹配), 就按缺省路由條目規定的接口(default getway, 默認網關)發送到下一跳地址.(最後一行主要由下一跳地址和發送接口兩部分組成)

Linux中用route查看路由表 : 

  • Destination : 目的網段 (與我相連的網絡的網絡號)
  • Gatway : 網關(下一跳路由器入口的ip)
  • Getmask : 子網掩碼
  • Metric : 跳數, 該條路由記錄的質量, 一般情況下, 如果有多條到達相同目的地的路由記錄, 路由器會採用metric值小的那條路由 
  • Use Iface : 與這個網絡相連的網卡名稱

路由選擇具體過程 :

以上圖路由表爲例, 若有一個IP數據包到以上這個節點中(主機或路由器), 先將目的IP地址在路由表中逐行判斷, 首先與第一行的子網掩碼255.255.255.0相與, 只要目的地址與子網掩碼相與的結果是網絡號(網段)192.168.40.0, 就可以判斷出, 這個IP數據包的目的主機就是在自己局域網內的主機, 直接轉發就好.  如果相與後不是, 則再與第二行的子網掩碼相與, 相與的結果與第二行的網段(網絡號)比較看是否相等, 若相等, 這個IP數據包的目的主機是和這個節點相連網絡中的主機, 則使用連接這個網絡的網卡將其發送到這個網絡中, 若相與結果與網段不相等, 則繼續往下一行判斷, 重複以上過程, 若所有行都判斷完了, 還沒有匹配的, 這時候這個節點就會通過連接自己網關的網卡, 將這個IP數據包發送給自己的上層網關, 讓上層網關再去路由選擇.


ICMP協議

一個新搭建好的網絡,往往需要先進行一個簡單的測試,來驗證網絡是否暢通;但是IP協議並不提供可靠傳輸. 如果丟包了,IP協議並不能通知傳輸層是否丟包以及丟包的原因.  所以我們就需要一種協議來完網絡探測–ICMP協議。

ICMP協議的功能主要有:

  • 1. 確認IP包是否成功到達目標地址 
  • 2. 通知在發送過程中IP包被丟棄的原因 

簡單來說, 就是在網絡層向指定主機發送ICMP請求應答報文, 要求對方收到後進行回覆, 通過這種方式實現網絡探測(說白了就是針對IP地址的一種確認應答)

需要注意的是 : 

  • 1.ICMP是基於IP協議工作的,但是它並不是傳輸層的功能,因此仍然把它歸結爲網絡層協議 
  • 2. ICMP只能搭配IPv4使用,如果是IPv6的情況下, 需要是用ICMPv6

ICMP報文包含在IP數據報中,IP報頭在ICMP報文的最前面。一個ICMP報文包括IP報頭(至少20字節)、ICMP報頭(至少八字節)和ICMP報文(屬於ICMP報文的數據部分)。當IP報頭中的協議字段值爲1時,就說明這是一個ICMP報文

ping命令(在Windows和Linux下都有) 就是使用ICMP協議實現的, 不涉及到端口.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章