從ip addr add和ifconfig的區別看linux網絡卡ip地址的結構
今天一個老外在郵件列表上問了一個問題,就是ip addr add和ifconfig的區別,我給他進行了解答,可能因為英語不好吧,解答的很簡單,因此我還是要在這裡詳細說明一下。其實它們之間沒有什麼區別,只 是表述方式不同罷了。如果你非常理解網路協議的原理以及網路的分層架構那麼我想你就不會有這個問題,實際上,每一個網絡卡裝置都有一個mac地址,但是卻可 以有多個網路層地址,比如IP地址,然而這個事實無法很好地像使用者提供操作介面,所以就引出了ip別名(IP aliases)和輔助ip(secondary IP addresses)的概念。其實很容易理解這個事實,按照分層的思想,下層總是為上層服務,也就是為上層提供舞臺,上層利用下層的服務,而不必讓下層知 道自己的情況,如果一個擁有合理mac地址的網絡卡沒有配置網路層地址(比如IP地址)這件事合理的話,那麼為這個裝置配置多個IP地址也是合理的,正好像 一個ip可以對應多個應用層埠一樣,也就是說,下層對上層總是一對多的關係,在分層架構中這種關係是合理的。下面我們就看一下linux的網絡卡的ip地 址結構。剛才說了在linux中,一個網絡卡可以有多個IP,那麼這多個ip有什麼關係呢?其實這些ip組成了一個吊鏈結構,所謂吊鏈結構就是一些節點連結 成一條鏈,然後每個節點帶有自己的一條鏈,如下圖所示:
Linux的ip地址的吊鏈結構以及ip地址的定址特性(詳見《關於IP網段間互訪的問題—路由是根本》)充分說明了linux的協議棧實現多麼的完美,完全符合分層和封裝模型,使得下層的邏輯和上層的邏輯完全解除耦合,也就是說ip層完全不依賴鏈路層以及物理層的物理佈局,最後記住,ip層事情比如定址路由只由ip層實現,之所有有鏈路層發現的路由,完全是為了方便。