IP地址為什麼是定長的?是什麼因素限制的?

最近期末複習計算機網路。書里講到XIA等未來互聯網體系結構。想到IP地址為什麼一定是定長的?不能採用「地址長度+地址」這種結構嗎?難道是因為硬體處理這種地址時特別麻煩嗎?(°_°)


硬體處理起來複雜算是其中一個因素吧,最大的理由應該還是總結為:沒有必要。
第一個IP版本出來的時候,沒有人想過32位會不夠用這個問題。而且說實話由於NAT技術續命得當,到今天也不能算是真正不夠用。第二個真正實用的IP版本IPv6,有128位做IP地址,這個目前來看真的看不到不夠用的一天,然而IPv6自己都還推不動,更不要說再擴展出更多位數了。
而且用變長地址,浪費掉的地址數量遠遠要比你想像的多,比如說我們規定所有254開頭的地址都額外擴展出去32位,這樣我們有32位和64位兩種地址。然而,跟我們直接用64位地址比起來,大多數地址都浪費掉了:所有1到253開頭的地址只有32位,如果改用定長的64位地址,這裡每一段都可以多提供約2^58個地址,換來的僅僅是「可以使用32位地址」這一點而已,而這個協議本身還是跟傳統協議不兼容的,沒有帶來任何的好處,如果最後所有IP段都充分使用上的話,絕大多數IP地址還是64位的。與其這樣,當然還不如直接用更長的定長地址。IPv6的地址有128位,目前看不到能用完的那一天在哪,自然沒有太多理由用變長地址了。
=======================================================================
想了一下數學上的解釋,要讓變長的IP地址段能都被正常識別,最自然的想法就是讓這些IP地址構成一個前綴碼。前綴碼的最佳編碼方式是運用哈夫曼樹。但是對IP地址來說,每個IP地址的使用概率應當是均等的,這樣編碼的結果實際上就是定長碼,所以不如最開始就直接用定長的編碼。對於字元編碼之類的應用來說,不同字元的使用概率是非常不同的,在今天的應用中英文字母、數字和常見標點符號遠遠比其他字元的應用範圍廣,所以UTF-8編碼方式中使用變長碼基本算是合理的。對一些協議或文件格式來說,用到數字的地方,較小的數字遠遠比較大的數字的使用頻率要高,所以用變長編碼的數字可以節約佔用空間。但是對IP地址來說這些情況是不存在的。


定長的設計,相當於前面填0就可以把不定長的變成定長的。

這樣的設計有幾個好處。

1. 硬體一個時鐘周期就可以處理,而tlv的方式至少需要2個時鐘周期。這個處理點上有一倍的增益

2. 路由表可以很規整。如果用不定長的長度,路由表會很難受。為了方便和效率,路由表還是會填0變成定長。填0的操作又是浪費。

3. nat困難。這不是IP協議的原因,但nat從定長地址獲益是肯定的

4. 節省的只是線路上的時間,而不是內部處理。假設包長為1000B,那麼4B,16B長度實在是太小收益了。

額外加一句: 路由器內部對包的處理並不是根據收到的length去動態申請內存,然後發包後動態刪除的。路由器設計一般按照固定的空間去收包,例如每個盒子都是1500B,無論包實際有多大都是按照固定長度收的。為什麼呢?你收到以太幀的時候,是線速發的,每個比特的脈衝都按照時鐘連續過來。你如果是動態申請內存,需要等cpu處理回應。為了這個處理能夠在下一個比特脈衝到達前完成,cpu必須夠快還是實時進行。這種設計可靠性和性能上不合適,而且電費也會很高。

這就是為什麼我前面下結論,節約的只是網路上的一點點帶寬。但由此帶來很多的處理複雜性。

在上面這個基礎上再加點信息吧,每個比特脈衝持續多長時間只和物理層協議有關。例如1gbps的乙太網,哪怕你一秒內就發了一個1000B的包,這個包也是以1g的物理層速度送出來的。其他時間網路上是空的。雖然平均速度只有8kbps,但是你收這個包每個比特必須在1g的速率下完成。所以實際上只要還沒有到丟包的負荷水平,網路總是有那麼百分之幾到幾十的空閑的。那麼節約幾個比特,實際上根本沒有增益。


「Best-effort」這個思想是TCP/IP中一個很重要的思想,該思想實際上對應的就是「簡單」。IP地址一開始也是比較簡單的一個設計,該思想在RFC1958裡面也有完整的闡述。這些簡單的設計,在一開始硬體資源作為主要限制的時候,也能夠體現很多好處。

IP地址除了定長這個特點,還有子網掩碼是要求連續1的這個特點(即子網掩碼二進位不「建議」0101這樣構造的,左邊必須連1。PS:協議是建議,實際上目前是強制),這個保證了IP地址具有層次化這個特點。基於該特點,就有了VLSM和CIDR的擴展用法,這個對應的好處就是路由匯總。如果IP地址不是定長的,該層級化的設計就不太好完成。

一般路由交換中,都是採用TCAM的硬體來做快速匹配的,如果路由表太多,那麼就是增加匹配時間。在基於IP地址具有層次化,且做了路由匯總的情況下,可以減少匹配的路由條目,從而加快轉發過程。在NDN改良IP的情況下,也是保留了層次化這個特點。這個特點也是挺有實際效益的。


首先,你怎麼設計一個路由演算法去路由變長的IP?


其實就是為了軟硬體處理方便,別想多了。


因為子網掩碼就那麼長 可以去百度下什麼是子網掩碼


如果是變長,難道可以同意無限長嗎?沒有無限長總有上限吧。那既然有上限為什麼不直接設為上限,空白地方用0填充呢。所以ip就是這樣。
而且試想如果為變長的地址,就得有一個地方記錄ip長度,或者以一個特定的位元組結尾做終止符。這兩種情況都有安全隱患。


推薦閱讀:

wifi非常不穩定且延遲高可能的原因是什麼?
Zeta-TCP真的有效嗎?
怎麼有效理解可靠數據傳輸?
瀏覽器能夠使用一次TCP連接多次發起http請求,那麼瀏覽器是怎麼區分這多個請求的響應的?
學習網路編程,想寫個聊天伺服器練練,想實現客戶端之間的通信,但是卡殼了?

TAG:信息技術IT | 計算機技術 | 計算機網路 | IP地址 | TCPIP |