
系列文章目錄
文章目錄
- 系列文章目錄
- 前言
- 一、IP協議基本概念
- 二、IPv4首部
- 三、網路號和主機號
- 四、早期地址管理方式
- 五、CIDR(Classless Interdomain Routing)方式
- 六、特殊的IP地址
- 七、IP地址的數量限制
- 八、路由控制
- 總結
前言

一、IP協議基本概念

主機: 配有IP地址, 但是不進行路由控制的設備; 路由器: 即配有IP地址, 又能進行路由控制; 節點: 主機和路由器的統稱,
二、IPv4首部
4位首部長度 和TCP報頭中的4位首部長度一樣,代表的是IP報頭的長度是多少個4位元組,4位位元位能夠表示的最大數字是15,即IP頭部的最大長度是15*4 = 60位元組16位總長度 指的是IP資料報整體占多少個位元組,用總長度-報頭即為有效載荷,

- 4位版本號(version):
- 指定IP協議的版本, 對于IPv4來說, 就是4,
- 4位頭部長度(header length):
- IP頭部的長度是多少個32bit, 也就是 length * 4 的位元組數. 4bit表示最大的數字是15, 因此IP頭部最大長度是60位元組,
- 8位服務型別(Type Of Service):
- 3位優先權欄位(已經棄用), 4位TOS欄位, 和1位保留欄位(必須置為0). 4位TOS分別表示: 最小延時, 最大吞吐量, 最高可靠性, 最小成本. 這四者相互沖突, 只能選擇一個. 對于ssh/telnet這樣的應用程式, 最小延時比較重要; 對于ftp這樣的程式, 最大吞吐量比較重要,
- 16位總長度(total length):
- IP資料報整體占多少個位元組,
- 16位標識(id):
- 唯一的標識主機發送的報文. 如果IP報文在資料鏈路層被分片了, 那么每一個片里面的這個id都是相同的,
- 3位標志欄位:
- 第一位保留(保留的意思是現在不用, 但是還沒想好說不定以后要用到). 第二位置為1表示禁止分片, 這時候如果報文長度超過MTU, IP模塊就會丟棄報文. 第三位表示"更多分片", 如果分片了的話,最后一個分片置為1, 其他是0. 類似于一個結束標記,
-
第一位表示保留位,
第二位表示禁止分片,
第三位表示分片是否結束,
1:表示后面還有分片
0:表示后面沒有分片 - 13位分片偏移(framegament offset):
- 是分片相對于原始IP報文開始處的偏移. 其實就是在表示當前分片
在原報文中處在哪個位置. 實際偏移的位元組數是這個值 * 8 得到的. 因此, 除了最后一個報文之外, 其他報文的長度必須是8的整數倍(否則報文就不連續了), - 8位生存時間(Time To Live, TTL):
- 資料報到達目的地的最大報文跳數. 一般是64. 每次經過一個路由, TTL-= 1, 一直減到0還沒到達, 那么就丟棄了. 這個欄位主要是用來防止出現路由回圈,
- 8位協議:
- 表示上層協議的型別,
- 16位頭部校驗和:
- 使用CRC進行校驗, 來鑒別頭部是否損壞,
- 32位源地址和32位目標地址:
- 表示發送端和接收端
- 選項欄位(不定長, 最多40位元組):
ip協議用來表示一條資料所使用的是:(一條ip資料報)
16位總長度 + 16位標識 + 3位標志 + 13位片偏移,
16位總長度能夠標識的資料最大為65536Byte,如果傳輸層遞交給網路層ip協議的資料超過65536Byte,那應該如何做?
答案:是在網路層的ip協議進行分片傳輸,
那么,問題來了,TCP需要ip協議進行分片嗎?
解答:不需要進行分片,因為TCP協議在傳輸資料的時候,嚴格按照MSS進行傳輸,而MSS一定是小于MTU的,而一般網卡的MTU都是1500位元組,換句話說,TCP在每次傳輸資料的時候都是不會超過1500位元組的,因此,MSS是遠遠小于65536位元組的,因此也就不會觸發ip協議進行分片傳輸,
UDP需要ip協議進行分片嗎?
解答:有可能需要進行分片,因為UDP協議是沒有類似于MSS存在的,因此,UDP的資料的最大長度是65536位元組,網路層遞交給資料鏈路層大小必須小于MTU的,因此,一旦UDP遞交給網路層ip協議的資料加上ip協議報頭之后,總長度大于了當前主機的MTU大小時,就會需要進行分片傳輸,
注:因為UDP協議是不可靠的,在ip資料報轉發的時候,都有自己的路由轉發路徑,可能會造成丟失,
分片丟了會重發分片還是所有資料一起重發?

