今天這篇文章,很有意思,它來源于我曾經(jīng)的一次真實(shí)面試?yán)锏钠渲幸粋€(gè)小問題。當(dāng)時(shí)是終面,面我的是那家公司的技術(shù)顧問,在面試前hr還讓我看了他的履歷,是一位1996年就進(jìn)了麻省理工計(jì)算機(jī)系的大佬。
【資料圖】
屬實(shí)有被震驚到,什么概念?1996年,沒記錯(cuò)的話那是個(gè)用BP機(jī)和大哥大的年代?有幾個(gè)人能用上電腦?又有幾個(gè)人有這種機(jī)會(huì)能出國深造。
這是哪部爽文小說的主人公劇情?
就算放到現(xiàn)在,這也是非常強(qiáng)的事情。
我這輩子是沒希望了,也不知道我的兒子或者孫子輩有沒有機(jī)會(huì)能做到。
也就是說,這位大佬,至少領(lǐng)先了我兩代人。
那一天,我感受到了,那種跨越時(shí)代的碾壓感。
好了,不講騷話了,直接開始主題吧。
我們知道,如果你知道某臺(tái)電腦的IP,就可以向這個(gè)IP發(fā)起連接請(qǐng)求,建立連接后就可以操作收發(fā)數(shù)據(jù)。
五層網(wǎng)絡(luò)協(xié)議對(duì)應(yīng)的消息體變化分析
要發(fā)送的數(shù)據(jù),會(huì)在網(wǎng)絡(luò)層里加入IP頭。
ip報(bào)頭
這里面最重要的是發(fā)送端和接收端的IP地址。這個(gè)IP地址就像是一個(gè)門牌號(hào)一樣,有了它,數(shù)據(jù)包就能在這個(gè)紛繁復(fù)雜的網(wǎng)絡(luò)世界里找到該由誰來接收這個(gè)數(shù)據(jù)包。
所以說上面的網(wǎng)絡(luò)通信離不開IP。
假設(shè)我有一臺(tái)新買的電腦,還沒聯(lián)網(wǎng)呢,這時(shí)候拿著新買的網(wǎng)線,插入網(wǎng)線口,網(wǎng)線插口亮起來了。
然后就可以開始用它上網(wǎng)了。
那么問題來了。
剛插上網(wǎng)線,電腦怎么知道自己的IP是什么?怎么就突然能上網(wǎng)了呢?
這個(gè)話題,我們從DHCP聊起吧。
DHCP是什么插上網(wǎng)線之后,獲得IP的方式主要有兩種。
第一種是,自己手動(dòng)在電腦里配。像下圖那樣,是macOS的一個(gè)截圖,在選擇手動(dòng)配置之后,除了IP地址還需要配上子網(wǎng)掩碼和路由器的地址。
手動(dòng)配IP
這就很不科學(xué)了,電腦又不只是賣給程序員,這幾個(gè)詞對(duì)于大部分普通人來說,比賦能抓手閉環(huán)這種黑話還要難理解。
大部分人沒事都不應(yīng)該去配這玩意。
有沒有辦法可以讓這些IP信息自動(dòng)獲得?
有,這就是第二種獲取IP的方式,DHCP(DynamicHostConfigurationProtocol,動(dòng)態(tài)主機(jī)配置協(xié)議)。
DHCP自動(dòng)生成IP
通過DHCP,在聯(lián)網(wǎng)之后可以自動(dòng)獲取到本機(jī)需要的IP地址,子網(wǎng)掩碼還有路由器地址。
DHCP的工作原理DHCP的工作原理也非常簡(jiǎn)單。
說白了,就是向某個(gè)管IP分配的服務(wù)器,也就是DHCP服務(wù)器,申請(qǐng)IP地址。其實(shí)一般家里用的路由器就自帶這個(gè)功能。
整個(gè)操作流程分為4個(gè)階段。
DHCP協(xié)議
DHC?P Discover:在聯(lián)網(wǎng)時(shí),本機(jī)由于沒有IP,也不知道DHCP服務(wù)器的IP地址是多少,所以根本不知道該向誰發(fā)起請(qǐng)求,于是索性選擇廣播,向本地網(wǎng)段內(nèi)所有人發(fā)出消息,詢問"誰能給個(gè)IP用用"。DHCP Offer:不是DHCP服務(wù)器的機(jī)子會(huì)忽略你的廣播消息,而DHCP服務(wù)器收到消息后,會(huì)在自己維護(hù)的一個(gè)IP池里拿出一個(gè)空閑IP,通過廣播的形式給回你的電腦。DHCP Request:你的電腦在拿到IP后,再次發(fā)起廣播,就說"這個(gè)IP我要了"。DHCP ACK:DHCP服務(wù)器此時(shí)再回復(fù)你一個(gè)ACK,意思是"ok的"。你就正式獲得這個(gè)IP在一段時(shí)間(比如24小時(shí))里的使用權(quán)了。后續(xù)只要IP租約不過期,就可以一直用這個(gè)IP進(jìn)行通信了。到這里,問題來了
為什么要有第三和第四階段大家有沒有發(fā)現(xiàn),在Offer階段,其實(shí)你的機(jī)子就已經(jīng)拿到了IP了,為什么還要有后面的Request和ACK呢?是不是有些多此一舉?
這是因?yàn)楸镜鼐W(wǎng)段內(nèi),可能有不止一臺(tái)DHCP服務(wù)器,在你廣播之后,每個(gè)DHCP服務(wù)器都有可能給你發(fā)Offer。
本著先到先得的原則,你的機(jī)子一般會(huì)對(duì)第一個(gè)到的Offer響應(yīng)DHCP Request,目的是為了確認(rèn)offer,在你確認(rèn)Offer這段時(shí)間內(nèi),DHCP服務(wù)器確認(rèn)這個(gè)IP還沒被分出去,你才可以安心使用這個(gè)IP。
像不像你找工作的過程?
你海投簡(jiǎn)歷(DHCP Discover),然后拿到了多個(gè)offer(DHCP Offer)。
這時(shí)候事情還沒完,你一般會(huì)跟HR說:"你給我兩天時(shí)間,我要跟家里人商量下"。
HR也會(huì)對(duì)你說:"那你盡快確認(rèn),我這邊還有不少候選人等著"。
之后你考慮下來覺得不錯(cuò),跟HR說要接這個(gè)Offer(DHCP Request),HR看了下這個(gè)崗位還在,才能確認(rèn)讓你第二天來上班(DHCP ACK)。如果這個(gè)公司的崗位已經(jīng)招到其他候選人了,第四階段的消息就會(huì)改為發(fā)DHCP NAK,意思是拒絕了你的接Offer請(qǐng)求。
DHCP抓包光看原理是有些枯燥,我們可以嘗試下抓包看下數(shù)據(jù)。
在命令行里執(zhí)行下面的命令,可以強(qiáng)行讓電腦的en0網(wǎng)卡重新走一遍DHCP流程。
sudo ipconfig set en0 DHCP
en0可以替換成其他網(wǎng)卡,比如eth0啥的。
這時(shí)候就可以抓到相關(guān)的數(shù)據(jù)包。
我們可以看到藍(lán)色的四個(gè)數(shù)據(jù)包,分別對(duì)應(yīng)上面提到的四個(gè)DHCP階段。
其中第二階段中的DHCP Offer里會(huì)返回給我們需要的IP、子網(wǎng)掩碼、路由器地址以及DNS服務(wù)器地址。
offer階段
另外,通過抓包,我們可以發(fā)現(xiàn)DHCP是應(yīng)用層的協(xié)議,基于傳輸層UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸。
那么問題又來了。
為什么DHCP用UDP,能不能改用TCP?按道理說,UDP能做到的,TCP一般也能做到。但這次真不行。
主要原因還是因?yàn)門CP是面向連接的,而UDP是無連接的。
所謂"連接",他就只有一個(gè)發(fā)送端和一個(gè)接收端,就跟水管一樣。
而DHCP由于一開始并不知道要跟誰建立連接,所以只能通過廣播的形式發(fā)送消息,注意,小細(xì)節(jié),廣播。
廣播尋找DHCP服務(wù)器.drawio
同樣是在本地網(wǎng)段內(nèi)發(fā)廣播消息,UDP只需要發(fā)給255.255.255.255。它實(shí)際上并不是值某個(gè)具體的機(jī)器,而是一個(gè)特殊地址,這個(gè)地址有特殊含義,只要設(shè)了這個(gè)目的地址,就會(huì)在一定本地網(wǎng)段內(nèi)進(jìn)行廣播。
而TCP卻不同,它需要先建立連接,但實(shí)際上255.255.255.255對(duì)應(yīng)的機(jī)器并不存在,因此也不能建立連接。如果同樣要做到廣播的效果,就需要先得到本地網(wǎng)段內(nèi)所有機(jī)器的IP,然后挨個(gè)建立連接,再挨個(gè)發(fā)消息。這就很低效了。
因此DHCP選擇了UDP,而不是TCP。
為什么第二階段不是廣播,而是單播。另外一個(gè)小細(xì)節(jié)不知道大家注意到?jīng)],上面在提到 DHCP Offer 階段時(shí),提到的是DHCP服務(wù)器會(huì)使用廣播的形式回復(fù)。但抓個(gè)包下來卻發(fā)現(xiàn)并不是廣播,而是單播。
其實(shí),這是DHCP協(xié)議的一個(gè)小優(yōu)化。原則上大家在DHCP offer階段,都用廣播,那肯定是最穩(wěn)的,目標(biāo)機(jī)器收到后自然就會(huì)進(jìn)入第三階段DHCP Request。而非目標(biāo)機(jī)器,收到后解包后發(fā)現(xiàn)目的機(jī)器的mac地址跟自己的不同,也會(huì)丟掉這個(gè)包。
但是問題就出在,這個(gè)非目的機(jī)器需要每次都在網(wǎng)卡收到包,并解完包,才發(fā)現(xiàn)原來這不是給它的消息,這。。。真,有被打擾到。
如果本地網(wǎng)段內(nèi)這樣的包滿天飛,也浪費(fèi)機(jī)器性能。
如果能用單播,那當(dāng)然是最好的。但這時(shí)候目的機(jī)器其實(shí)并沒有IP地址,有些系統(tǒng)在這種情況下能收單播包,有些則認(rèn)為不能收,這個(gè)跟系統(tǒng)的實(shí)現(xiàn)有關(guān)。因此,對(duì)于能收單播包的系統(tǒng),會(huì)在發(fā)DHCP Discover階段設(shè)一個(gè)Broadcast flag = 0 (unicast)的標(biāo)志位,告訴服務(wù)器,支持單播回復(fù),于是服務(wù)器就會(huì)在DHCP Offer階段以單播的形式進(jìn)行回復(fù)。
Discover要求使用單播回復(fù)
是不是每次聯(lián)網(wǎng)都要經(jīng)歷DHCP四個(gè)階段?只要想聯(lián)網(wǎng),就需要IP,要用IP,就得走DHCP協(xié)議去分配。
但大家也發(fā)現(xiàn)了,DHCP第一階段和第二階段都可能會(huì)發(fā)廣播消息。對(duì)于家用電腦還好,插個(gè)網(wǎng)線,之后就雷打不動(dòng)。但像手機(jī)這樣的移動(dòng)設(shè)備,是要帶著到處跑的,坐個(gè)地鐵,進(jìn)個(gè)電梯,公司里到處走走,都可能會(huì)涉及到網(wǎng)絡(luò)切換。
這每次都要來一個(gè)完整的四階段,各種廣播消息滿天飛,其實(shí)對(duì)網(wǎng)絡(luò)環(huán)境不太友好。
于是問題叒來了,是不是每次聯(lián)網(wǎng)都要經(jīng)歷DHCP四個(gè)階段?
當(dāng)然不需要。
我們會(huì)發(fā)現(xiàn)每次斷開wifi再打開wifi時(shí),機(jī)子會(huì)經(jīng)歷一個(gè)從沒網(wǎng)到有網(wǎng)的過程。
這時(shí)候去抓個(gè)包,會(huì)發(fā)現(xiàn)。
其實(shí)只發(fā)生了DHCP的第三和第四階段。這是因?yàn)闄C(jī)子記錄了曾經(jīng)使用過192.168.31.170這個(gè)IP,重新聯(lián)網(wǎng)后,會(huì)優(yōu)先再次請(qǐng)求這個(gè)IP,這樣就省下了第一第二階段的廣播了。
另外需要注意的是,抓包圖里DHCP Request之所以出現(xiàn)兩次,是因?yàn)榈谝淮蜶equest發(fā)出后太久沒得到回應(yīng),因此重發(fā)。
DHCP分配下來的IP一定不會(huì)重復(fù)嗎?一般來說DHCP服務(wù)器會(huì)在它維護(hù)的IP池里找到一個(gè)沒人用的IP分配給機(jī)子,
這個(gè)IP如果重復(fù)分配了,那本地網(wǎng)段內(nèi)就會(huì)出現(xiàn)兩個(gè)同樣的IP,這個(gè)IP下面卻對(duì)應(yīng)兩個(gè)不同的mac地址。但其他機(jī)器上的ARP緩存中卻只會(huì)記錄其中一條mac地址到IP的映射關(guān)系。
于是,數(shù)據(jù)在傳遞的過程中就會(huì)出錯(cuò)。
因此本地網(wǎng)段內(nèi)IP必須唯一。
那么DHCP分配下來的IP有沒有可能跟別的IP是重復(fù)的?
都這么問了,那肯定是可能的。
有兩個(gè)常見的情況會(huì)出現(xiàn)IP重復(fù)。
文章開頭提到,IP是可以自己手動(dòng)配的,自己配的IP是有可能跟其他DHCP分配下來的IP是相同的。解決方案也很簡(jiǎn)單,盡量不要手動(dòng)去配IP,統(tǒng)一走DHCP?;蛘咴贒HCP服務(wù)器里維護(hù)的IP范圍里,將這條IP剔除。一個(gè)本地網(wǎng)段內(nèi),是可以有多個(gè)DHCP服務(wù)器的,而他們維護(hù)的IP地址范圍是有?可能重疊的,于是就有可能將相同的IP給到不同的機(jī)子。解決方案也很簡(jiǎn)單,修改兩臺(tái)DHCP服務(wù)器的維護(hù)的IP地址范圍,讓它們不重疊就行了。不過吧,上面的解決方案,都需要有權(quán)限去修改DHCP服務(wù)器。
得到DHCP ACK之后立馬就能使用這個(gè)IP了嗎?這就好像在問,拿到offer之后你是第一時(shí)間就去上班嗎?
不。
你會(huì)先告訴你的同事同學(xué)朋友,甚至?xí)l(fā)朋友圈。
你的機(jī)子也一樣。
在得到DHCP ACK之后,機(jī)子不會(huì)立刻就用這個(gè)IP。
而是會(huì)先發(fā)三條ARP消息。
大家知道ARP消息的目的是通過IP地址去獲得mac地址。所以普通的ARP消息里,是填了IP地址,不填mac地址的。
但這三條ARP協(xié)議,比較特殊,它們叫無償ARP(Gratuitous ARP),特點(diǎn)是它會(huì)把IP和mac地址都填好了,而且填的還是自己的IP和mac地址。
目的有兩個(gè)。
一個(gè)是為了告訴本地網(wǎng)段內(nèi)所有機(jī)子,從現(xiàn)在起,xx IP地址屬于xx mac地址,讓大家記錄在ARP緩存中。另一個(gè)就是看下本地網(wǎng)段里有沒有其他機(jī)子也用了這個(gè)IP,如果有沖突的話,那需要重新再走一次DHCP流程。在三次無償ARP消息之后,確認(rèn)沒有沖突了,才會(huì)開始使用這個(gè)IP地址進(jìn)行通信。
這種行為,實(shí)際上就跟你拿了offer之后發(fā)了這么個(gè)朋友圈沒啥區(qū)別。
而且,還連發(fā)了三條。
別罵了,圖是P的,我沒這么發(fā)過
秀offer,offer沖突了不可怕。秀對(duì)象秀沖突了才可怕。
如果你朋友圈里有這種人,答應(yīng)我,刪了吧。
總結(jié)電腦插上網(wǎng)線,聯(lián)網(wǎng)后會(huì)通過DHCP協(xié)議動(dòng)態(tài)申請(qǐng)一個(gè)IP,同時(shí)獲得子網(wǎng)掩碼,路由器地址等信息。DHCP分為四個(gè)階段,分別是 Discover,Offer, Request和ACK。如果曾經(jīng)連過這個(gè)網(wǎng),機(jī)器會(huì)記錄你上次使用的IP,再次連接時(shí)優(yōu)先使用原來的那個(gè)IP,因此只需要經(jīng)歷第三第四階段。DHCP是應(yīng)用層協(xié)議,考慮到需要支持廣播功能,底層使用的是UDP協(xié)議,而不是TCP協(xié)議。DHCP分配下來的IP是有可能跟某臺(tái)手動(dòng)配置的IP地址重復(fù)的。DHCP得到IP之后還會(huì)發(fā)3次無償ARP通告,在確認(rèn)沒有沖突后開始使用這個(gè)IP。最后給大家留個(gè)問題吧。我們上面的IP都是從DHCP服務(wù)器上申請(qǐng)的,在服務(wù)器返回DHCP Offer的時(shí)候,可以看到上面寫了DHCP服務(wù)器的IP。比如192.168.31.1,這明顯是個(gè)局域網(wǎng)內(nèi)的IP,但這能說明,你的DHCP服務(wù)器一定在這個(gè)局域網(wǎng)里嗎?
關(guān)鍵詞: 服務(wù)器的 第二階段 子網(wǎng)掩碼 解決方案 開始使用
X 關(guān)閉
X 關(guān)閉
- 南靖縣召開疫情防控工作推進(jìn)會(huì)
- 天天關(guān)注:華安:全縣疫情防控工作會(huì)召開
- 泉州臺(tái)商投資區(qū)黨工委主要領(lǐng)導(dǎo)帶隊(duì)調(diào)研督導(dǎo)疫情防控和新建學(xué)校規(guī)劃選址工作
- 環(huán)球信息:非凡十年丨泉港區(qū)持續(xù)優(yōu)化營商環(huán)境
- 每日信息:泉港區(qū)強(qiáng)調(diào)部署當(dāng)前疫情防控工作
- 當(dāng)前報(bào)道:漳州市醫(yī)院高新院區(qū)腦血管病中心將投用
- 世界要聞:石獅一企業(yè)產(chǎn)品通過第三批省級(jí)制造業(yè)單項(xiàng)冠軍產(chǎn)品復(fù)核
- 15G資費(fèi)不大降!三大運(yùn)營商誰提供的5G網(wǎng)速最快?中國信通院給出答案
- 2聯(lián)想拯救者Y70發(fā)布最新預(yù)告:售價(jià)2970元起 迄今最便宜的驍龍8+旗艦
- 3亞馬遜開始大規(guī)模推廣掌紋支付技術(shù) 顧客可使用“揮手付”結(jié)賬
- 4現(xiàn)代和起亞上半年出口20萬輛新能源汽車同比增長(zhǎng)30.6%
- 5如何讓居民5分鐘使用到各種設(shè)施?沙特“線性城市”來了
- 6AMD實(shí)現(xiàn)連續(xù)8個(gè)季度的增長(zhǎng) 季度營收首次突破60億美元利潤更是翻倍
- 7轉(zhuǎn)轉(zhuǎn)集團(tuán)發(fā)布2022年二季度手機(jī)行情報(bào)告:二手市場(chǎng)“飄香”
- 8充電寶100Wh等于多少毫安?鐵路旅客禁止、限制攜帶和托運(yùn)物品目錄
- 9好消息!京東與騰訊續(xù)簽三年戰(zhàn)略合作協(xié)議 加強(qiáng)技術(shù)創(chuàng)新與供應(yīng)鏈服務(wù)
- 10名創(chuàng)優(yōu)品擬通過香港IPO全球發(fā)售4100萬股 全球發(fā)售所得款項(xiàng)有什么用處?