上一節(jié)結(jié)尾給你留的一個思考題是,你知道怎么查看 IP 地址嗎五督?
當(dāng)面試聽到這個問題的時候藏否,面試者常常會覺得走錯了房間。我面試的是技術(shù)崗位啊充包,怎么問這么簡單的問題副签?
的確,即便沒有專業(yè)學(xué)過計算機的人基矮,只要倒騰過電腦淆储,重裝過系統(tǒng),大多也會知道這個問題的答案:在 Windows 上是 ipconfig家浇,在 Linux 上是 ifconfig本砰。
那你知道在 Linux 上還有什么其他命令可以查看 IP 地址嗎?答案是 ip addr钢悲。如果回答不上來這個問題点额,那你可能沒怎么用過 Linux舔株。
那你知道 ifconfig 和 ip addr 的區(qū)別嗎?這是一個有關(guān) net-tools 和 iproute2 的“歷史”故事还棱,你剛來到第三節(jié)载慈,暫時不用了解這么細,但這也是一個秤栈撸考的知識點娃肿。
想象一下,你登錄進入一個被裁剪過的非常小的 Linux 系統(tǒng)中珠十,發(fā)現(xiàn)既沒有 ifconfig 命令料扰,也沒有 ip addr 命令,你是不是感覺這個系統(tǒng)壓根兒沒法用焙蹭?這個時候晒杈,你可以自行安裝 net-tools 和 iproute2 這兩個工具。當(dāng)然孔厉,大多數(shù)時候這兩個命令是系統(tǒng)自帶的拯钻。
安裝好后,我們來運行一下 ip addr撰豺。不出意外粪般,應(yīng)該會輸出下面的內(nèi)容。
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
這個命令顯示了這臺機器上所有的網(wǎng)卡污桦。大部分的網(wǎng)卡都會有一個 IP 地址亩歹,當(dāng)然,這不是必須的凡橱。在后面的分享中小作,我們會遇到?jīng)]有 IP 地址的情況。
IP 地址是一個網(wǎng)卡在網(wǎng)絡(luò)世界的通訊地址稼钩,相當(dāng)于我們現(xiàn)實世界的門牌號碼顾稀。既然是門牌號碼,不能大家都一樣坝撑,不然就會起沖突静秆。比方說,假如大家都叫六單元 1001 號巡李,那快遞就找不到地方了抚笔。所以,有時候咱們的電腦彈出網(wǎng)絡(luò)地址沖突击儡,出現(xiàn)上不去網(wǎng)的情況塔沃,多半是 IP 地址沖突了蝠引。
如上輸出的結(jié)果阳谍,10.100.122.2 就是一個 IP 地址蛀柴。這個地址被點分隔為四個部分,每個部分 8 個 bit矫夯,所以 IP 地址總共是 32 位鸽疾。這樣產(chǎn)生的 IP 地址的數(shù)量很快就不夠用了。因為當(dāng)時設(shè)計 IP 地址的時候训貌,哪知道今天會有這么多的計算機爸瓢埂!因為不夠用递沪,于是就有了 IPv6豺鼻,也就是上面輸出結(jié)果里面 inet6 fe80::f816:3eff:fec7:7975/64。這個有 128 位款慨,現(xiàn)在看來是夠了儒飒,但是未來的事情誰知道呢?
本來 32 位的 IP 地址就不夠檩奠,還被分成了 5 類∽耍現(xiàn)在想想,當(dāng)時分配地址的時候埠戳,真是太奢侈了井誉。
在網(wǎng)絡(luò)地址中,至少在當(dāng)時設(shè)計的時候整胃,對于 A颗圣、B、 C 類主要分兩部分爪模,前面一部分是網(wǎng)絡(luò)號欠啤,后面一部分是主機號。這很好理解屋灌,大家都是六單元 1001 號洁段,我是小區(qū) A 的六單元 1001 號,而你是小區(qū) B 的六單元 1001 號共郭。
下面這個表格祠丝,詳細地展示了 A、B除嘹、C 三類地址所能包含的主機的數(shù)量写半。在后文中,我也會多次借助這個表格來講解尉咕。
這里面有個尷尬的事情叠蝇,就是 C 類地址能包含的最大主機數(shù)量實在太少了,只有 254 個年缎。當(dāng)時設(shè)計的時候恐怕沒想到悔捶,現(xiàn)在估計一個網(wǎng)吧都不夠用吧铃慷。而 B 類地址能包含的最大主機數(shù)量又太多了。6 萬多臺機器放在一個網(wǎng)絡(luò)下面蜕该,一般的企業(yè)基本達不到這個規(guī)模犁柜,閑著的地址就是浪費。
無類型域間選路(CIDR)
于是有了一個折中的方式叫作無類型域間選路堂淡,簡稱 CIDR馋缅。這種方式打破了原來設(shè)計的幾類地址的做法,將 32 位的 IP 地址一分為二绢淀,前面是網(wǎng)絡(luò)號萤悴,后面是主機號。從哪里分呢皆的?你如果注意觀察的話可以看到稚疹,10.100.122.2/24,這個 IP 地址中有一個斜杠祭务,斜杠后面有個數(shù)字 24内狗。這種地址表示形式,就是 CIDR义锥。后面 24 的意思是柳沙,32 位中,前 24 位是網(wǎng)絡(luò)號拌倍,后 8 位是主機號赂鲤。
伴隨著 CIDR 存在的,一個是廣播地址柱恤,10.100.122.255数初。如果發(fā)送這個地址,所有 10.100.122 網(wǎng)絡(luò)里面的機器都可以收到梗顺。另一個是子網(wǎng)掩碼泡孩,255.255.255.0。
將子網(wǎng)掩碼和 IP 地址進行 AND 計算寺谤。前面三個 255仑鸥,轉(zhuǎn)成二進制都是 1。1 和任何數(shù)值取 AND变屁,都是原來數(shù)值眼俊,因而前三個數(shù)不變,為 10.100.122粟关。后面一個 0疮胖,轉(zhuǎn)換成二進制是 0,0 和任何數(shù)值取 AND,都是 0澎灸,因而最后一個數(shù)變?yōu)?0谷市,合起來就是 10.100.122.0。這就是網(wǎng)絡(luò)號击孩。將子網(wǎng)掩碼和 IP 地址按位計算 AND,就可得到網(wǎng)絡(luò)號鹏漆。
公有 IP 地址和私有 IP 地址
在日常的工作中巩梢,幾乎不用劃分 A 類、B 類或者 C 類艺玲,所以時間長了括蝠,很多人就忘記了這個分類,而只記得 CIDR饭聚。但是有一點還是要注意的忌警,就是公有 IP 地址和私有 IP 地址。
我們繼續(xù)看上面的表格秒梳。表格最右列是私有 IP 地址段法绵。平時我們看到的數(shù)據(jù)中心里,辦公室酪碘、家里或?qū)W校的 IP 地址朋譬,一般都是私有 IP 地址段。因為這些地址允許組織內(nèi)部的 IT 人員自己管理兴垦、自己分配徙赢,而且可以重復(fù)。因此探越,你學(xué)校的某個私有 IP 地址段和我學(xué)校的可以是一樣的狡赐。
這就像每個小區(qū)有自己的樓編號和門牌號,你們小區(qū)可以叫 6 棟钦幔,我們小區(qū)也叫 6 棟枕屉,沒有任何問題。但是一旦出了小區(qū)鲤氢,就需要使用公有 IP 地址搀庶。就像人民路 888 號,是國家統(tǒng)一分配的铜异,不能兩個小區(qū)都叫人民路 888 號哥倔。
公有 IP 地址有個組織統(tǒng)一分配,你需要去買揍庄。如果你搭建一個網(wǎng)站咆蒿,給你學(xué)校的人使用,讓你們學(xué)校的 IT 人員給你一個 IP 地址就行。但是假如你要做一個類似網(wǎng)易 163 這樣的網(wǎng)站沃测,就需要有公有 IP 地址缭黔,這樣全世界的人才能訪問。
表格中的 192.168.0.x 是最常用的私有 IP 地址蒂破。你家里有 Wi-Fi馏谨,對應(yīng)就會有一個 IP 地址。一般你家里地上網(wǎng)設(shè)備不會超過 256 個附迷,所以 /24 基本就夠了惧互。有時候我們也能見到 /16 的 CIDR,這兩種是最常見的喇伯,也是最容易理解的喊儡。
不需要將十進制轉(zhuǎn)換為二進制 32 位,就能明顯看出 192.168.0 是網(wǎng)絡(luò)號稻据,后面是主機號艾猜。而整個網(wǎng)絡(luò)里面的第一個地址 192.168.0.1,往往就是你這個私有網(wǎng)絡(luò)的出口地址捻悯。例如匆赃,你家里的電腦連接 Wi-Fi,Wi-Fi 路由器的地址就是 192.168.0.1今缚,而 192.168.0.255 就是廣播地址炸庞。一旦發(fā)送這個地址,整個 192.168.0 網(wǎng)絡(luò)里面的所有機器都能收到荚斯。
但是也不總都是這樣的情況埠居。因此,其他情況往往就會很難理解事期,還容易出錯滥壕。
舉例:一個容易“犯錯”的 CIDR
我們來看 16.158.165.91/22 這個 CIDR。求一下這個網(wǎng)絡(luò)的第一個地址兽泣、子網(wǎng)掩碼和廣播地址绎橘。
你要是上來就寫 16.158.165.1,那就大錯特錯了唠倦。
/22 不是 8 的整數(shù)倍称鳞,不好辦,只能先變成二進制來看稠鼻。16.158 的部分不會動冈止,它占了前 16 位。中間的 165候齿,變?yōu)槎M制為10100101熙暴。除了前面的 16 位闺属,還剩 6 位。所以周霉,這 8 位中前 6 位是網(wǎng)絡(luò)號掂器,16.158.<101001>,而 <01>.91 是機器號俱箱。
第一個地址是 16.158.<101001><00>.1国瓮,即 16.158.164.1。子網(wǎng)掩碼是 255.255.<111111><00>.0狞谱,即 255.255.252.0乃摹。廣播地址為 16.158.<101001><11>.255,即 16.158.167.255芋簿。
這五類地址中,還有一類 D 類是組播地址璃饱。使用這一類地址与斤,屬于某個組的機器都能收到。這有點類似在公司里面大家都加入了一個郵件組荚恶。發(fā)送郵件撩穿,加入這個組的都能收到。組播地址在后面講述 VXLAN 協(xié)議的時候會提到谒撼。
講了這么多食寡,才講了上面的輸出結(jié)果中很小的一部分,是不是覺得原來并沒有真的理解 ip addr 呢廓潜?我們接著來分析抵皱。
在 IP 地址的后面有個 scope,對于 eth0 這張網(wǎng)卡來講辩蛋,是 global呻畸,說明這張網(wǎng)卡是可以對外的,可以接收來自各個地方的包悼院。對于 lo 來講伤为,是 host,說明這張網(wǎng)卡僅僅可以供本機相互通信据途。
lo 全稱是 loopback绞愚,又稱環(huán)回接口,往往會被分配到 127.0.0.1 這個地址颖医。這個地址用于本機通信位衩,經(jīng)過內(nèi)核處理后直接返回,不會在任何網(wǎng)絡(luò)中出現(xiàn)熔萧。
MAC 地址
在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff蚂四,這個被稱為 MAC 地址光戈,是一個網(wǎng)卡的物理地址,用十六進制遂赠,6 個 byte 表示久妆。
MAC 地址是一個很容易讓人“誤解”的地址。因為 MAC 地址號稱全局唯一跷睦,不會有兩個網(wǎng)卡有相同的 MAC 地址筷弦,而且網(wǎng)卡自生產(chǎn)出來,就帶著這個地址抑诸。很多人看到這里就會想烂琴,既然這樣,整個互聯(lián)網(wǎng)的通信蜕乡,全部用 MAC 地址好了奸绷,只要知道了對方的 MAC 地址,就可以把信息傳過去层玲。
這樣當(dāng)然是不行的号醉。 一個網(wǎng)絡(luò)包要從一個地方傳到另一個地方,除了要有確定的地址辛块,還需要有定位功能畔派。 而有門牌號碼屬性的 IP 地址,才是有遠程定位功能的润绵。
例如线椰,你去杭州市網(wǎng)商路 599 號 B 樓 6 層找劉超,你在路上問路尘盼,可能被問的人不知道 B 樓是哪個憨愉,但是可以給你指網(wǎng)商路怎么去。但是如果你問一個人卿捎,你知道這個身份證號的人在哪里嗎莱衩?可想而知,沒有人知道娇澎。
MAC 地址更像是身份證笨蚁,是一個唯一的標識。它的唯一性設(shè)計是為了組網(wǎng)的時候趟庄,不同的網(wǎng)卡放在一個網(wǎng)絡(luò)里面的時候括细,可以不用擔(dān)心沖突。從硬件角度戚啥,保證不同的網(wǎng)卡有不同的標識奋单。
MAC 地址是有一定定位功能的,只不過范圍非常有限猫十。你可以根據(jù) IP 地址览濒,找到杭州市網(wǎng)商路 599 號 B 樓 6 層呆盖,但是依然找不到我,你就可以靠吼了贷笛,大聲喊身份證 XXXX 的是哪位应又?我聽到了,我就會站起來說乏苦,是我啊株扛。但是如果你在上海,到處喊身份證 XXXX 的是哪位汇荐,我不在現(xiàn)場洞就,當(dāng)然不會回答,因為我在杭州不在上海掀淘。
所以旬蟋,MAC 地址的通信范圍比較小,局限在一個子網(wǎng)里面革娄。例如倾贰,從 192.168.0.2/24 訪問 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子網(wǎng)稠腊,即從 192.168.0.2/24 到 192.168.1.2/24躁染,MAC 地址就不行了鸣哀,需要 IP 地址起作用了架忌。
網(wǎng)絡(luò)設(shè)備的狀態(tài)標識
解析完了 MAC 地址,我們再來看 <BROADCAST,MULTICAST,UP,LOWER_UP> 是干什么的我衬?這個叫做 net_device flags叹放,網(wǎng)絡(luò)設(shè)備的狀態(tài)標識。
UP 表示網(wǎng)卡處于啟動的狀態(tài)挠羔;BROADCAST 表示這個網(wǎng)卡有廣播地址井仰,可以發(fā)送廣播包;MULTICAST 表示網(wǎng)卡可以發(fā)送多播包破加;LOWER_UP 表示 L1 是啟動的俱恶,也即網(wǎng)線插著呢。MTU1500 是指什么意思呢范舀?是哪一層的概念呢合是?最大傳輸單元 MTU 為 1500,這是以太網(wǎng)的默認值锭环。
上一節(jié)聪全,我們講過網(wǎng)絡(luò)包是層層封裝的。MTU 是二層 MAC 層的概念辅辩。MAC 層有 MAC 的頭难礼,以太網(wǎng)規(guī)定正文部分不允許超過 1500 個字節(jié)娃圆。正文里面有 IP 的頭、TCP 的頭蛾茉、HTTP 的頭讼呢。如果放不下,就需要分片來傳輸臀稚。
qdisc pfifo_fast 是什么意思呢吝岭?qdisc 全稱是 queueing discipline,中文叫排隊規(guī)則吧寺。內(nèi)核如果需要通過某個網(wǎng)絡(luò)接口發(fā)送數(shù)據(jù)包窜管,它都需要按照為這個接口配置的 qdisc(排隊規(guī)則)把數(shù)據(jù)包加入隊列。
最簡單的 qdisc 是 pfifo稚机,它不對進入的數(shù)據(jù)包做任何的處理幕帆,數(shù)據(jù)包采用先入先出的方式通過隊列。pfifo_fast 稍微復(fù)雜一些赖条,它的隊列包括三個波段(band)失乾。在每個波段里面,使用先進先出規(guī)則纬乍。
三個波段(band)的優(yōu)先級也不相同碱茁。band 0 的優(yōu)先級最高,band 2 的最低仿贬。如果 band 0 里面有數(shù)據(jù)包纽竣,系統(tǒng)就不會處理 band 1 里面的數(shù)據(jù)包,band 1 和 band 2 之間也是一樣茧泪。
數(shù)據(jù)包是按照服務(wù)類型(Type of Service蜓氨,TOS)被分配到三個波段(band)里面的。TOS 是 IP 頭里面的一個字段队伟,代表了當(dāng)前的包是高優(yōu)先級的穴吹,還是低優(yōu)先級的。
隊列是個好東西嗜侮,后面我們講云計算中的網(wǎng)絡(luò)的時候港令,會有很多用戶共享一個網(wǎng)絡(luò)出口的情況,這個時候如何排隊锈颗,每個隊列有多粗顷霹,隊列處理速度應(yīng)該怎么提升,我都會詳細為你講解宜猜。
小結(jié)
怎么樣泼返,看起來很簡單的一個命令,里面學(xué)問很大吧姨拥?通過這一節(jié)绅喉,希望你能記住以下的知識點渠鸽,后面都能用得上:
IP 是地址,有定位功能柴罐;MAC 是身份證徽缚,無定位功能;
CIDR 可以用來判斷是不是本地人革屠;
IP 分公有的 IP 和私有的 IP凿试。后面的章節(jié)中我會談到“出國門”,就與這個有關(guān)似芝。
最后那婉,給你留兩個思考題。
你知道 net-tools 和 iproute2 的“歷史”故事嗎党瓮?
這一節(jié)講的是如何查看 IP 地址详炬,那你知道 IP 地址是怎么來的嗎?
歡迎你留言和我討論寞奸。