TCP/IP之IP协议(网际协议)
IP概述
一些概念:
IP是TCP/IP協議族中最為核心的協議。所有的TCP,UDP,ICMP,IGMP數據都是以IP數據報格式傳輸。IP協議就是定義數據如何從源地址傳送到目的地址,同時也定義在傳輸過程中的數據分片和重新組裝
IP協議是被它的上層協議(TCP,UDP)調用,同時它也調用它的下層協議(以太網協議,IEEE802),把IP數據報傳到下一個網關(gateway)或目的地址
IP協議主要實現兩個基本功能:尋址和數據分片
IP運作模式(model of operation)
網絡1中的應用程序把要數據交給IP模塊處理,加上目標,源地址和相關參數等信息放到IP頭中
IP模塊根據特定的鏈路層網絡協議,進行相應的協議轉換。例如如果現在是以太網局域網,則根據目的IP地址得到相應的MAC地址,并封裝IP數據包為特定的鏈路層數據幀格式進行傳輸到局域肉的網關
網關接收到數據后,去掉相關的鏈路層頭信息,交由IP模塊處理
IP模塊去掉鏈路層相關數據頭信息后,根據IP地址和特定鏈路層協議,把數據報傳到網絡2中的網關。
網絡2中的網關根據目的IP地址得到對應硬件地址MAC地址,并將數據傳輸到指定目的主機上
目的主機IP模塊將得到的數據去掉底層協議頭信息后將給相應的應用程序進程以供調用處理
IP頭部格式定義(IP Header Format)
我們從上到下,從左到右介紹下各字段含義:
version(版本): 指IP協議版本號,目前是4,也稱IPv4,將來(現在已經在用了)會是IPv6
IHL(internet header length):指頭部長度數值,以4字節(32比特)為單位。因為IHL占四比特位置,所以最大值是:2^4 -1 = 15,則頭部可能最大為:15 * 4字節 = 60字節,一般沒有選項(options)數據時值為5(即5 * 4字節=20字節)
Type of service(服務類型): 前三個比特指優先權字段(已被忽略)。中間四個比特表示:最小時延,最大吞吐量,最高可靠性,最小費用。0表時一般,1表示最優。四個中只能一個置1。最后一比特預留,總置為0
Total length(IP數據總長度) : IP數據報內容的長度,包括IP頭部部分,以字節為單位。因為占16比特,所以最長為65535(2^16-1)。盡管IP數據報最長可以達65535字節,但是我們知道有些鏈路層有最大傳輸單元的限制(MTU),如以太網就是1500,這時候IP數據報就要分片(Fragmentation)傳輸。
Identification(唯一標識): 每一個IP數據報都要有唯一的標識字段,這樣在分片和重組時不至于混淆兩個完全不同的分片數據。這在后面分組,重組中會講到
Flages(標志): 這個字段也是為IP數據報的分片和重組作用的。用于標識收到的分片后續是否還有分片待接收。
Fragment offset(分片偏移):指當前分片數據在整體IP數據報中所處的偏移量,以8字節(64比特)為單位。由此可見,「identification」,「Flages」,「Fragment offset」這三個字段是為IP數據報分片和重組功能作用的字段
Time to live(生存時間) : 設置IP數據報可以經過的最多路由器數目。每次經過一次處理它的路由器,它的值就減1,值到為0時,該數據報丟棄,并發送ICMP報文到源主機。
Protocol(協議) : 指定它的上層協議,如TCP。
Header checksum(頭檢驗和) : 為了驗證IP頭數據的完整性,進行一系列計算求出的檢驗和值,當接收方收到后也要進行同樣的計算并把求出的檢驗和與收到的相比較,以判斷IP數據在傳輸的過程中是無誤傳輸的。
關于計算檢驗和的算法,在RFC1071里定義。我沒有詳細看這份rfc,但是這篇文章介紹得挺詳細的。
source address 和 destination address 分別指源IP地址和目的IP地址。
options(頭部選項):一些特定應用時定義的選項值。只需要注意幾點:「選項」是可選的(optional),且如果有選項值的話,長度值必需以32比特為上界,不足的話補0。這是因為IP頭部始終以32比特為單元。
IP路由選擇
我們自己的電腦和一臺主機通信時,如訪問某一個網站的web服務,映射到底層后其實就是IP數據報(ip datagrams)的傳輸。那么一個IP數據報(假如一個http地址請求的數據)是怎么的方式從我的電腦達到web站點的呢?這里我們設置一個具體網絡環境,然后基于這個環境分析下。
我的電腦主機名是「host」,IP是「192.168.1.121」,假如我現在要訪問www.baidu.com的頁面,ping得baidu.com的服務器IP是220.181.111.53。則IP數據報的傳輸過程如下描述:
由于目的地址IP是「220.181.111.53」,與要機IP地址「192.168.1.121」不在一個網絡號,因此數據發送到本地局域網的網關上,即本地路由器「192.168.1.1」。
本地路由器接收到數據后,要進行轉發,由于本地路由器是通過電信ADSL撥號上網,分配的IP是「113.89.201.22」,與目的IP,即baidu的服務器IP 「220.181.111.53」也不是在一個網絡上,因此把數據發到默認網關上轉發,即發到電信網關「113.89.201.1」
電信網關「113.89.201.1」通過查找路由表記錄,找到一條路由記錄項記錄的下一站路由IP「220.181.111.12」,它和我們的目的IP地址「220.181.111.53」處在同一個網絡號(network address)上
當數據傳輸到baidu網關「220.181.111.12」時,發現目的地址「220.181.111.53」處在同一個網絡中,則通過ARP得到目的主機的硬件地址(MAC),封裝成以太網數據幀格式后傳輸到目的主機「220.181.111.53」上。
至此,整個數據報從源主機「192.168.1.121」到「220.181.111.53」傳輸完畢
通過上面的一個實例分析,總結下IP路由的一些規范:
搜索路由表,尋找與目的IP地址完全匹配的表目:網絡號和主機號都要匹配。如果存在,則把報文直接發送到目的IP
搜索路由表,尋找與目的IP地址相匹配的網絡號表目,如果存在,則把報文發送到與之匹配網絡號的路由器上
如果上述兩步中都沒有查找成功,則把報文發送到路由器設置的默認下一站路網器上。
如果到這里還沒有成功,則當前數據報就不能傳送了(因為現在都不知道下一站去哪里),則表明發送失敗,那么需要向源發送端發送一個“錯誤”訊號。
子網
我們知道,IP地址是由網絡號和主機號組成的,如下圖所示一個B類地址:
網絡號一般是由一個國際組織機構(InterNIC)頒發的,像上面的140.152;但是后面的子網號(5)和主機號(121)則是由擁有該網絡號的管理員自己分配。
假如我們看到一個IP地址,可以馬上知道它的網絡號(因為可以根據IP地址的類型:A,B,C就可以得知網絡號),但是還要知道后面的比特值有多少是為子網號占有,有多少是主機號占有。像上圖所示的我們把8比特分給了子網號,另外8比特分給了主機號,但是這只是我們可選的一種分配方式,并沒有規定必需這樣,也可以按3:13這個比例來分配。所以這個時間,我們就需要設置規定這樣的一個分配比較規則,即就是「子網掩碼」這個概念。子網掩碼可以怎么定義:把32比特的地址值中網絡號和子網號全部置為1,主機號置為0,像上面的IP:140.152.5.121的子網掩碼格式如下:
所以給定一個IP地址,加上一個子網掩碼,我們就可以等到如下信息:
IP地址類型:根據最高位可知,如A,B,C類IP
網絡號 :根據IP類型后,就知道網絡號(每個IP類型明確知道網絡號占的比特位數)
子網號 :根據子網掩碼的定義,對應的網絡號和子網號的位置都是1,所以我們知道了子網號所占的比特值
主機號 :知道了子網號,同時也知道了主機號
-----------------------------------EOF-----------------------------------------------------------------------------------------------
原創文章,轉載請注明出處,謝謝!
總結
以上是生活随笔為你收集整理的TCP/IP之IP协议(网际协议)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android hide方法 末班,an
- 下一篇: android listview下拉刷新