這裡所說的ip位址是ipv4位址,ip位址由32位正整數來表示。他在計算機內部被以二進位制方式處理,因此最多有2^32個ip位址,即:43億個總ipv4位址。32位的ip位址被分為4組,每組8位。每組以「.」來進行分割。然後在將每組數轉換為相應的十進位制數字。例如:192.168.0.231,我們稱之為點分十進位制形式。將每組陣列轉換為二進位制為:11000000.10101000.00000000.11100111
早期的ip位址被分組處理為a,b,c,d,e五組,其中實際被使用的是a,b,c,d四類,e類是實驗保留用的。每一類ip位址所能容納的主機數量的差異是巨大的。
ip位址是由兩個部分組成的,網路標識+主機標識構成乙個完整的ip位址。以a類ip位址為例,它的主機標識達到了24位之多,乙個網段內能容納的主機數量高達16777214臺主機。(2^24 == 16777216)其中位址全為0表示對應的ip位址不可獲知;其中位址全為1的表示廣播位址。因此,容納的主機數量最多可達16777214臺。d類ip位址沒有主機標識,只有網路標識。通常被用作廣播位址。它只作為目的位址。
特殊的ip位址
廣播可以分為兩類:本地廣播和直接廣播。
本地廣播是在同乙個資料鏈路上。例如:192.168.0.255/24他會將廣播到192.168.0.0/24。
直接廣播是在不同網路之間的廣播。但是這個缺點是路由器將會**包,這樣將不安全。因此,通常使用的是ip多播。
多播能將包傳送給指定組內的所有主機,它使用ip協議,所以能夠穿透路由器。因此ip多播成為了只給那些必要的組傳送資料報的必選之路。多播使用d類ip位址。因此ip位址開頭如果是「1110」,則可以認為是多播位址。剩下的28位成為多播組標號。即:從224.0.0.0到239.255.255.255都是多播位址。其中從224.0.0.0到224.0.0.255的範圍是不需要路由控制的,也就是說能在同乙個資料鏈路內實現多播。
現在的ip位址不在侷限於上述的類別,更多的則是通過乙個叫做子網掩碼的識別碼來進行網路的識別。自從有了「子網掩碼」,乙個ip位址的網路標識和主機標識就是由「子網掩碼」來確定的。子網掩碼也是乙個32位的數字。它用連續的1來表示網路標識的長度,即:有多少位網路標識,子網掩碼就有多少個1,剩下的用0表示的部分就是主機標識。例如:
子網掩碼:255.255.255.0
子網掩碼:255.255.255.0
子網掩碼就是在a,b,c,d四類基礎上改進而來的,需要多少就用多少。因此,子網掩碼可以靈活的指定網路標識長度。
ip位址的分類處理導致了早期在架構大型網路的時候一般會分配乙個a類ip位址,但是這個a類ip位址最多只能分128個(0,10,127等開頭的a類ip位址是保留的ip位址)。而c類ip位址最大只能容納254臺計算機。隨著計算機網路的日益發展,能分到的a類ip位址幾乎沒有了,b類ip位址也嚴重缺乏。於是,人們摒棄了ip位址分類的做法,採用任意長度分割ip位址的網路標識和主機標識。這種方式叫做cidr。另外還是用來vlsm技術(可變長子網掩碼),他可以隨機修改子網掩碼的長度。有了cidr和vlsm在一定程度上緩解了全域性ip位址不夠用的局面。
隨著網際網路的迅速發展,ip位址不足的問題越來越明顯。於是,出現了一種新的技術,他不在要求為每一台主機或者路由器分配乙個ip位址,而是在必要的時候,才給相應數量的裝置分配唯一的ip位址。對於乙個區域網內的裝置而言,只要ip位址是不衝突的即可。於是,私有ip位址便出現了。
10.0.0.0——10.255.255.255(10/8),這是a類私有ip位址
172.16.0.0——172.31.255.255(172.16/12),b類
192.168.0.0——192.168.255.255(192,168/16),c類
包含在上述ip內的所有位址都是私有位址。在此之外的ip位址都是公有ip位址。
最初配有私有ip位址的主機本來是不打算連線到網際網路的,但是隨著nat技術的出現,它能夠互換私有ip和全域性ip。使得私有位址的主機也能夠連線網際網路。現在在學校和家裡一般都是在每個終端設定私有ip,但是在路由器上設定乙個全域性ip。這相當於在ip位址中又進行了一次位址層次的劃分。私有ip位址的主機則通過nat與網際網路相連線。
由此ipv4位址池枯竭的問題基本可以得到解決。私有ip位址和nat技術已經成為現在解決全域性ip位址枯竭的主流方案。但是在使用的時候就有一些限制。為此,ipv6出現了,它長達128位的位址,足足有3.4028236692093846346337460743177e+38這麼多的ip位址。相信隨著網際網路的發展,ipv6的普及,人人都可以擁有乙個公網ip。
在全世界範圍內,全域性ip位址是由icann進行管理。我國的全域性ip位址是由cnnic來進行管理的。對於一般使用者而言,並不需要向cnnic發出申請全域性ip位址的請求,而是向本地isp發出接入網際網路的請求,同時本地isp會給使用者分配乙個全域性ip位址。現階段普遍採用的方式是私有ip位址+nat技術來給使用者提供上網服務。
版本號:在ipv4資料報中,版本號就是4。不同的ip版本使用的資料報格式不同,ipv6的資料報不是這樣的。
首部長度:首部長度的單位是4位元組,即當首部長度填寫為5的時候,ip首都長度實際是20個位元組。大多數ip資料報都不包含可變部分。即一般的ip資料報首部大小就是20個位元組。
服務型別:區分不同型別的ip資料報。只有當網路本身提供區分服務的時候,才有用。
總長度:它是ip資料報的總長度,單位是1位元組。該字段有16位,即最大理論長度是65535位元組。然而實際上由於資料鏈路的影響,一般很少有超過1500位元組的資料報。
ttl:ttl是用來設定資料報不會在網路中一直迴圈。每當資料報經過乙個路由器的時候,ttl就自動減1。若ttl=0,那麼該資料報將被丟棄。
協議:該欄位指示傳輸層所使用的協議型別。通過該欄位指示了ip資料報應該交給哪個傳輸層協議。典型的有值為6的時候,表示應該交由tcp協議,值為17的時候,表示交由udp協議。
首部校驗和:實現對ip資料報首部的差錯檢驗。由於每經過一次路由器,ttl都要減1,故,校驗和也是每次經過乙個路由器都要校驗和重新計算的。
選項欄位和填充:它們一般在資料報中不存在。
事實上,所有的ip資料報的df都是為0的。究竟分不分片是由路由器決定的,而不是傳送主機。
資料鏈路層不同,mtu(最大傳輸單元)就不同。但是ip協議是網路層的協議,它需要將資料鏈路層進行抽象。使得所有的資料鏈路對於上層的表現是一致的。
任何一台主機必要對ip分片進行相應的處理。因為,較大的報文無法一下子傳送出去,需要進行分片分次傳送。是否有必要進行分片是由路由器決定的,只要路由器認為有必要分片,就會進行分片。路由器只管分片,不管重組。重組是需要在目標主機上完成的。分片以8位元組的倍數進行。ip首部的「片偏移」字段表示之後每個分片在使用者資料中的相對位置和該分片之後是否還有其它後續分片。
分片機制並不完美,隨著網際網路的快速發展。分片機制帶給路由器的負擔越來越重。並且分片帶來了如果丟失其中乙個分片,那麼整個報文就會作廢。但是如果讓上層協議封裝的資料流變得更小,會導致網路利用率下降。為了解決上述問題,我們引入路徑mtu發現。
路徑mtu發現是指從傳送端主機到接收端主機所經過的所有資料鏈路中最小的mtu。按照路徑mtu分片以後,就無需再中途的路由器上進行分片處理了。路徑mtu的實現依賴於路由器所搭載的作業系統。
在上層協議是udp協議的情形下,首先在傳送端主機傳送ip包的時候設定分片禁止標誌。途中的路由器即使遇到了包的大小超過了資料鏈路的mtu,也不去分片,直接將包丟棄。隨後,通過icmp的不可達訊息返回乙個mtu的值給傳送主機。下一次,根據這個icmp所通知的mtu去進行分片處理,接著傳送出去,如果分片仍舊在傳輸過程中大於某一資料鏈路的mtu,仍將分片丟棄,icmp繼續返回乙個當前mtu,如此一直進行下去,直到找到乙個合適的mtu。
在上層協議是tcp協議的情形下。由於tcp協議是面向有連線的(兩台主機之間要維護這個連線)。tcp協議會根據路徑mtu的大小來計算出最大段長度mss。一旦tcp連線採用了路徑mtu發現,那麼在ip層就不會在進行分片處理。因為,mss最大就是路徑mtu。
IPv4協議中的成員描述
在網路協議棧中,ip層的資料結構如下 struct iphdr if defined little endian bitfield u8ihl 4,version 4 elif defined big endian bitfield u8version 4,ihl 4 else error plea...
RaySync 傳輸協議的有效頻寬利用率分析介紹
1 raysync 協議是在udp協議之上,增加了raysync的報文封裝,完成了擁塞控制 報文確認 丟包重傳等一系列完整的功能,可對比的實現包括 udt quic kcp 2 raysync傳輸協議重傳機制參考了tcp的快速重傳,但是做了全新的報文和確認機制設計,raysync的重傳機制可以確保在...
IPv4協議中的UDP分片問題
目錄 ipv4協議 分片可能引起的問題 參考文章 先看乙個流傳得比較多的圖,這裡直入主題,只說與分片相關的字段。標識 identification 佔16位。ip軟體在儲存器中維持乙個計數器,每產生乙個 資料報,計數器就加1,並將此值賦給標識字段。標誌 flag 佔3位,但目前只有兩位有意義。最低位...