ifconfig
查看IP地址,在Windows上是ipconfig
,在Linux上是ifconfig
。Linux上還有ip addr可以查看IP地址
想象一下,你登錄進入一個被裁剪過的非常小的Linux系統中,發現既沒有ifconfig命令,也沒有ip addr命令,你是不是感覺這個系統壓根兒沒法用?這個時候,你可以自行安裝net-tools和iproute2這兩個工具。當然,大多數時候這兩個命令是系統自帶的。
ifconfig和ip addr的區別
想象一下,你登錄進入一個被裁剪過的非常小的Linux系統中,發現既沒有ifconfig命令,也沒有ip addr命令,你是不是感覺這個系統壓根兒沒法用?這個時候,你可以自行安裝net-tools和iproute2這兩個工具。當然,大多數時候這兩個命令是系統自帶的。
安裝好后,我們來運行一下ip addr。不出意外,應該會輸出下面的內容。
root@test:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff
inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fec7:7975/64 scope link
valid_lft forever preferred_lft forever
這個命令顯示了這台機器上所有的網卡
IP地址是一個網卡在網絡世界的通訊地址,相當於我們現實世界的門牌號碼。既然是門牌號碼,不能大家都一樣,不然就會起沖突。比方說,假如大家都叫六單元1001號,那快遞就找不到地方了。所以,有時候咱們的電腦彈出網絡地址沖突,出現上不去網的情況,多半是IP地址沖突了。
10.100.122.2就是一個IP地址。這個地址被點分隔為四個部分,每個部分8個bit,所以IP地址總共是32位。這樣產生的IP地址的數量很快就不夠用了。因為不夠用,於是就有了IPv6。
本來32位的IP地址就不夠,還被分成了5類。
在網絡地址中,至少在當時設計的時候,對於A、B、 C類主要分兩部分,前面一部分是網絡號,后面一部分是主機號。這很好理解,大家都是六單元1001號,我是小區A的六單元1001號,而你是小區B的六單元1001號。
下面這個表格,詳細地展示了A、B、C三類地址所能包含的主機的數量。
這里面有個尷尬的事情,就是C類地址能包含的最大主機數量實在太少了,只有254個。當時設計的時候恐怕沒想到,現在估計一個網吧都不夠用吧。而B類地址能包含的最大主機數量又太多了。6萬多台機器放在一個網絡下面,一般的企業基本達不到這個規模,閑着的地址就是浪費。
無類型域間選路(CIDR)
於是有了一個折中的方式叫作無類型域間選路,簡稱CIDR。這種方式打破了原來設計的幾類地址的做法,將32位的IP地址一分為二,前面是網絡號,后面是主機號。從哪里分呢?
你如果注意觀察的話可以看到,10.100.122.2/24,這個IP地址中有一個斜杠,斜杠后面有個數字24。這種地址表示形式,就是CIDR。后面24的意思是,32位中,前24位是網絡號,后8位是主機號。
伴隨着CIDR存在的,
一個是廣播地址,10.100.122.255。如果發送這個地址,所有10.100.122網絡里面的機器都可以收到。
另一個是子網掩碼,255.255.255.0。
將子網掩碼和IP地址進行AND計算。前面三個255,轉成二進制都是1。1和任何數值取AND,都是原來數值,因而前三個數不變,為10.100.122。后面一個0,轉換成二進制是0,0和任何數值取AND,都是0,因而最后一個數變為0,合起來就是10.100.122.0。這就是網絡號。
將子網掩碼和IP地址按位計算AND,就可得到網絡號。
公有IP地址和私有IP地址
在日常的工作中,幾乎不用划分A類、B類或者C類,所以時間長了,很多人就忘記了這個分類,而只記得CIDR。但是有一點還是要注意的,就是公有IP地址和私有IP地址。
我們繼續看上面的表格。表格最右列是私有IP地址段。平時我們看到的數據中心里,辦公室、家里或學校的IP地址,一般都是私有IP地址段。因為這些地址允許組織內部的IT人員自己管理、自己分配,而且可以重復。因此,你學校的某個私有IP地址段和我學校的可以是一樣的。
這就像每個小區有自己的樓編號和門牌號,你們小區可以叫6棟,我們小區也叫6棟,沒有任何問題。但是一旦出了小區,就需要使用公有IP地址。就像人民路888號,是國家統一分配的,不能兩個小區都叫人民路888號。
公有IP地址有個組織統一分配,你需要去買。如果你搭建一個網站,給你學校的人使用,讓你們學校的IT人員給你一個IP地址就行。但是假如你要做一個類似網易163這樣的網站,就需要有公有IP地址,這樣全世界的人才能訪問。
表格中的192.168.0.x是最常用的私有IP地址。你家里有Wi-Fi,對應就會有一個IP地址。一般你家里地上網設備不會超過256個,所以/24基本就夠了。有時候我們也能見到/16的CIDR,這兩種是最常見的,也是最容易理解的。
不需要將十進制轉換為二進制32位,就能明顯看出192.168.0是網絡號,后面是主機號。而整個網絡里面的第一個地址192.168.0.1,往往就是你這個私有網絡的出口地址。
例如,你家里的電腦連接Wi-Fi,Wi-Fi路由器的地址就是192.168.0.1,而192.168.0.255就是廣播地址。一旦發送這個地址,整個192.168.0網絡里面的所有機器都能收到。
但是也不總都是這樣的情況。因此,其他情況往往就會很難理解,還容易出錯。
舉例:一個容易“犯錯”的CIDR
我們來看16.158.165.91/22這個CIDR。求一下這個網絡的第一個地址、子網掩碼和廣播地址。
你要是上來就寫16.158.165.1,那就大錯特錯了。
/22不是8的整數倍,不好辦,只能先變成二進制來看。16.158的部分不會動,它占了前16位。中間的165,變為二進制為10100101。除了前面的16位,還剩6位。所以,這8位中前6位是網絡號,16.158.<101001>,而<01>.91是機器號。
第一個地址是16.158.<101001><00>.1,即16.158.164.1。子網掩碼是255.255.<111111><00>.0,即255.255.252.0。廣播地址為16.158.<101001><11>.255,即16.158.167.255。
這五類地址中,還有一類D類是組播地址。使用這一類地址,屬於某個組的機器都能收到。這有點類似在公司里面大家都加入了一個郵件組。發送郵件,加入這個組的都能收到。
講了這么多,才講了上面的輸出結果中很小的一部分,是不是覺得原來並沒有真的理解ip addr呢?我們接着來分析。
在IP地址的后面有個scope,對於eth0這張網卡來講,是global,說明這張網卡是可以對外的,可以接收來自各個地方的包。對於lo來講,是host,說明這張網卡僅僅可以供本機相互通信。
lo全稱是loopback,又稱環回接口,往往會被分配到127.0.0.1這個地址。這個地址用於本機通信,經過內核處理后直接返回,不會在任何網絡中出現。
MAC地址
在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,這個被稱為MAC地址,是一個網卡的物理地址,用十六進制,6個byte表示。
MAC地址是一個很容易讓人“誤解”的地址。因為MAC地址號稱全局唯一,不會有兩個網卡有相同的MAC地址,而且網卡自生產出來,就帶着這個地址。很多人看到這里就會想,既然這樣,整個互聯網的通信,全部用MAC地址好了,只要知道了對方的MAC地址,就可以把信息傳過去。
這樣當然是不行的。 一個網絡包要從一個地方傳到另一個地方,除了要有確定的地址,還需要有定位功能。 而有門牌號碼屬性的IP地址,才是有遠程定位功能的。
例如,你去杭州市網商路599號B樓6層找劉超,你在路上問路,可能被問的人不知道B樓是哪個,但是可以給你指網商路怎么去。但是如果你問一個人,你知道這個身份證號的人在哪里嗎?可想而知,沒有人知道。
MAC地址更像是身份證,是一個唯一的標識。它的唯一性設計是為了組網的時候,不同的網卡放在一個網絡里面的時候,可以不用擔心沖突。從硬件角度,保證不同的網卡有不同的標識。
MAC地址是有一定定位功能的,只不過范圍非常有限。你可以根據IP地址,找到杭州市網商路599號B樓6層,但是依然找不到我,你就可以靠吼了,大聲喊身份證XXXX的是哪位?我聽到了,我就會站起來說,是我啊。但是如果你在上海,到處喊身份證XXXX的是哪位,我不在現場,當然不會回答,因為我在杭州不在上海。
所以,MAC地址的通信范圍比較小,局限在一個子網里面。例如,從192.168.0.2/24訪問192.168.0.3/24是可以用MAC地址的。一旦跨子網,即從192.168.0.2/24到192.168.1.2/24,MAC地址就不行了,需要IP地址起作用了。
網絡設備的狀態標識
解析完了MAC地址,我們再來看 <BROADCAST,MULTICAST,UP,LOWER_UP>是干什么的?這個叫作net_device flags,網絡設備的狀態標識。
UP表示網卡處於啟動的狀態;
BROADCAST表示這個網卡有廣播地址,可以發送廣播包;
MULTICAST表示網卡可以發送多播包;
LOWER_UP表示L1是啟動的,也即網線插着呢。
MTU1500是指什么意思呢?是哪一層的概念呢?
最大傳輸單元MTU為1500,這是以太網的默認值。
MTU是二層MAC層的概念。MAC層有MAC的頭,以太網規定連MAC頭帶正文合起來,不允許超過1500個字節。正文里面有IP的頭、TCP的頭、HTTP的頭。如果放不下,就需要分片來傳輸。
qdisc pfifo_fast是什么意思呢?
qdisc全稱是queueing discipline,中文叫排隊規則。內核如果需要通過某個網絡接口發送數據包,它都需要按照為這個接口配置的qdisc(排隊規則)把數據包加入隊列。
最簡單的qdisc是pfifo,它不對進入的數據包做任何的處理,數據包采用先入先出的方式通過隊列。pfifo_fast稍微復雜一些,它的隊列包括三個波段(band)。在每個波段里面,使用先進先出規則。
三個波段(band)的優先級也不相同。band 0的優先級最高,band 2的最低。如果band 0里面有數據包,系統就不會處理band 1里面的數據包,band 1和band 2之間也是一樣。
數據包是按照服務類型(Type of Service,TOS)被分配到三個波段(band)里面的。TOS是IP頭里面的一個字段,代表了當前的包是高優先級的,還是低優先級的。
總結
- IP是地址,有定位功能;MAC是身份證,無定位功能;
- CIDR可以用來判斷是不是本地人;
- IP分公有的IP和私有的IP。
DHCP與PXE
如何配置IP地址?
可以使用ifconfig,也可以使用ip addr。設置好了以后,用這兩個命令,將網卡up一下,就可以開始工作了。
使用net-tools:
$ sudo ifconfig eth1 10.0.0.1/24
$ sudo ifconfig eth1 up
使用iproute2:
$ sudo ip addr add 10.0.0.1/24 dev eth1
$ sudo ip link set up eth1
你可能會問了,自己配置這個自由度太大了吧,我是不是配置什么都可以?如果配置一個和誰都不搭邊的地址呢?例如,旁邊的機器都是192.168.1.x,我非得配置一個16.158.23.6,會出現什么現象呢?
不會出現任何現象,就是包發不出去唄。為什么發不出去呢?我來舉例說明。
192.168.1.6就在你這台機器的旁邊,甚至是在同一個交換機上,而你把機器的地址設為了16.158.23.6。在這台機器上,你企圖去ping192.168.1.6,你覺得只要將包發出去,同一個交換機的另一台機器馬上就能收到,對不對?
可是Linux系統不是這樣的,它沒你想得那么智能。你用肉眼看到那台機器就在旁邊,它則需要根據自己的邏輯進行處理。
只要是在網絡上跑的包,都是完整的,可以有下層沒上層,絕對不可能有上層沒下層。
所以,你看着它有自己的源IP地址16.158.23.6,也有目標IP地址192.168.1.6,但是包發不出去,這是因為MAC層還沒填。
自己的MAC地址自己知道,這個容易。但是目標MAC填什么呢?是不是填192.168.1.6這台機器的MAC地址呢?
當然不是。Linux首先會判斷,要去的這個地址和我是一個網段的嗎,或者和我的一個網卡是同一網段的嗎?只有是一個網段的,它才會發送ARP請求,獲取MAC地址。如果發現不是呢?
Linux默認的邏輯是,如果這是一個跨網段的調用,它便不會直接將包發送到網絡上,而是企圖將包發送到網關。
如果你配置了網關的話,Linux會獲取網關的MAC地址,然后將包發出去。對於192.168.1.6這台機器來講,雖然路過它家門的這個包,目標IP是它,但是無奈MAC地址不是它的,所以它的網卡是不會把包收進去的。
如果沒有配置網關呢?那包壓根就發不出去。
如果將網關配置為192.168.1.6呢?不可能,Linux不會讓你配置成功的,因為網關要和當前的網絡至少一個網卡是同一個網段的,怎么可能16.158.23.6的網關是192.168.1.6呢?
所以,當你需要手動配置一台機器的網絡IP時,一定要好好問問你的網絡管理員。如果在機房里面,要去網絡管理員那里申請,讓他給你分配一段正確的IP地址。當然,真正配置的時候,一定不是直接用命令配置的,而是放在一個配置文件里面。不同系統的配置文件格式不同,但是無非就是CIDR、子網掩碼、廣播地址和網關地址。
動態主機配置協議(DHCP)
原來配置IP有這么多門道兒啊。你可能會問了,配置了IP之后一般不能變的,配置一個服務端的機器還可以,但是如果是客戶端的機器呢?我抱着一台筆記本電腦在公司里走來走去,或者白天來晚上走,每次使用都要配置IP地址,那可怎么辦?還有人事、行政等非技術人員,如果公司所有的電腦都需要IT人員配置,肯定忙不過來啊。
因此,我們需要有一個自動配置的協議,也就是稱動態主機配置協議(Dynamic Host Configuration Protocol),簡稱DHCP。
有了這個協議,網絡管理員就輕松多了。他只需要配置一段共享的IP地址。每一台新接入的機器都通過DHCP協議,來這個共享的IP地址里申請,然后自動配置好就可以了。等人走了,或者用完了,還回去,這樣其他的機器也能用。
所以說,如果是數據中心里面的服務器,IP一旦配置好,基本不會變,這就相當於買房自己裝修。DHCP的方式就相當於租房。你不用裝修,都是幫你配置好的。你暫時用一下,用完退租就可以了。
解析DHCP的工作方式
當一台機器新加入一個網絡的時候,肯定一臉懵,啥情況都不知道,只知道自己的MAC地址。怎么辦?先吼一句,我來啦,有人嗎?這時候的溝通基本靠“吼”。這一步,我們稱為DHCP Discover。
新來的機器使用IP地址0.0.0.0發送了一個廣播包,目的IP地址為255.255.255.255。廣播包封裝了UDP,UDP封裝了BOOTP。其實DHCP是BOOTP的增強版,但是如果你去抓包的話,很可能看到的名稱還是BOOTP協議。
在這個廣播包里面,新人大聲喊:我是新來的(Boot request),我的MAC地址是這個,我還沒有IP,誰能給租給我個IP地址!
格式就像這樣:
如果一個網絡管理員在網絡里面配置了DHCP Server的話,他就相當於這些IP的管理員。他立刻能知道來了一個“新人”。這個時候,我們可以體會MAC地址唯一的重要性了。當一台機器帶着自己的MAC地址加入一個網絡的時候,MAC是它唯一的身份,如果連這個都重復了,就沒辦法配置了。
只有MAC唯一,IP管理員才能知道這是一個新人,需要租給它一個IP地址,這個過程我們稱為DHCP Offer。同時,DHCP Server為此客戶保留為它提供的IP地址,從而不會為其他DHCP客戶分配此IP地址。
DHCP Offer的格式就像這樣,里面有給新人分配的地址。
DHCP Server仍然使用廣播地址作為目的地址,因為,此時請求分配IP的新人還沒有自己的IP。DHCP Server回復說,我分配了一個可用的IP給你,你看如何?除此之外,服務器還發送了子網掩碼、網關和IP地址租用期等信息。
新來的機器很開心,它的“吼”得到了回復,並且有人願意租給它一個IP地址了,這意味着它可以在網絡上立足了。當然更令人開心的是,如果有多個DHCP Server,這台新機器會收到多個IP地址,簡直受寵若驚。
它會選擇其中一個DHCP Offer,一般是最先到達的那個,並且會向網絡發送一個DHCP Request廣播數據包,包中包含客戶端的MAC地址、接受的租約中的IP地址、提供此租約的DHCP服務器地址等,並告訴所有DHCP Server它將接受哪一台服務器提供的IP地址,告訴其他DHCP服務器,謝謝你們的接納,並請求撤銷它們提供的IP地址,以便提供給下一個IP租用請求者。
此時,由於還沒有得到DHCP Server的最后確認,客戶端仍然使用0.0.0.0為源IP地址、255.255.255.255為目標地址進行廣播。在BOOTP里面,接受某個DHCP Server的分配的IP。
當DHCP Server接收到客戶機的DHCP request之后,會廣播返回給客戶機一個DHCP ACK消息包,表明已經接受客戶機的選擇,並將這一IP地址的合法租用信息和其他的配置信息都放入該廣播包,發給客戶機,歡迎它加入網絡大家庭。
最終租約達成的時候,還是需要廣播一下,讓大家都知道。
IP地址的收回和續租
既然是租房子,就是有租期的。租期到了,管理員就要將IP收回。
如果不用的話,收回就收回了。就像你租房子一樣,如果還要續租的話,不能到了時間再續租,而是要提前一段時間給房東說。DHCP也是這樣。
客戶機會在租期過去50%的時候,直接向為其提供IP地址的DHCP Server發送DHCP request消息包。客戶機接收到該服務器回應的DHCP ACK消息包,會根據包中所提供的新的租期以及其他已經更新的TCP/IP參數,更新自己的配置。這樣,IP租用更新就完成了。
好了,一切看起來完美。DHCP協議大部分人都知道,但是其實里面隱藏着一個細節,很多人可能不會去注意。接下來,講一個有意思的事情:網絡管理員不僅能自動分配IP地址,還能幫你自動安裝操作系統!
預啟動執行環境(PXE)
普通的筆記本電腦,一般不會有這種需求。因為你拿到電腦時,就已經有操作系統了,即便你自己重裝操作系統,也不是很麻煩的事情。但是,在數據中心里就不一樣了。數據中心里面的管理員可能一下子就拿到幾百台空的機器,一個個安裝操作系統,會累死的。
所以管理員希望的不僅僅是自動分配IP地址,還要自動安裝系統。裝好系統之后自動分配IP地址,直接啟動就能用了,這樣當然最好了!
這事兒其實仔細一想,還是挺有難度的。安裝操作系統,應該有個光盤吧。數據中心里不能用光盤吧,想了一個辦法就是,可以將光盤里面要安裝的操作系統放在一個服務器上,讓客戶端去下載。但是客戶端放在哪里呢?它怎么知道去哪個服務器上下載呢?客戶端總得安裝在一個操作系統上呀,可是這個客戶端本來就是用來安裝操作系統的呀?
其實,這個過程和操作系統啟動的過程有點兒像。首先,啟動BIOS。這是一個特別小的小系統,只能干特別小的一件事情。其實就是讀取硬盤的MBR啟動扇區,將GRUB啟動起來;然后將權力交給GRUB,GRUB加載內核、加載作為根文件系統的initramfs文件;然后將權力交給內核;最后內核啟動,初始化整個操作系統。
那我們安裝操作系統的過程,只能插在BIOS啟動之后了。因為沒安裝系統之前,連啟動扇區都沒有。因而這個過程叫做預啟動執行環境(Pre-boot Execution Environment),簡稱PXE。
PXE協議分為客戶端和服務器端,由於還沒有操作系統,只能先把客戶端放在BIOS里面。當計算機啟動時,BIOS把PXE客戶端調入內存里面,就可以連接到服務端做一些操作了。
首先,PXE客戶端自己也需要有個IP地址。因為PXE的客戶端啟動起來,就可以發送一個DHCP的請求,讓DHCP Server給它分配一個地址。PXE客戶端有了自己的地址,那它怎么知道PXE服務器在哪里呢?對於其他的協議,都好辦,要么人告訴他。例如,告訴瀏覽器要訪問的IP地址,或者在配置中告訴它;例如,微服務之間的相互調用。
但是PXE客戶端啟動的時候,啥都沒有。好在DHCP Server除了分配IP地址以外,還可以做一些其他的事情。這里有一個DHCP Server的一個樣例配置:
ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;
subnet 192.168.1.0 netmask 255.255.255.0
{
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option time-offset -18000;
default-lease-time 21600;
max-lease-time 43200;
range dynamic-bootp 192.168.1.240 192.168.1.250;
filename "pxelinux.0";
next-server 192.168.1.180;
}
按照上面的原理,默認的DHCP Server是需要配置的,無非是我們配置IP的時候所需要的IP地址段、子網掩碼、網關地址、租期等。如果想使用PXE,則需要配置next-server,指向PXE服務器的地址,另外要配置初始啟動文件filename。
這樣PXE客戶端啟動之后,發送DHCP請求之后,除了能得到一個IP地址,還可以知道PXE服務器在哪里,也可以知道如何從PXE服務器上下載某個文件,去初始化操作系統。
解析PXE的工作過程
接下來我們來詳細看一下PXE的工作過程。
首先,啟動PXE客戶端。第一步是通過DHCP協議告訴DHCP Server,我剛來,一窮二白,啥都沒有。DHCP Server便租給它一個IP地址,同時也給它PXE服務器的地址、啟動文件pxelinux.0。
其次,PXE客戶端知道要去PXE服務器下載這個文件后,就可以初始化機器。於是便開始下載,下載的時候使用的是TFTP協議。所以PXE服務器上,往往還需要有一個TFTP服務器。PXE客戶端向TFTP服務器請求下載這個文件,TFTP服務器說好啊,於是就將這個文件傳給它。
然后,PXE客戶端收到這個文件后,就開始執行這個文件。這個文件會指示PXE客戶端,向TFTP服務器請求計算機的配置信息pxelinux.cfg。TFTP服務器會給PXE客戶端一個配置文件,里面會說內核在哪里、initramfs在哪里。PXE客戶端會請求這些文件。
最后,啟動Linux內核。一旦啟動了操作系統,以后就啥都好辦了。
總結
- DHCP協議主要是用來給客戶租用IP地址,和房產中介很像,要商談、簽約、續租,廣播還不能“搶單”;
- DHCP協議能給客戶推薦“裝修隊”PXE,能夠安裝操作系統,這個在雲計算領域大有用處。