IPv4

網際協議版本4是網際協議開發過程中的第四個修訂版本，也是此協議第一個被廣泛部署和使用的版本。其後繼版本為IPv6，直到2011年，IANA IPv4位址完全用盡時，IPv6仍處在部署的初期。IPv4在IETF於1981年9月釋出的 RFC 791 中被描述，此RFC替換了於1980年1月釋出的 RFC 760。IPv4是一種無連線的協議，操作在使用分組交換的鏈路層處理的。地址.IPv4使用32位，這減少了可在網際網路上路由的地址數量。隨著地址不斷被分配給終端使用者，IPv4地址枯竭問題也在隨之產生。基於分類網路、無類別域間路由和網路地址轉換的地址結構重構顯著地減少了地址枯竭的速度。但在2011年2月3日，在最後5個地址塊被分配給5個區域網際網路註冊管理機構之後，IANA的主要地址池已經用盡。這些限制刺激了仍在開發早期的作為目前唯一的長期解決方案的IPv6的部署。地址格式.IPv4地址可被寫作任何表示一個32位整數值的形式，但為了方便人類閱讀和分析，它通常被寫作點分十進位制的形式，即四個位元組被分開用十進位制寫出，中間用點分隔。下表展示了幾種不同的格式：此外，在點分格式中，每個位元組都可用任意的進製表達。如，192.0x00.0002.235是一種合法的表示。點分格式也支援零省略的寫法，例如127.1..1等同於127.1.0.1。常規分類.說明：D類與E類IPv4地址不區分網路地址與主機地址分配.最初，一個IP地址被分成兩部分：網路識別碼在地址的高位位元組中，主機識別碼在剩下的部分中。為了克服這個限制，在隨後出現的分類網路中，地址的高位位元組被重定義為網路的"類"(Class)。這個系統定義了五個類別：A、B、C、D和E。A、B和C類有不同的網路類別長度，剩餘的部分被用來識別網路內的主機，這就意味著每個網路類別有著不同的給主機編址的能力。D類被用於多播地址，E類被留作將來使用。1993年，無類別域間路由正式地取代了分類網路，後者也因此被稱為“有類別”的。CIDR被設計為可以重新劃分地址空間，因此小的或大的地址塊均可以分配給使用者。CIDR建立的分層架構由網際網路號碼分配局進行管理，每個RIR均維護著一個公共的WHOIS資料庫，以此提供IP地址分配的詳情。專用網路.在IPv4所允許的大約四十億地址中，三個地址塊被保留作專用網路。這些地址塊在專用網路之外不可路由，專用網路之內的主機也不能直接與公共網路通訊。但透過網路地址轉換，使用這些地址的主機可以像擁有共有地址的主機在網際網路上通訊。下表展示了三個被保留作專用網路的地址塊：虛擬專用網路.通常情況下，路由器根據資料報文的目的地址決定轉發資料報文的下一跳地址。使用專用網路地址作為目的地址的資料包通常無法被公共路由器正確送達，因為公共路由器沒有相應的路由資訊，即無法得知如何才能轉發到該IP地址。因此，這就需要透過一種方法，將指引資料報文轉發的下一跳地址和真正要傳輸的目的地址分離開。於是就使用虛擬專用網，將IP報文封裝在其他報文內，以便於透過公網上的公共路由器，達到能處理該封包內層資料的網路裝置上解除封包後，該資料包可以被繼續轉發到目的地址。將資料報文封裝的過程中，可以將資料報文封裝於IP報文中，也可以使用多協議標籤交換協議等，透過其他協議引導資料報文轉發。也可以封裝同時加密資料，以保護資料內容。鏈路本地地址.RFC 5735中將地址塊169.254.0.0/16保留為特殊用於鏈路本地地址，這些地址僅在鏈路上有效。這些地址與專用網路地址一樣不可路由，也不可作為公共網路上報文的源或目的地址。鏈路本地地址主要被用於地址自動配置：當主機不能從DHCP伺服器處獲得IP地址時，它會用這種方法生成一個。當這個地址塊最初被保留時，地址自動配置尚沒有一個標準。為了填補這個空白，微軟建立了一種叫自動專用IP定址的實現。因微軟的市場影響力，APIPA已經被部署到了幾百萬機器上，也因此成為了事實上的工業標準。許多年後，IETF為此定義了一份正式的標準：RFC 3927，命名為“IPv4鏈路本地地址的動態配置”。環回地址.地址塊127.0.0.0/8被保留作環回通訊用。此範圍中的地址絕不應出現在主機之外，傳送至此地址的報文被作為同一虛擬網路裝置上的入站報文，主要用於檢查TCP/IP協議棧是否正確執行和本機對本機的連結。以0或255結尾的地址.一個常見的誤解是以0或255結尾的地址永遠不能分配給主機：這僅在子網路遮罩至少24位元長度時才成立。在有類別的編址中，只有三種可能的子網路遮罩：A類：255.0.0.0，B類：255.255.0.0，C類：255.255.255.0。如，在子網路192.168.5.0/255.255.255.0中，網路識別碼192.168.5.0用來表示整個子網路，所以它不能用來標識子網路上的某個特定主機。廣播地址允許資料包發往子網路上的所有裝置。一般情況下，廣播位址是藉由子網路遮罩的位元反碼並和網路識別碼執行 OR 的位元運算得到，即廣播地址是子網路中的最後一個地址。在上述例子中，廣播地址是192.168.5.255，所以為了避免歧義，這個地址也不能被分配給主機。在A、B和C類網路中，廣播地址總是以255結尾。但是，這並不意味著每個以255結尾的地址都不能用做主機地址。比如，在B類子網192.168.0.0/255.255.0.0。在這種情況下，儘管可能帶來誤解，但192.168.1.255、192.168.2.255等地址可以被分配給主機。同理，192.168.0.0作為網路識別碼不能被分配，但192.168.1.0、192.168.2.0等都是可以的。隨著CIDR的到來，廣播地址不一定總是以255結尾。比如，子網路203.0.113.16/28的廣播地址是203.0.113.31。過程如下：網路：203.0.113.16掩碼：255.255.255.240掩碼反碼：0.0.0.15OR操作：00010000 | 00001111 = 00011111 =31一般情況下，子網路的第一個和最後一個地址分別被作為網路識別碼和廣播地址，任何其它地址都可以被分配給其上的主機。地址解析.網際網路上的主機通常被指定，但IP報文的路由是由IP地址而不是這些名字決定的。這就需要將域名翻譯成地址。域名系統提供了域名轉換為IP地址的服務。與CIDR相像，DNS是層級結構。地址空間枯竭.從20世紀80年代起，一個很明顯的問題是IPv4地址在以比設計時的預計更快的速度耗盡。 這是建立分類網路、無類別域間路由，和最終決定重新設計基於更長地址的網際網路協議的誘因。一些市場力量也加快了IPv4地址的耗盡，如：隨著網際網路的增長，各種各樣的技術隨之產生以應對IPv4地址的耗盡，如：隨著IANA把最後5個地址塊分配給5個RIR，其主地址池在2011年2月3日耗盡。 許多地址分配和消耗的模型都預測第一個耗盡地址的RIR會在2011年的下半年出現。ARIN在2015年用完可用的供應，APNIC、LACNIC和AFIC根據其社群政策定量供應。廣泛被接受且已被標準化的解決方案是遷移至IPv6。IPv6的地址長度從IPv4的32位增長到了128位，以此提供了更好的路由聚合，也為終端使用者分配最小為264個主機地址的地址塊成為可能。遷移過程正在進行，但其完成仍需要相當的時間。網路地址轉換.對地址的快速分配和其造成的地址短缺促成了許多有效應用地址的方法，其中一種就是網路地址轉換。報文結構.IP報文包含IP首部和資料部分首部.IPv4報文的首部包含14個欄位，其中13個是必須的，第14個是可選的被標記為0。版本欄位佔4bit，通訊雙方使用的版本必須一致。對於IPv4，欄位的值是4。佔4bit，首部長度說明首部有多少32位字，最大十進位制值是15。佔6bit，最初被定義為服務型別欄位，實際上並未使用，但1998年被IETF重定義為區分服務RFC 2474。只有在使用區分服務時，這個欄位才起作用，在一般的情況  下都不使用這個欄位。例如需要實時資料流的技術會應用這個欄位，一個例子是VoIP。在RFC 3168中定義，允許在不丟棄報文的同時通知對方網路擁塞的發生。ECN是一種可選的功能，僅當兩端都支援並希望使用，且底層網路支援時才被使用。這個16位欄位定義了報文總長，包含首部和資料，單位為位元組。這個欄位的最小值是20欄位的值小於IP報文長度時，報文就必須被分片，詳細見下個標題。佔16位，這個欄位主要被用來唯一地標識一個報文的所有分片，因為分片不一定按序到達，所以在重組時需要知道分片所屬的報文。每產生一個數據報，計數器加1，並賦值給此欄位。一些實驗性的工作建議將此欄位用於其它目的，例如增加報文跟蹤資訊以協助探測偽造的源地址。這個3位欄位用於控制和識別分片，它們是：* 位0：保留，必須為0；* 位1：禁止分片，當DF=0時才允許分片；* 位2：更多分片，MF=1代表後面還有分片，MF=0 代表已經是最後一個分片。如果DF標誌被設定為1，但路由要求必須分片報文，此報文會被丟棄。這個標誌可被用於發往沒有能力組裝分片的主機。當一個報文被分片，除了最後一片外的所有分片都設定MF為1。最後一個片段具有非零片段偏移欄位，將其與未分片資料包區分開，未分片的偏移欄位為0。這個13位欄位指明瞭每個分片相對於原始報文開頭的偏移量，以8位元組作單位。這個8位欄位避免報文在網際網路中永遠存在。存活時間以秒為單位，但小於一秒的時間均向上取整到一秒。在現實中，這實際上成了一個跳數計數器：報文經過的每個路由器都將此欄位減1，當此欄位等於0時，報文不再向下一跳傳送並被丟棄，最大值是255。常規地，一份ICMP報文被髮回報文傳送端說明其傳送的報文已被丟棄。這也是traceroute的核心原理。佔8bit，這個欄位定義了該報文資料區使用的協議。IANA維護著一份協議列表，詳細P協議號列表。這個16位檢驗和欄位只對首部查錯，不包括資料部分。在每一跳，路由器都要重新計算出的首部檢驗和並與此欄位進行比對，如果不一致，此報文將會被丟棄。重新計算的必要性是因為每一跳的一些首部欄位都有檢驗和欄位。此處的檢驗計算方法不使用CRC。RFC 1071一個IPv4地址由四個位元組共32位構成，此欄位的值是將每個位元組轉為二進位制並拼在一起所得到的32位值。例如，10.9.8.7是00001010000010010000100000000111。但請注意，因為NAT的存在，這個地址並不總是報文的"真實"傳送端，因此發往此地址的報文會被送往NAT裝置，並由它被翻譯為真實的地址。與源地址格式相同，但指出報文的接收端。附加的首部欄位可能跟在目的地址之後，但這並不被經常使用，從1到40個位元組不等。請注意首部長度欄位必須包括足夠的32位字來放下所有的選項選項被插入列表末尾。下表列出了可能寬鬆的源站選路選項不被推薦使用，因其可能帶來安全問題。許多路由器會拒絕帶有這些選項的報文。資料.資料欄位不是首部的一部分，因此並不被包含在首部檢驗和中。資料的格式在協議首部欄位中被指明，並可以是任意的傳輸層協議。一些常見協議的協議欄位值被列在下面：P協議號列表以獲得完整列表。分片和組裝.網際網路協議是整個網際網路架構的基礎，可以支援不同的物理層網路，即IP層獨立於鏈路層傳輸技術。不同的鏈路層不僅在傳輸速度上有差異，還在幀結構和大小上有所不同，不同MTU引數描述了資料幀的大小。為了實現IP資料包能夠使用不同的鏈路層技術，需要將IP資料包變成適合鏈路層的資料格式，IP報文的分片即是IP資料包為了滿足鏈路層的資料大小而進行的分割。在IPv6不要求路由器執行分片操作，而是將檢測路徑最大傳輸單元大小的任務交給了主機。分片.當裝置收到IP報文時，分析其目的地址並決定要在哪個鏈路上傳送它。MTU決定了資料載荷的最大長度，如IP報文長度比MTU大，則IP資料包必須進行分片。每一片的長度都小於等於MTU減去IP首部長度。接下來每一片均被放到獨立的IP報文中，並進行如下修改：例如，對於一個長20位元組的首部和一個MTU為1,500的乙太網，分片偏移量將會是：0、(1480/8)=185、(2960/8)=370、(4440/8)=555、(5920/8)=740、等等。如果報文經過路徑的MTU減小了，那麼分片可能會被再次分片。比如，一個4,500位元組的資料載荷被封裝進了一個沒有選項的IP報文，並在MTU為2,500位元組的鏈路上傳輸，那麼它會被破成如下兩個分片：現在，假設下一跳的MTU為1,500位元組，那麼每一個分片都會被再次分成兩片：第3和4片是從原始第2片再次分片而來，所以除了分片後的最後一個分片外MF為都為1。重組.當一個接收者發現IP報文的下列專案之一為真時：它便知道這個報文已被分片，並隨即將資料、識別符號欄位、分片偏移量和更多分片標誌一起儲存起來。當接受者收到了更多分片標誌未被設定的分片時，它便知道原始資料載荷的總長。一旦它收齊了所有的分片，它便可以將所有片按照正確的順序組裝起來，並交給上層協議棧。輔助協議.網際網路協議定義並激活了網路層，它使用一個邏輯地址系統。IP地址並不以任何永久的方式繫結到硬體，而且事實上一個網路介面可以有許多IP地址。為了正確地交付一份報文，主機和路由器需要其它機制來識別裝置介面和IP地址之間的關聯。地址解析協議的轉換。此外，反向操作有時候也是必須的，比如，一臺主機在啟動時需要知道自己的IP地址和比較不常用的RARP。地址耗盡：