IP協議詳解
Internet地址結構
表示IP地址
目前的IP版本有4和6。
目前最流行的就是IPv4,有十進制和二進制兩種表示方法。分別是:
點分四組十進制。每一組范圍是[0~255],如:255.255.255.255
二進制。如:11111111 11111111 11111111 11111111
IPv6地址長度是128位,
由8塊(或8個字段)組成,每一塊都包含四個16進制數,每塊由冒號分隔。
有以下特點:
1、一個塊中前導的0不必書寫。
2、全0的塊可以省略,並用符號::代替。
3、IPv6可以兼容IPv4地址,即可以用IPv6格式表示IPv4地址。
表示方式為:IPv6塊值為ffff,其后面緊跟“點分四組”的格式。如:
::ffff:10.0.0.1
可以代表IPv4:10.0.0.1
4、IPv6的低32位通常采用點分四組(就是上面那樣)的表示法。
基本的IP地址結構
分類尋址
IPV4被分為五大類:ABCDE
A類為:點分四組中的第一組地址范圍為0~127的IP地址。已二進制來看就是“首位為0”
B類:128~191.二進制首位為10
C類:192~223.二進制首位為110
D類:224~239.二進制首位為1110
E類:240~255.二進制首位為1111
子網尋址
如上可以看出,IP地址值存在兩個子結構:網絡號和主機ID,但這樣就出現了一個問題。就是分配ip地址很麻煩。(即網絡信息中心要負責每一台主機的ip地址分配,這樣就太繁雜了。)。
於是就將ip地址從兩級分成了三級:網絡號、子網ID、主機ID
划分子網ID的方法是從“原有的主機號中借用若干位”作為子網號。(當然,主機號就減少了)
網絡信息中心集中分配每一個網絡號。
然后各個站點的管理人員再分配他們網絡號下的子網ID和對應的主機ID。然后管理員在安排每一個子網下面的主機數。
子網掩碼
在ip地址傳播的時候,可以根據二進制首位的格式判斷其屬於第幾類網,也就愛能判斷其網絡號有多少位。
但ip地址本身並沒有包含任何關於子網划分的信息,所以光憑ip地址無法知道“其是如何划分子網的”。
於是就出現了子網掩碼,和ip地址配套着出現,用來說明“該ip地址的子網ID是那幾位數”。
圖示如下:
以二進制來看子網掩碼,只有“連續的1”或“連續的0”。IP子網掩碼的長度和他所對應的IP地址長度一樣(即32位和128位)。
其中的“1”對應的是ip中的“網絡號”和“子網號”,“0”對應的是ip中的“主機號”。
將ip地址與子網掩碼進行“按位與”運算,就能得出用於路由的“子網標識符”,如:
ip地址: 128.32.1.14 對應二進制:10000000 00100000 00000001 00001110
掩碼地址: 255.255.255.0 對應二進制:11111111 11111111 11111111 00000000
子網標識符 128.32.1.0 對應二進制:10000000 00100000 00000001 00000000
通過上面的運算我們可以看出:128.32.1.14這個地址屬於子網“128.32.1.0”。
以上面的各個ip地址為例,整個流程可以如下所示:
1、某個站點申請到了一個B類網的網絡號:128.32.x.x
2、然后該站點的管理員決定使用“255.255.255.0”作為該站點的子網掩碼。這樣就該站點有多少個子網划分好了
(一旦決定使用該子網掩碼,通過計算就能知道,將該站點划分了256個子網,每個子網里有254台主機(因為每個子網的第一個和最后一個地址無效))
3、然后為每一個子網中的主機都安排好ip地址。
4、假設現在有一個訪問,請求訪問ip地址128.32.1.14
5、先根據該ip地址的二進制前幾位,發現該地址是一個B類網,所以網絡號有16位,也就是說128.32是它的網絡號。於是根據網絡號128.32找到該站點。
6、該站點邊界路由器將該ip與子網掩碼進行“按位與”運算,發現子網標識符為128.32.1.0(即128.32.1,后面的.0不存在,因為每個子網的第一個和最后一個地址無效)
7、找到子網128.32.1后,再根據.14找到主機。
廣播地址
之前我們講到了,每個子網的第一個和最后一個地址無效。這個無效更多的是指“這兩個地址不是指向的某個真實的主機”。
上面的子網掩碼計算完后,得到的是“子網掩碼.0”,此處的“.0”(子網的第一個地址),意味着該ip地址不指向某一個主機,而是表示“子網標識符”。
而“.255”(子網的最后一個地址),則也“不是指向”255主機,而是表示了“該子網下的所有主機”。從而引出了廣播地址。
IP網絡上發送信息都是要有准確的ip地址的,假設要給“統一網絡下的”10台主機發信息,那么就得寫10個精准的ip地址。
而利用廣播地址,我們就能通過一條ip地址,將信息發送給某個子網下的所有主機。
即:只寫出網絡號和子網號,而將主機ID部分用.255代替。
想要計算一個站點的廣播地址也要用到子網掩碼,計算方法如下:
1、首先將站點的子網掩碼“取反”(1變0,0變1)。
2、然后與站點ip地址進行“按位或”運算(1或0的1,0或0的0,1或1得1)。
3、這樣就既能保留網絡號和子網號的地址,然后又能將主機號部分替換為255。
前綴(CIDR)
因為現有IPV4地址已經耗盡,所以制定了一個前綴方案。
即:將ip地址的某些位固定住,剩余的為可設置為0和1的任意組合。(比如值固定住第一位,那么后面又能有好多種組合出來的ip)。
CIDR是沒有分類只說的(也就是說帶有前綴的ip地址,不屬於ABCDE里面的任何一類)。
之前ABC的網絡號被限制為8位、16位、24位
而CIDR的網絡號由前綴來控制,如222.80.18.18/25,其中“/25”表示其前面地址中的前25位代表網絡號,其余位數代表主機ID。
寫法是在現有的點分四組后面加上"/前綴"
如:128.0.0.0/24
特殊用途地址
某些地址被用於特殊用途所以不會被分配。
比較為人們所熟知的是127.0.0.1,指向本機。實際上整個127段都是主機回送地址。
也就是說127.0.0.0/8是特殊地址(前綴8將127框住,后面可隨意組合)。127.0.0.1~127.255.255.255之間的地址都會回送本機。
組播地址:
組播IP地址使用的是D類網。
使用組播IP地址作為目的地址,已加入“組”的所有主機都將接收發送到該組的任何數據報。
發送方甚至不知道有多少主機接收到數據報。
IP協議
IPv4首部
版本:
包含IP數據報的版本號:ipv4為4,ipv6為6
首部長度:
其中保存的是整個首部中的“32位字”的數量。
這個字段正常的值為:5(假設“可選字段長度為0”)
該字段最大值為:15(可選字段長度全滿加上原有字段)
區分服務:
優先級(3位)和數據鏈路層的QoS機制有關,定義了8個服務級別。當Qos選擇了某種服務模型后,優先級越高,字段越優先傳輸。
D、T、R分別表示延時、吞吐量、可靠性。當這些值都為1時,分別表示低延時、高吞吐量、高可靠性。
ECN:
用於為數據報標記“擁塞標識符”。
當一個帶有ECN標記的分組發送后,如果接收端“持續擁塞”且“具有感知ECN的能力”(如TCP),那么接收端會通知發送端降低發送速度。
總長度:
該字段指的是IPv4數據報的總長度(以字節為單位)。
通過該字段和“首部長度”字段,我們可以推測出ip數據報中“數據部分”從哪開始以及長度。
標識、標志、分偏移:
該字段幫助標識由IPv4主機發送的數據報。
這個字段對實現分片很重要,大多數數據鏈路層不支持過長的ip數據報,所以要把ip數據報分片,每一片都是一個獨立的ipv4數據報。
發送主機每次發送數據報都講一個“內部計數器”加1,然后將數值復制“標識”字段中。
生存時間:
該字段用於設置一個“數據報可經過的路由器數量”的上限。
發送方在初始發送時設定某個值(建議為64,、128或255),每台路由器再轉發時都將其減一,當字段達到0時,該數據報被丟棄,並使用一個ICMP消息通知發送方。
協議:
包含一個數字,該數字對應一個“有效載荷部分的數據類型”。比如17代表UDP,6代表TCP。
首部校驗和:
該字段“僅計算”IPv4首部。也就是說只“校驗”首部。並不檢查數據報的“數據部分”。
首先將“首部校驗和”設置為0,。
然后對首部(整個首部是一個16位字的“序列”)計算16位二進制反碼和。該值被存儲在首部校驗和字段中。
當接收方接收到數據報后,也對其首部進行校驗計算,如果結果與“首部校驗和”的值不同,就丟棄收到的數據報。
可選字段:
IP支持很多可選選項。
如果選項存在的話,它在IPv4分組中緊跟在基本IPv4頭部之后。
IP轉發
主機和路由器都能轉發ip,不同之處在於:主機不轉發那些不是由它生成的數據報,但路由器會轉發。
IP地址可以接收一個數據報。
當IP模塊接收到一個數據報時,
首先檢查此數據報的目的地址是否為自己的IP地址,
如果不是,且IP層配置為一台路由器,則根據“轉發表”轉發該數據報。
否則丟棄此數據報,然后返回給源節點一個信息,表明錯誤。
轉發表
IP轉發表通常需要包含以下信息。
目的地:
32位字段(用於IPv4),
當目的地為“默認路由”(當路由表中與包的目的地址之間沒有匹配的表項時路由器能夠做出的選擇。如果沒有默認路由,那么目的地址在路由表中沒有匹配表項的包將被丟棄)時,目的地可設置為0。
對於僅描述一個目的地的主機路由,目的地可設為完整的ip地址。
掩碼:
之前講過了,掩碼是和目的地ip組合使用的,將ip地址與子網掩碼進行“按位與”運算,就能得出用於路由的“子網標識符”。
下一跳:
下一個IP實體(路由器或主機)的IP地址。
接口:
包含一個網絡層使用的標識符,用來確定將數據報發送到下一跳的網絡接口。
IP轉發行動
當一台主機或路由器需要向下一跳轉發數據報時,它首先檢查數據報中的IP地址。在算法表中使用該IP地址來執行最長前綴匹配算法。
最長前綴匹配算法:
舉個例子,現在路由器中有兩個路由表(轉發表)其目的地為:192.168.2.0/24和192.168.0.0/16
假設現在路由器接收到了一條數據報,其目標地址為192.168.2.3
那么實際上這兩個路由表都匹配,但路由器會選擇192.168.2.0/24作為該數據報的下一跳,
因為192.168.2.0/24這個ip地址“前綴更長”,匹配成功的部分更多。
IP分片
鏈路層通常對可傳輸的每一個幀的最大長度都有上限。為了使超過此上限的ip數據報能夠正常傳輸,
IP引入了“分片”和“重組”。
當IP層接收到要發送的IP數據報時,通過查找“轉發表”,會判斷該數據報應該從那個本地“接口”發送以及MTU(最大傳輸單元,指一種通信協議的某一層上面所能通過的最大數據包大小(以字節為單位))是多少。
不同的網絡類型,其MTU都不相同,如以太網中MTU為1518字節,FDDI為4500字節。
如果IP數據報超過MTU值,則進行分片。IPv4的分片可以在原始發送方主機和端到端路徑上的任何中間路由器上進行,即:一個分片在到達接收主機的路徑中,還可能被繼續分片。(而IPv6只允許源主機進行分片)
當一個IP數據報被分片后,直到它到達最終目的地才會被重組。(因為同一個數據報的不同分片,可能經由不同的路徑到達相同的最終目的地,所以中途有可能無法重組)
之前提到過,ip分組后,每一個分片都是一個完整的ip數據報。
其中首部里的“總長度”字段,是該分片的總長度。
分片技術與ip首部中以下三個字段有關:
標識符:
主機將數據報分片后,在發送前,會給每一個分片數據報一個ID值,放在16位的標識符字段中。
這個ID值可以用來識別哪些分片是屬於同一個數據報的,方便重組。
標志:
標志字段在IP報頭中占3位,
第1位作為保留,置0;
第2位,分段,有兩個不同的取值:該位置0,表示可以分段;該位置1,表示不能分段;
第3位,更多分段,同樣有兩個取值:該位置0,表示這是數據流中的最后一個分段,該位置1,表示數據流未完,后續還有分段,當一個數據報沒有分段時,則該位置0,表示這是唯一的一個分段。
當目的主機接收到一個IP數據報時,會首先查看該數據報的標識符,並且檢查標志位的第3位是置0或置1,以確定是否還有更多的分段,如果還有后續報文,接收主機則將接收到的報文放在緩存直到接收完所有具有相同標識符的數據報,然后再進行重組。
偏移量:
就像之前說過的,各個IP分片數據報在發送到目的主機時可能是無序的,所以就需要“偏移量”字段來指明“該分片在原數據報中的位置順序”。
發送主機對第一個數據報的偏移量置為0,而后續的分片數據報的偏移量則以網絡的MTU大小賦值。
如:
假設:網絡接口MTU大小為1400字節,要傳輸的數據報為3800字節。
那么,將要傳輸的數據報分為3片即可(3800=1400+1400+1000)
偏移量的計算方法為:已經“裝載”好的分片字節數/8(偏移量就是某片在原分組的相對位置,所以8個字節作為偏移單位。)
分片1偏移量為:0(0=0/8,因為該偏移量之前沒有裝載過任何分片,自然也就是0除以8了)
分片2偏移量為:175(175=1400/8,由於分片1已經裝載好了1400字節,所以此分片的位置就在1400字節之后,也就用1400除以8了)
分片3偏移量為:350(350=2800/8,目前已經裝好了兩個分片也就是2800字節已經裝載完了,那么分片3自然就跟在2800字節之后了,也就是用2800除以8)