在TCP/IP協議族中,兩大重要協議就是傳輸層的TCP協議和網絡層的IP協議。本文主要講網絡層的IP協議以及其餘相關協議。git
IP協議做爲TCP/IP協議中最重要協議之一,理解和掌握IP協議相關知識點,在實際項目工做中,能起到指導性做用。github
分類地址即將32位IP地址劃分紅兩個固定長度的塊,每一個塊表明不一樣的含義。其中一個稱爲網絡地址,用來標明主機所接入的網絡,該網絡地址在全球惟一的;另外一個稱爲主機號,標識接入前面網絡地址的主機。從這種兩級的IP地址結構能夠看出,IP地址在互聯網上都是惟一的。常見的分類地址就是A類、B類、C類。算法
在B類地址中,網絡號佔16位,即兩個字節,前兩位固定,那麼可分配的網絡號數爲214(由於網絡號後面14位不管如何取值,都不會出現全零和全1的情況,因此不須要減2。但實際上128.0.0.0網絡地址是不指派的,因此網絡地址總數應該是214-1。那麼主機號數共216-2。緩存
C類地址與B類地址相似,因此網絡地址總數爲224-1,主機數爲28-2。網絡
D類地址經常使用於多播,即一對多通訊。post
經過IP數據報的格式能夠知道IP數據報具備什麼功能。 性能
版本:長度共4位,指定IP協議的版本,例如IPv4(版本號爲4)和IPv6(版本號爲6),通訊雙方使用的IP協議版本必須一致。測試
首部長度:長度共4位,由於首部存在可變部分,因此首部長度=固定部分(20字節)+可變部分長度。由於固定部分長度20個字節,全部首部長度最小值爲5(由於首部長度字段 所表示數的單位是32位字長,即4個字節。20個字節等於數5,即0101)。當首部長度4位爲最大值全爲1時,即十進制的15,那麼能夠表示首都最大長度爲60字節。當首部長度不是4個字節的整數倍時,須要用填充字段進行填充。this
區分服務:用來得到更好的服務,通常狀況下不使用。3d
總長度:長度爲16位,單位爲字節,表示整個數據報的長度,即總長度=首部長度+數據部分長度。總長度最大值爲216-1=65535個字節。
標識:長度共16位,IP軟件在存儲器維持一個計時器,每發送一個數據,計時器就增1,並將該值賦值給 標誌 字段。標誌字段主要爲了IP數據報在須要分片時,會複製到每一個數據片的標誌字段,各個數據片在接收後可以正確組裝成原來的數據報。
標誌:共3位,目前只有兩位有意義。最低位記爲「MF」,即MF=1表示後面還有分片,MF=0,後面沒有分片。中間位記爲「DF」,即DF=1不容許分片。DF=0容許分片。
片偏移:共13位,單位爲8字節。較長的IP數據報進行分片後,片偏移表示該分片距離原數據報起始位置的偏移量。爲分片從新組裝成數據報提供有力保證。
生存時間:共8位,該數據報在網絡的壽命,經常使用TTL表示。表示該數據報在網絡可以轉發多少次,一個路由器轉發一次,該值就減1,直到爲0就丟失該數據報。因此,最多能夠轉發255次。
協議:共8位,指出該數據報攜帶的數據攜帶何種數據,以讓目的主機IP層知道如何將數據部分上交給什麼協議處理。例如TCP、UDP協議。經常使用的協議和對應協議字段的值:
首部檢驗和:共16位,只校對首部,不校對數據。在發送端,將首部劃分爲許多16位字的序列,並將校驗和置0,而後對全部序列進行反碼算術運算求和,求和結果取反碼寫入到檢驗和中。接收端,操做與發送端相似,但不把檢驗和置0,若是取放碼後結果爲0,則保留該數據報,不爲0則表示出錯,丟棄該數據報。
二進制反碼算術求和:從低位到高位逐列進行運算:0+0=0;0+1=1;1+1=0,進1,若是最高進1,則在最後的結果加1便可。
知道了IP數據報的格式,那麼數據報是如何從發送端經過路由器到達接收端的呢?那就要了解路由錶轉發算法了。
那麼在第二步中,如何將目的IP地址轉換成硬件地址呢?那就涉及到ARP協議,具體看下一節。
在實際網絡數據鏈路中傳遞數據幀,使用的仍是硬件地址,所以須要經過ARP將IP地址解析出在數據鏈路層使用的硬件地址。
每臺主機都設有ARP高速緩存,存有本局域網上的各主機和路由器的IP地址到硬件地址的映射表,該映射表是動態更新的。由於IP地址32位,而硬件地址是48位,常常的轉換計算操做是很是的耗性能,因此經過高速緩存來存儲IP地址和硬件地址的映射關係。同時因爲主機常常添加和移除,因此須要動態更新映射表。映射地址項在映射表中都有生存時間,超過了生存時間就會被剔除。
那麼ARP是如何經過IP地址找到對應的硬件地址呢?
若是主機H1要向主機H2發送IP數據報,那麼會先在ARP高速緩存查找是否有H2主機的IP地址,若是有,就找到H2主機的硬件地址,而後把硬件地址寫入到MAC幀便可,發送出去。若是在高速緩存中找不到H2主機的IP地址,那麼H1主機就須要向局域網廣播一個ARP請求分組,請求分組會攜帶有H2主機的IP地址。局域網內的全部主機都會收到該廣播,並將請求分組的IP地址和本身的IP地址比較,若是一致則回覆ARP響應分組,告知H1z主機,本身的硬件地址。H1主機收到H2的答覆後,就會寫入到高速緩存中,後續須要向H2主機發送數據就直接從映射表查找便可,有效下降通訊量。
那,要是H2主機不在H1主機的局域網中怎麼辦?
ARP是解決同一個局域網內全部主機和路由器的IP地址與硬件地址解析問題。若是局域網內不存在H2主機,即ARP沒法在本地局域網解析出H2的硬件地址,那麼就查找本地局域網的一個路由器R1。路由器R1會在另外一個相連局域網A經過ARP查找H2主機,若是找不到,則會在A局域網查找另一個路由器R3,進行ARP查詢。
那若是主機H2已經沒有接入互聯網了,或者在路由錶轉發分組出錯時,怎麼辦?那麼就須要ICMP(網際控制報文協議)。
ICMP容許在主機或路由器報告差錯狀況和提供有關異常的狀況報告。ICMP報文是裝在IP數據報中,做爲IP數據報的數據部分。如圖所示:
ICMP報文有ICMP差錯報告報文和ICMP詢問報文兩種。
下面表格是常見幾種ICMP報文類型:
至於ICMP的數據部分,在差錯報告報文,具備同一個格式,取原有的數據報數據字段的前8個字節(對TCPh和UDP協議來講,能夠獲取到端口號)。
例如咱們經常使用的PING就是ICMP的應用實例,用來測試兩臺主機的連通性。
在IP地址小結的介紹中,IP地址分爲網絡地址和主機號兩級結構。兩級劃分IP地址會存在如下問題:
IP地址空間利用率有時很低:一個A類地址網絡能夠鏈接主機數超過1000萬臺,B類超過6萬臺。對主機數需求不大的單位又不肯申請C類,形成大量IP地址浪費。
路由表變得太大:給每個物理網絡分配一個網絡地址,會致使路由器的路由表的項目數愈來愈多,從而致使網絡性能降低。
兩級IP地址不夠靈活:一個單位在新的地點新建一個網絡,是沒法當即接入互聯網的,須要向管理機構申請新的網絡地址。
爲此,經過將兩級IP地址劃分爲三級地址來解決上述問題。這種作法叫作劃分子網或者子網尋址或者子網路由選擇。
所謂劃分子網就是從主機號中借若干位做爲子網號,這樣就行三級結構:
同個子網內的全部主機,網絡號也是相同,子網內的主機對外通信須要將數據報發給路由器,再由路由器統一發送到其餘網絡。其餘主機發送到本子網的主機也須要通過路由器。也就是說,劃分子網是單位內部的事,對外仍是表現爲一個網絡。
那麼,當外部數據達到路由器,路由器如何轉發給子網呢?從IP數據報首部是沒法判斷出網絡是否劃分子網的,因此須要子網掩碼來協助。子網掩碼是用來計算子網的網絡地址。假如子網掩碼爲255.255.255.0,IP地址爲145.13.3.10,將子網掩碼和IP地址逐位與(AND),獲得145.130.3.0就是子網網絡地址。
使用子網掩碼的好處是不管有沒有劃分子網,經過和IP地址按位與,能夠快速得出網絡地址,進行分組轉發。若是劃分子網,那麼使用子網掩碼就能夠計算子網絡地址,沒有劃分,方便路由器在路由表中查找下一跳。因此如今網絡規定必須使用子網掩碼。
構造超網也就是無分類編址(CIDR),劃分子網能在必定程度緩解IP地址不夠用的問題,可是還不夠,所以出現了無分類域間路由選擇(CIDR)。CIDR具備如下兩大特色:
消除傳統分類地址和子網劃分,成爲無分類的兩級編址,記法爲:
更熟悉的記法是斜線記法:
隨着互聯網的發展,IPv4分配的IP地址基本耗盡。新版IPv6是採用具備更大的地址空間來解決IP地址不夠用的問題。 在IPv4中將數據協議單元PDU稱爲數據報,而在IPv6稱爲分組。IPv6相對IPv4具備如下特色:
IPv6更多信息參閱GitHub文檔資源吧。