為IPv4地址有限,最大42億個。為了更好的利用這有限的IP數(shù)量,網(wǎng)絡(luò)分為局域網(wǎng)和廣域網(wǎng),將IP分為了私有IP和公網(wǎng)IP,一個局域網(wǎng)里的N多臺機器都可以共用一個公網(wǎng)IP,從而大大增加了"可用IP數(shù)量"。
當(dāng)我們需要發(fā)送網(wǎng)絡(luò)包的時候,在IP層,需要填入源IP地址,和目的IP地址,也就是對應(yīng)快遞的發(fā)貨地址和收貨地址。
但是我們家里的局域網(wǎng)內(nèi),基本上都用192.168.xx.xx這樣的私有IP。
如果我們在發(fā)送網(wǎng)絡(luò)包的時候,這么填。對方在回數(shù)據(jù)包的時候該怎么回?畢竟千家萬戶人用的都是192.168.0.1,網(wǎng)絡(luò)怎么知道該發(fā)給誰?
所以肯定需要將這個192.168.xx私有IP轉(zhuǎn)換成公有IP。
因此在上篇文章最后,留了這么個問題。局域網(wǎng)內(nèi)用的是私有IP,公網(wǎng)用的都是公有IP。一個局域網(wǎng)里的私有IP想訪問局域網(wǎng)外的公有IP,必然要做個IP轉(zhuǎn)換,這是在哪里做的轉(zhuǎn)換呢?
答案是NAT設(shè)備,全稱Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換。基本上家用路由器都支持這功能。
我們來聊下它是怎么工作的:
為了簡單,我們假設(shè)你很富,你家里分到了一個公網(wǎng)IP地址 20.20.20.20,對應(yīng)配到了你家自帶NAT功能的家用路由器上,你家里需要上網(wǎng)的設(shè)備有很多,比如你的手機,電腦都需要上網(wǎng),他們構(gòu)成了一個局域網(wǎng),用的都是私有IP,比如192.168.xx。其中你在電腦上執(zhí)行ifconfig命令,發(fā)現(xiàn)家里的電腦IP是192.168.30.5。 你要訪問的公網(wǎng)IP地址是30.30.30.30。
于是就有下面這樣一張圖
當(dāng)你準(zhǔn)備發(fā)送數(shù)據(jù)包的時候,你的電腦內(nèi)核協(xié)議棧就會構(gòu)造一個IP數(shù)據(jù)包。這個IP數(shù)據(jù)包報頭里的發(fā)送端IP地址填的就是192.168.30.5,接收端IP地址就是30.30.30.30。將數(shù)據(jù)包發(fā)到NAT路由器中。
此時NAT路由器會將IP數(shù)據(jù)包里的源IP地址修改一下,私有IP地址192.168.30.5改寫為公網(wǎng)IP地址20.20.20.20,這叫SNAT(Source Network Address Translation,源地址轉(zhuǎn)換)。并且還會在NAT路由器內(nèi)部留下一條 192.168.30.5 -> 20.20.20.20的映射記錄,這個信息會在后面用到。之后IP數(shù)據(jù)包經(jīng)過公網(wǎng)里各個路由器的轉(zhuǎn)發(fā),發(fā)到了接收端30.30.30.30,到這里發(fā)送流程結(jié)束。
如果接收端處理完數(shù)據(jù)了,需要發(fā)一個響應(yīng)給你的電腦,那就需要將發(fā)送端IP地址填上自己的30.30.30.30,將接收端地址填為你的公網(wǎng)IP地址20.20.20.20,發(fā)往NAT路由器。NAT路由器收到公網(wǎng)來的消息之后,會檢查下自己之前留下的映射信息,發(fā)現(xiàn)之前留下了這么一條 192.168.30.5 -> 20.20.20.20記錄,就會將這個數(shù)據(jù)包的目的IP地址修改一下,變成內(nèi)網(wǎng)IP地址192.168.30.5, 這也叫DNAT(Destination Network Address Translation,目的地址轉(zhuǎn)換)。 之后將其轉(zhuǎn)發(fā)給你的電腦上。
整個過程下來,NAT悄悄的改了IP數(shù)據(jù)包的發(fā)送和接收端IP地址,但對真正的發(fā)送方和接收方來說,他們卻對這件事情,一無所知。
這就是NAT的工作原理。
到這里,相信大家都有一個很大的疑問。
局域網(wǎng)里并不只有一臺機器,局域網(wǎng)內(nèi)每臺機器都在NAT下留下的映射信息都會是 192.168.xx.xx -> 20.20.20.20,發(fā)送消息是沒啥事,但接收消息的時候就不知道該回給誰了。
這問題相當(dāng)致命,因此實際上大部分時候不會使用普通的NAT。
那怎么辦呢?
問題出在我們沒辦法區(qū)分內(nèi)網(wǎng)里的多個網(wǎng)絡(luò)連接。
于是乎:
我們可以加入其他信息去區(qū)分內(nèi)網(wǎng)里的各個網(wǎng)絡(luò)連接,很自然就能想到端口。
但IP數(shù)據(jù)包(網(wǎng)絡(luò)層)本身是沒有端口信息的。常見的傳輸層協(xié)議TCP和UDP數(shù)據(jù)報文里才有端口的信息。
于是流程就變成了下面這樣子:
當(dāng)你準(zhǔn)備發(fā)送數(shù)據(jù)包的時候,你的電腦內(nèi)核協(xié)議棧就會先構(gòu)造一個TCP或者UDP數(shù)據(jù)報頭,里面寫入端口號,比如發(fā)送端口是5000,接收端口是3000,然后在這個基礎(chǔ)上,加入IP數(shù)據(jù)報頭,填入發(fā)送端和接收端的IP地址。
那數(shù)據(jù)包長這樣。
假設(shè),發(fā)送端IP地址填的就是192.168.30.5,接收端IP地址就是30.30.30.30。
將數(shù)據(jù)包發(fā)到NAT路由器中。
此時NAT路由器會將IP數(shù)據(jù)包里的源IP地址和端口號修改一下,從192.168.30.5:5000改寫成20.20.20.20:6000。并且還會在NAT路由器內(nèi)部留下一條 192.168.30.5:5000 -> 20.20.20.20:6000的映射記錄。之后數(shù)據(jù)包經(jīng)過公網(wǎng)里各個路由器的轉(zhuǎn)發(fā),發(fā)到了接收端30.30.30.30:3000,到這里發(fā)送流程結(jié)束。
接收端響應(yīng)時,就會在數(shù)據(jù)包里填入發(fā)送端地址是30.30.30.30:3000,將接收端是20.20.20.20:6000,發(fā)往NAT路由器。NAT路由器發(fā)現(xiàn)下自己之前留下過這么一條 192.168.30.5:5000 -> 20.20.20.20:6000的記錄,就會將這個數(shù)據(jù)包的目的IP地址和端口修改一下,變回原來的192.168.30.5:5000。 之后將其轉(zhuǎn)發(fā)給你的電腦上。
如果局域網(wǎng)內(nèi)有多個設(shè)備,他們就會映射到不同的公網(wǎng)端口上,畢竟端口最大可達65535,完全夠用。這樣大家都可以相安無事。
像這種同時轉(zhuǎn)換IP和端口的技術(shù),就是NAPT(Network Address Port Transfer , 網(wǎng)絡(luò)地址端口轉(zhuǎn)換 )。
看到這里,問題就來了。
那這么說只有用到端口的網(wǎng)絡(luò)協(xié)議才能被NAT識別出來并轉(zhuǎn)發(fā)?
但這怎么解釋ping命令?ping基于ICMP協(xié)議,而ICMP協(xié)議報文里并不帶端口信息。我依然可以正常的ping通公網(wǎng)機器并收到回包。
事實上針對ICMP協(xié)議,NAT路由器做了特殊處理。ping報文頭里有個Identifier的信息,它其實指的是放出ping命令的進程id。
對NAT路由器來說,這個Identifier的作用就跟端口一樣。
另外,當(dāng)我們?nèi)プグ臅r候,就會發(fā)現(xiàn)有兩個Identifier,一個后面帶個BE(Big Endian),另一個帶個LE(Little Endian)。
其實他們都是同一個數(shù)值,只不過大小端不同,讀出來的值不一樣。就好像同樣的數(shù)字345,反著讀就成了543。這是為了兼容不同操作系統(tǒng)(比如linux和Windows)下大小端不同的情況。
看到這里,我們大概也發(fā)現(xiàn)了。使用了NAT上網(wǎng)的話,前提得內(nèi)網(wǎng)機器主動請求公網(wǎng)IP,這樣NAT才能將內(nèi)網(wǎng)的IP端口轉(zhuǎn)成外網(wǎng)IP端口。
反過來公網(wǎng)的機器想主動請求內(nèi)網(wǎng)機器,就會被攔在NAT路由器上,此時由于NAT路由器并沒有任何相關(guān)的IP端口的映射記錄,因此也就不會轉(zhuǎn)發(fā)數(shù)據(jù)給內(nèi)網(wǎng)里的任何一臺機器。
舉個現(xiàn)實中的場景就是,你在你家里的電腦上啟動了一個HTTP服務(wù),地址是192.168.30.5:5000,此時你在公司辦公室里想通過手機去訪問一下,卻發(fā)現(xiàn)訪問不了。
那問題就來了,有沒有辦法讓外網(wǎng)機器訪問到內(nèi)網(wǎng)的服務(wù)?
有。
大家應(yīng)該聽過一句話叫,"沒有什么是加中間層不能解決的,如果有,那就再加一層"。
放在這里,依然適用。
說到底,因為NAT的存在,我們只能從內(nèi)網(wǎng)主動發(fā)起連接,否則NAT設(shè)備不會記錄相應(yīng)的映射關(guān)系,沒有映射關(guān)系也就不能轉(zhuǎn)發(fā)數(shù)據(jù)。
所以我們就在公網(wǎng)上加一臺服務(wù)器x,并暴露一個訪問域名,再讓內(nèi)網(wǎng)的服務(wù)主動連接服務(wù)器x,這樣NAT路由器上就有對應(yīng)的映射關(guān)系。接著,所有人都去訪問服務(wù)器x,服務(wù)器x將數(shù)據(jù)轉(zhuǎn)發(fā)給內(nèi)網(wǎng)機器,再原路返回響應(yīng),這樣數(shù)據(jù)就都通了。這就是所謂的內(nèi)網(wǎng)穿透。
像上面提到的服務(wù)器x,你也不需要自己去搭,已經(jīng)有很多現(xiàn)成的方案,花錢就完事了,比如花某殼。
到這里,我們就可以回答文章標(biāo)題的問題。
為什么我在公司里訪問不了家里的電腦?
那是因為家里的電腦在局域網(wǎng)內(nèi),局域網(wǎng)和廣域網(wǎng)之間有個NAT路由器。由于NAT路由器的存在,外網(wǎng)服務(wù)無法主動連通局域網(wǎng)內(nèi)的電腦。
好了,問題就叒來了。
我家機子是在我們小區(qū)的局域網(wǎng)里,班花家的機子也是在她們小區(qū)的局域網(wǎng)里。都在局域網(wǎng)里,且NAT只能從內(nèi)網(wǎng)連到外網(wǎng),那我電腦上登錄的QQ是怎么和班花電腦里的QQ連上的呢?
上面這個問法其實是存在個誤解,誤以為兩個qq客戶端應(yīng)用是直接建立連接的。
然而實際上并不是,兩個qq客戶端之間還隔了一個服務(wù)器。
也就是說,兩個在內(nèi)網(wǎng)的客戶端登錄qq時都會主動向公網(wǎng)的聊天服務(wù)器建立連接,這時兩方的NAT路由器中都會記錄有相應(yīng)的映射關(guān)系。當(dāng)在其中一個qq上發(fā)送消息時,數(shù)據(jù)會先到服務(wù)器,再通過服務(wù)器轉(zhuǎn)發(fā)到另外一個客戶端上。反過來也一樣,通過這個方式讓兩臺內(nèi)網(wǎng)的機子進行數(shù)據(jù)傳輸。
上面的情況,是兩個客戶端通過第三方服務(wù)器進行通訊,但有些場景就是要拋開第三端,直接進行兩端通信,比如P2P下載,這種該怎么辦呢?
這種情況下,其實也還是離不開第三方服務(wù)器的幫助。
假設(shè)還是A和B兩個局域網(wǎng)內(nèi)的機子,A內(nèi)網(wǎng)對應(yīng)的NAT設(shè)備叫NAT_A,B內(nèi)網(wǎng)里的NAT設(shè)備叫NAT_B,和一個第三方服務(wù)器server。
流程如下:
step1和2: A主動去連server,此時A對應(yīng)的NAT_A就會留下A的內(nèi)網(wǎng)地址和外網(wǎng)地址的映射關(guān)系,server也拿到了A對應(yīng)的外網(wǎng)IP地址和端口。
step3和4: B的操作和A一樣,主動連第三方server,NAT_B內(nèi)留下B的內(nèi)網(wǎng)地址和外網(wǎng)地址的映射關(guān)系,然后server也拿到了B對應(yīng)的外網(wǎng)IP地址和端口。
step5和step6以及step7: 重點來了。此時server發(fā)消息給A,讓A主動發(fā)UDP消息到B的外網(wǎng)IP地址和端口。此時NAT_B收到這個A的UDP數(shù)據(jù)包時,這時候根據(jù)NAT_B的設(shè)置不同,導(dǎo)致這時候有可能NAT_B能直接轉(zhuǎn)發(fā)數(shù)據(jù)到B,那此時A和B就通了。但也有可能不通,直接丟包,不過丟包沒關(guān)系,這個操作的目的是給NAT_A上留下有關(guān)B的映射關(guān)系。
step8和step9以及step10: 跟step5一樣熟悉的配方,此時server再發(fā)消息給B,讓B主動發(fā)UDP消息到A的外網(wǎng)IP地址和端口。NAT_B上也留下了關(guān)于A到映射關(guān)系,這時候由于之前NAT_A上有過關(guān)于B的映射關(guān)系,此時NAT_A就能正常接受B的數(shù)據(jù)包,并將其轉(zhuǎn)發(fā)給A。到這里A和B就能正常進行數(shù)據(jù)通信了。這就是所謂的NAT打洞。
step11: 注意,之前我們都是用的UDP數(shù)據(jù)包,目的只是為了在兩個局域網(wǎng)的NAT上打個洞出來,實際上大部分應(yīng)用用的都是TCP連接,所以,這時候我們還需要在A主動向B發(fā)起TCP連接。到此,我們就完成了兩端之間的通信。
這里估計大家會有疑惑。
其實并不會,端口重復(fù)占用的報錯常見于兩個TCP連接在不使用SO_REUSEADDR的情況下,重復(fù)使用了某個IP端口。而UDP和TCP之間卻不會報這個錯。之所以會有這個錯,主要是因為在一個linux內(nèi)核中,內(nèi)核收到網(wǎng)絡(luò)數(shù)據(jù)時,會通過五元組(傳輸協(xié)議,源IP,目的IP,源端口,目的端口)去唯一確定數(shù)據(jù)接受者。當(dāng)五元組都一模一樣的時候,內(nèi)核就不知道該把數(shù)據(jù)發(fā)給誰。而UDP和TCP之間"傳輸協(xié)議"不同,因此五元組也不同,所以也就不會有上面的問題。
關(guān)于NAPT,確實還細分為好幾種類型,比如完全錐形NAT和限制型NAT啥的,但這并不是本文的重點。所以我就略過了。我們現(xiàn)在常見的都是錐形NAT。上面的打洞方案適用于大部分場景,這其中包括限制最多的端口受限錐形NAT。
最后留個問題,有了NAT之后,原本并不富裕的IPv4地址突然就變得非常夠用了。
那我們?yōu)槭裁催€需要IPv6?
另外IPv6號稱地址多到每粒沙子都能擁有自己的IP地址,那我們還需要NAT嗎?
作者:小白debug
鏈接:https://juejin.cn/post/7170850066473680927
來源:稀土掘金
家好我是大明本期內(nèi)容講解"電腦一直顯示無法連接到網(wǎng)絡(luò)"這個問題的解決方法、
本期我之所以選擇這個問題來講解是因為這類問題比較常見,而且與我們的生活和工作都息息相關(guān),電腦出現(xiàn)這類問題的原因大概有以下幾種、網(wǎng)卡驅(qū)動有問題,IP地址沖突,網(wǎng)絡(luò)本地連接異常,光貓或路由器的問題,當(dāng)處理這類問題的時候可以按照我所邏列出的以上幾種原因,依次檢查排除,那么接下來我就將解決這類問題的方法做一下詳細的描述、
首先第一步:依次點擊"網(wǎng)絡(luò)和共享”-“本地連接”-”診斷“,然后根據(jù)診斷的結(jié)果就可以找到是什么原因?qū)е碌膯栴},詳細操作步驟如下圖所示、
第二步:依次點擊“網(wǎng)絡(luò)和共享中心”-“本地連接”,查看一下“本地連接”是否被禁用,詳細操作步驟如下圖所示、
如果”本地連接“被禁用那么肯定是連接不到”網(wǎng)絡(luò)“的所以這步大家一定要記住,也是必需檢查的步驟!
第三步:右鍵單擊“計算機”選擇“設(shè)備管理器”查看一下“網(wǎng)卡驅(qū)動"是否呈現(xiàn)”問號“或”感嘆號“,可以重新安裝更新”網(wǎng)卡“驅(qū)動程序,詳細操作步驟如下圖所示、
第四步:如果是局域網(wǎng)中的電腦打開”本地連接“更換一下IP地址,或者點擊”自動獲取“IP點擊”確定,詳細操作步驟如下圖所示、
第五步:如果通過上述步驟依然沒有解決這類問題,那么檢查一下“光貓”或“路由器”的運行狀態(tài)是否正常可以依次重啟這兩個設(shè)備,詳細操作步驟如下圖所示、
以上就是本期所分享的內(nèi)容希望對大家有所幫助、喜歡的話別忘記點贊 關(guān)注呦!大明會持續(xù)創(chuàng)作關(guān)于“電腦維護與應(yīng)用”的作品,還請大家踴躍評論 互相切磋,好了就講到這里咱們下期再見!
天寫一篇技術(shù)專題,因感到已超出了平常的技術(shù)處理,寫出來與同行探討學(xué)習(xí),相互交流,少走彎路。
最近比較忙,辦公室改造完畢后,添加了新的打印機,因才忙完井下巷道風(fēng)門的安裝,修整兩天,今天得空把自己用的電腦,準(zhǔn)備連上局域網(wǎng)共享的打印機。平常很快能處理掉的事情,今天卻花了我大半天的時間,所以覺得更應(yīng)該拿出來分享,網(wǎng)上搜索的答案還不是很完全。
對于平常的打印機連接我就不多介紹了,網(wǎng)上有,也就那三個步驟,不懂的朋友在正常情況下花點時間就可以搞定。如圖1
圖1
在三個選擇都沒有成功的情況下(有另一臺電腦已經(jīng)連接成功):網(wǎng)絡(luò)工作組顯示不了局域網(wǎng)內(nèi)的其他電腦、填寫IP地址法也不行、在客戶端上下載打印驅(qū)動也不行,我注意到了圖1第二項的結(jié)果,如下圖2
圖2
看著有點茫然,不知道什么原因,試了多遍也總是這個提示。點開隱蔽詳細信息,發(fā)現(xiàn)有0x0000052e錯誤碼,趕緊搜索,意為本機沒有windows憑證,好吧,再搜,按步驟操做到了下圖,添加Windows憑證,圖3
圖3
點擊添加Windows憑證后如圖4
圖4
又出現(xiàn)了新情況,共享主機的IP地址知道,用戶名和密碼不知道。
在計算機屬性里查用戶名,猜密碼為空格,填寫后還是連接失敗。
靈機一動查了安裝好后的客戶機(win10系統(tǒng))和共享主機(win7系統(tǒng))的Windows憑證。因同是win7,先查了主機,打開主機的憑證編輯,發(fā)現(xiàn)用戶名后面多了3456789,也不知道是從哪里來的,在圖4里先填上再說,填寫完畢后,確定保存!
重新連接還是連接失敗,這把人整的不知所措。
因安裝前為確定網(wǎng)路是否通暢,使用了PING命令,可以ping IP地址也可以ping計算機用戶名,抱著試試的想法,在圖4中第一個空格里把IP地址改成了計算機用戶名,其他不變,點保存,再添加第二個普通憑證,保存,退出。在圖1中第二項按要求輸入信息重新連接,顯示已開始安裝驅(qū)動,好事!基本成功!
突然屏幕又提示需提供安裝文件*INF,天!盡出幺蛾子!好在在前面想辦法時已經(jīng)安裝驅(qū)動,雖然沒成功,現(xiàn)在可能還能用上!繼續(xù)找,在某個文件夾下似乎找到了相匹配的后綴文件,點確定,安裝繼續(xù)。
成功!喜悅![耶][耶]
成功提示
打印機測試頁