三、網路號和主機號
ip地址的分為兩個部分,網路號和主機號,
網路號:保證互相連接的兩個網段具有不同的標識,
主機號:同一網段內,主機之間具有相同的網路號,但是必須有不同的主機號,
- 不同的子網其實就是把網路號相同的主機放到一起,
- 如果在子網中新增一臺主機, 則這臺主機的網路號和這個子網的網路號一致, 但是主機號必須不能和子網中的其他主機重復,
ipv4版本的ip地址:本質是uint32_t,范圍是[0 , 232 - 1],
通過合理設定主機號和網路號, 就可以保證在相互連接的網路中, 每臺主機的IP地址都不相同,
四、早期地址管理方式
那么問題來了, 手動管理子網內的IP, 是一個相當麻煩的事情:
- 有一種技術叫做DHCP, 能夠自動的給子網內新增主機節點分配IP地址, 避免了手動管理IP的不便,
- 一般的路由器都帶有DHCP功能. 因此路由器也可以看做一個DHCP服務器,
過去曾經提出一種劃分網路號和主機號的方案, 把所有IP 地址分為五類, 如下圖所示(該圖出 自[TCPIP],
早期ip地址的劃分方式:A類、B類、C類、D類、E類,
A類:
B類:
C類:
五、CIDR(Classless Interdomain Routing)方式

隨著Internet的飛速發展,這種劃分方案的局限性很快顯現出來,大多陣列織都申請B類網路地址, 導致B類地址很快就分配完了, 而A類卻浪費了大量地址,
- 例如, 申請了一個B類地址, 理論上一個子網內能允許6萬5千多個主機. A類地址的子網內的主機數更多,
- 然而實際網路架設中, 不會存在一個子網內有這么多的情況. 因此大量的IP地址都被浪費掉了,
針對這種情況提出了新的劃分方案, 稱為CIDR(Classless Interdomain Routing),
- 引入一個額外的子網掩碼(subnet mask)來區分網路號和主機號,
- 子網掩碼也是一個32位的正整數. 通常用一串 “0” 來結尾,
- 將IP地址和子網掩碼進行 “按位與” 操作, 得到的結果就是網路號,
- 網路號和主機號的劃分與這個IP地址是A類、B類還是C類無關,
計算當前網路的網路號:
網路號 = ip 地址 & 子網掩碼
注意:這已經和之前的ABC類地址沒有關系了,這是新的劃分方式,
如何得到當前子網中的IP地址使用多少個位元位作為主機號?
解答:子網掩碼按位取反等于當前最大的主機號:
取反之后,有多少位元位為1,則表示當前子網當中的ip地址使用了多少個位元位當作是主機號,
- 例題:
- ip:172.16.99.129,子網掩碼:255.255.255.0
- 如果想要將該子網平均劃分為4個子網,則對應的子網掩碼是什么?
六、特殊的IP地址
- 在一個網段中都會有一個網路號的和廣播號,即 192.0.0.0 ~ 192.0.0.255
- 網路號:主機號全為0的ip地址,就為該網段中的網路號
- 廣播號:主機號中全為1的ip地址,就為該網段中的廣播號
- 127.0.0.1 :本地回環網卡地址(通常用來測驗自己機器的網路連通性)
- 0.0.0.0:代表本地所有的網卡地址
七、IP地址的數量限制
- 我們知道, IP地址(IPv4)是一個4位元組32位的正整數. 那么一共只有 2的32次方 個IP地址, 大概是43億左右. 而TCP/IP協議規定, 每個主機都需要有一個IP地址,這意味著, 一共只有43億臺主機能接入網路么?
- 實際上, 由于一些特殊的IP地址的存在, 數量遠不足43億; 另外IP地址并非是按照主機臺數來配置的, 而是每一個網卡都需要配置一個或多個IP地址,
- CIDR在一定程度上緩解了IP地址不夠用的問題(提高了利用率, 減少了浪費, 但是IP地址的絕對上限并沒有增加), 仍然不是很夠用. 這時候有三種方式來解決:
- 動態分配IP地址: 只給接入網路的設備分配IP地址. 因此同一個MAC地址的設備, 每次接入互聯網中, 得到的IP地址不一定是相同的,
- NAT技術(后面會重點介紹),
- IPv6: IPv6并不是IPv4的簡單升級版. 這是互不相干的兩個協議, 彼此并不兼容; IPv6用16位元組128位來表示一個IP地址; 但是目前IPv6還沒有普及,
八、路由控制

IP協議相當于OSI參考模型中的第3層——網路層,
IP網路層的主要作用是“實作終端節點之間的通信”,這種終端節點之間的通信也叫“點對點(end-to-end)通信”,
IP網路層的下一層——資料鏈路層的主要作用是在互連同一種資料鏈路的節點之間進行包傳遞,而一旦跨越多種資料鏈路,就需要借助網路層,網路層可以跨越不同的資料鏈路,即使是在不同的資料鏈路上也能實作兩端節點之間的資料包傳輸,
- 首先我們要知道路由器分為WAN和LAN口:
- WAN:連接上級路由器
- LAN:用來組裝當前路由器的子網
路由器LAN口連接的主機, 都從屬于當前這個路由器的子網中,
① 從運營商機房拉出的網線插在了家用路由器的WAN口上,
② 個人設備是插在家用路由器的LAN口上,
其次,我們需要知道網路資料的五元組資訊,
源ip、目的ip、源埠、目的埠、協議,
在路由設備中都會有一個路由表,路由表記錄了當前的路由項,用route命令查看:

那么路由器是如何進行網路轉發的呢?
首先用網路資料中的目的ip和路由項當中的子網掩碼進行按位與操作(需要注意的是,該目的ip先和非網關的路由項進行操作,最后再和網關路由項進行操作),
其次將按位與操作的結果和路由項的Destination進行對比
① 如果說沒有對比上,則代表該條資料不是往該子網當中進行轉發,
② 如果說對比上了,則代表該條資料是往該子網當中的某一個主機進行轉發的,
需要注意的是:
① 如果該條資料的目的ip是當前子網的某一主機,則不需要WAN的轉發,直接走路由器的LAN口
② 如果該條資料的目的ip是互聯網當中的某一個主機,則需要經過WAN口的轉發,傳輸到上級路由器再進行路由,
③ 路由表也是需要更新的,
路由的程序, 就是這樣一跳一跳(Hop by Hop) “問路” 的程序,所謂 “一跳” 就是資料鏈路層中的一個區間. 具體在以太網中指從源MAC地址到目的MAC地址之間的幀傳輸區間,
IP資料包的傳輸程序也和問路一樣,
當IP資料包, 到達路由器時, 路由器會先查看目的IP,
路由器決定這個資料包是能直接發送給目標主機, 還是需要發送給下一個路由器,
依次反復, 一直到達目標IP地址
總結
以上就是今天要講的內容,本文詳細介紹了網路層IP協議保證傳輸效率和可靠傳輸的方法,網路提供了大量的方法供我們使用,非常的便捷,我們務必掌握,希望大家多多支持!另外如果上述有任何問題,請懂哥指教,不過沒關系,主要是自己能堅持,更希望有一起學習的同學可以幫我指正,但是如果可以請溫柔一點跟我講,愛與和平是永遠的主題,愛各位了,加油啊!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293602.html
標籤:其他





























