www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > CPP開(kāi)發(fā)者
[導(dǎo)讀]你女神愛(ài)不愛(ài)你,你問(wèn)她,她可能不會(huì)告訴你。但網(wǎng)通不通,你ping一下就知道了??赡芸吹綐?biāo)題,你就知道答案了,但是你了解背后的原因嗎?那如果把127.0.0.1換成0.0.0.0或localhost會(huì)怎么樣呢?你知道這幾個(gè)IP有什么區(qū)別嗎?以前面試的時(shí)候就遇到過(guò)這個(gè)問(wèn)題,大家看個(gè)動(dòng)...

你女神愛(ài)不愛(ài)你,你問(wèn)她,她可能不會(huì)告訴你。


但網(wǎng)通不通,你ping一下就知道了。


可能看到標(biāo)題,你就知道答案了,但是你了解背后的原因嗎?那如果把127.0.0.1換成0.0.0.0或localhost會(huì)怎么樣呢?你知道這幾個(gè)IP有什么區(qū)別嗎?


以前面試的時(shí)候就遇到過(guò)這個(gè)問(wèn)題,大家看個(gè)動(dòng)圖了解下面試官和我當(dāng)時(shí)的場(chǎng)景,求當(dāng)時(shí)小白的心里陰影面積。


話不多說(shuō),我們直接開(kāi)車(chē)。


拔掉網(wǎng)線,斷網(wǎng)。


然后在控制臺(tái)輸入ping 127.0.0.1。


$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.080 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.079 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.079 ms
^C
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.074/0.081/0.093/0.006 ms
說(shuō)明,拔了網(wǎng)線,ping 127.0.0.1是能ping通的。


其實(shí)這篇文章看到這里,標(biāo)題前半個(gè)問(wèn)題已經(jīng)被回答了。但是我們可以再想深一點(diǎn)。


為什么斷網(wǎng)了還能ping通127.0.0.1呢?


這能說(shuō)明你不用交網(wǎng)費(fèi)就能上網(wǎng)嗎?


不能。


首先我們需要進(jìn)入基礎(chǔ)科普環(huán)節(jié)。


不懂的同學(xué)看了就懂了,懂的看了就當(dāng)查漏補(bǔ)缺吧。


什么是127.0.0.1

首先,這是個(gè)IPV4地址。


IPV4地址有32位,一個(gè)字節(jié)有8位,共4個(gè)字節(jié)。


其中127 開(kāi)頭的都屬于回環(huán)地址,也是IPV4的特殊地址,沒(méi)什么道理,就是人為規(guī)定的。


而127.0.0.1是眾多回環(huán)地址中的一個(gè)。之所以不是127.0.0.2,而是127.0.0.1,是因?yàn)樵创a里就是這么定義的,也沒(méi)什么道理。


/* Address to loopback in software to local host.  */
#define INADDR_LOOPBACK     0x7f000001 /* 127.0.0.1   */
回環(huán)地址IPv4的地址是32位的,2的32次方,大概是40 億。地球光人口就76億了,40億IP這點(diǎn)量,塞牙縫都不夠,實(shí)際上IP也確實(shí)用完了。


所以就有了IPV6,IPv6的地址是128位的,大概是2的128次方≈10的38次方。據(jù)說(shuō)地球的沙子數(shù)量大概是 10的23次方,所以IPV6的IP可以認(rèn)為用不完。


IPV4以8位一組,每組之間用 . 號(hào)隔開(kāi)。


IPV6就以16位為一組,每組之間用 : 號(hào)隔開(kāi)。如果全是0,那么可以省略不寫(xiě)。


ipv6回環(huán)地址在IPV4下的回環(huán)地址是127.0.0.1,在IPV6下,表達(dá)為::1。中間把連續(xù)的0給省略了,之所以不是7個(gè) 冒號(hào),而是2個(gè)冒號(hào): , 是因?yàn)橐粋€(gè) IPV6 地址中只允許出現(xiàn)?次兩個(gè)連續(xù)的冒號(hào)。


多說(shuō)一句:在IPV4下用的是 ping 127.0.0.1 命令。在IPV6下用的是 ping6  ::1 命令。


什么是 ping

ping 是應(yīng)用層命令,可以理解為它跟游戲或者聊天軟件屬于同一層。只不過(guò)聊天軟件可以收發(fā)消息,還能點(diǎn)個(gè)贊什么的,有很多復(fù)雜的功能。而 ping 作為一個(gè)小軟件,它的功能比較簡(jiǎn)單,就是嘗試發(fā)送一個(gè)小小的消息到目標(biāo)機(jī)器上,判斷目的機(jī)器是否可達(dá),其實(shí)也就是判斷目標(biāo)機(jī)器網(wǎng)絡(luò)是否能連通。


ping應(yīng)用的底層,用的是網(wǎng)絡(luò)層的ICMP協(xié)議。


IP和ICMP和Ping所在分層雖然ICMP協(xié)議和IP協(xié)議都屬于網(wǎng)絡(luò)層協(xié)議,但其實(shí)ICMP也是利用了IP協(xié)議進(jìn)行消息的傳輸。


ip和icmp的關(guān)系所以,大家在這里完全可以簡(jiǎn)單的理解為 ping 某個(gè)IP 就是往某個(gè)IP地址發(fā)個(gè)消息。


TCP發(fā)數(shù)據(jù)和ping的區(qū)別

一般情況下,我們會(huì)使用 TCP 進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸,那么我們可以看下它和 ping 的區(qū)別。


ping和普通發(fā)消息的關(guān)系ping和其他應(yīng)用層軟件都屬于應(yīng)用層。


那么我們橫向?qū)Ρ纫幌?,比方說(shuō)聊天軟件,如果用的是TCP的方式去發(fā)送消息。


為了發(fā)送消息,那就得先知道往哪發(fā)。linux里萬(wàn)物皆文件,那你要發(fā)消息的目的地,也是個(gè)文件,這里就引出了socket 的概念。


要使用socket, 那么首先需要?jiǎng)?chuàng)建它。


在 TCP 傳輸中創(chuàng)建的方式是socket(AF_INET, SOCK_STREAM, 0);,其中AF_INET表示將使用 IPV4 里 host:port 的方式去解析待會(huì)你輸入的網(wǎng)絡(luò)地址。SOCK_STREAM是指使用面向字節(jié)流的 TCP 協(xié)議,工作在傳輸層。


創(chuàng)建好了socket之后,就可以愉快的把要傳輸?shù)臄?shù)據(jù)寫(xiě)到這個(gè)文件里。調(diào)用 socket 的sendto接口的過(guò)程中進(jìn)程會(huì)從用戶(hù)態(tài)進(jìn)入到內(nèi)核態(tài),最后會(huì)調(diào)用到sock_sendmsg方法。


然后進(jìn)入傳輸層,帶上TCP頭。網(wǎng)絡(luò)層帶上IP頭,數(shù)據(jù)鏈路層帶上MAC頭等一系列操作后。進(jìn)入網(wǎng)卡的發(fā)送隊(duì)列 ring buffer ,順著網(wǎng)卡就發(fā)出去了。


回到ping, 整個(gè)過(guò)程也基本跟TCP發(fā)數(shù)據(jù)類(lèi)似,差異的地方主要在于,創(chuàng)建socket的時(shí)候用的是socket(AF_INET,SOCK_RAW,IPPROTO_ICMP),SOCK_RAW是原始套接字 ,工作在網(wǎng)絡(luò)層, 所以構(gòu)建ICMP(網(wǎng)絡(luò)層協(xié)議)的數(shù)據(jù),是再合適不過(guò)了。ping 在進(jìn)入內(nèi)核態(tài)后最后也是調(diào)用的sock_sendmsg方法,進(jìn)入到網(wǎng)絡(luò)層后加上ICMP和IP頭后,數(shù)據(jù)鏈路層加上MAC頭,也是順著網(wǎng)卡發(fā)出。因此 本質(zhì)上ping 跟 普通應(yīng)用發(fā)消息 在程序流程上沒(méi)太大差別。


這也解釋了為什么當(dāng)你發(fā)現(xiàn)懷疑網(wǎng)絡(luò)有問(wèn)題的時(shí)候,別人第一時(shí)間是問(wèn)你能ping通嗎?因?yàn)榭梢院?jiǎn)單理解為ping就是自己組了個(gè)數(shù)據(jù)包,讓系統(tǒng)按著其他軟件發(fā)送數(shù)據(jù)的路徑往外發(fā)一遍,能通的話說(shuō)明其他軟件發(fā)的數(shù)據(jù)也能通。


為什么斷網(wǎng)了還能 ping 通 127.0.0.1

前面提到,有網(wǎng)的情況下,ping 最后是通過(guò)網(wǎng)卡將數(shù)據(jù)發(fā)送出去的。


那么斷網(wǎng)的情況下,網(wǎng)卡已經(jīng)不工作了,ping 回環(huán)地址卻一切正常,我們可以看下這種情況下的工作原理。


ping回環(huán)地址從應(yīng)用層到傳輸層再到網(wǎng)絡(luò)層。這段路徑跟ping外網(wǎng)的時(shí)候是幾乎是一樣的。到了網(wǎng)絡(luò)層,系統(tǒng)會(huì)根據(jù)目的IP,在路由表中獲取對(duì)應(yīng)的路由信息,而這其中就包含選擇哪個(gè)網(wǎng)卡把消息發(fā)出。


當(dāng)發(fā)現(xiàn)目標(biāo)IP是外網(wǎng)IP時(shí),會(huì)從"真網(wǎng)卡"發(fā)出。


當(dāng)發(fā)現(xiàn)目標(biāo)IP是回環(huán)地址時(shí),就會(huì)選擇本地網(wǎng)卡。


本地網(wǎng)卡,其實(shí)就是個(gè)"假網(wǎng)卡",它不像"真網(wǎng)卡"那樣有個(gè)ring buffer什么的,"假網(wǎng)卡"會(huì)把數(shù)據(jù)推到一個(gè)叫input_pkt_queue的 鏈表 中。這個(gè)鏈表,其實(shí)是所有網(wǎng)卡共享的,上面掛著發(fā)給本機(jī)的各種消息。消息被發(fā)送到這個(gè)鏈表后,會(huì)再觸發(fā)一個(gè)軟中斷。


專(zhuān)門(mén)處理軟中斷的工具人"ksoftirqd" (這是個(gè)內(nèi)核線程),它在收到軟中斷后就會(huì)立馬去鏈表里把消息取出,然后順著數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層等層層往上傳遞最后給到應(yīng)用程序。


工具人ksoftirqdping 回環(huán)地址和通過(guò)TCP等各種協(xié)議發(fā)送數(shù)據(jù)到回環(huán)地址都是走這條路徑。整條路徑從發(fā)到收,都沒(méi)有經(jīng)過(guò)"真網(wǎng)卡"。之所以127.0.0.1叫本地回環(huán)地址,可以理解為,消息發(fā)出到這個(gè)地址上的話,就不會(huì)出網(wǎng)絡(luò),在本機(jī)打個(gè)轉(zhuǎn)就又回來(lái)了。所以斷網(wǎng),依然能ping通127.0.0.1。


ping回環(huán)地址和ping本機(jī)地址有什么區(qū)別

我們?cè)趍ac里執(zhí)行ifconfig。


$ ifconfig
lo0: flags=8049 mtu 16384
inet 127.0.0.1 netmask 0xff000000
...
en0: flags=8863 mtu 1500
inet 192.168.31.6 netmask 0xffffff00 broadcast 192.168.31.255
...
能看到 lo0,表示本地回環(huán)接口,對(duì)應(yīng)的地址,就是我們前面提到的 127.0.0.1 ,也就是回環(huán)地址。


和 eth0,表示本機(jī)第一塊網(wǎng)卡,對(duì)應(yīng)的IP地址是192.168.31.6,管它叫本機(jī)IP。


之前一直認(rèn)為ping本機(jī)IP的話會(huì)通過(guò)"真網(wǎng)卡"出去,然后遇到第一個(gè)路由器,再發(fā)回來(lái)到本機(jī)。


為了驗(yàn)證這個(gè)說(shuō)法,可以進(jìn)行抓包,但結(jié)果跟上面的說(shuō)法并不相同。


ping 127.0.0.1


ping 本機(jī)地址可以看到 ping 本機(jī)IP 跟 ping 回環(huán)地址一樣,相關(guān)的網(wǎng)絡(luò)數(shù)據(jù),都是走的  lo0,本地回環(huán)接口,也就是前面提到的"假網(wǎng)卡"。


只要走了本地回環(huán)接口,那數(shù)據(jù)都不會(huì)發(fā)送到網(wǎng)絡(luò)中,在本機(jī)網(wǎng)絡(luò)協(xié)議棧中兜一圈,就發(fā)回來(lái)了。因此 ping回環(huán)地址和ping本機(jī)地址沒(méi)有區(qū)別。


127.0.0.1 和 localhost 以及 0.0.0.0 有區(qū)別嗎

回到文章開(kāi)頭動(dòng)圖里的提問(wèn),算是面試八股文里的老??土?。


以前第一次用nginx的時(shí)候,發(fā)現(xiàn)用這幾個(gè)IP,都能正常訪問(wèn)到nginx的歡迎網(wǎng)頁(yè)。一度認(rèn)為這幾個(gè)IP都是一樣的。


訪問(wèn)127.0.0.1:80訪問(wèn)localhost:80訪問(wèn)0.0.0.0:80訪問(wèn)本機(jī)的IP地址但本質(zhì)上還是有些區(qū)別的。


首先localhost就不叫IP,它是一個(gè)域名,就跟"baidu.com",是一個(gè)形式的東西,只不過(guò)默認(rèn)會(huì)把它解析為127.0.0.1,當(dāng)然這可以在/etc/hosts文件下進(jìn)行修改。


所以默認(rèn)情況下,使用localhost跟使用127.0.0.1確實(shí)是沒(méi)區(qū)別的。


其次就是0.0.0.0,執(zhí)行 ping 0.0.0.0  ,是會(huì)失敗的,因?yàn)樗贗PV4中表示的是無(wú)效的目標(biāo)地址。


$ ping 0.0.0.0
PING 0.0.0.0 (0.0.0.0): 56 data bytes
ping: sendto: No route to host
ping: sendto: No route to host
但它還是很有用處的,回想下,我們啟動(dòng)服務(wù)器的時(shí)候,一般會(huì)listen一個(gè) IP 和端口,等待客戶(hù)端的連接。


如果此時(shí)listen的是本機(jī)的0.0.0.0, 那么它表示本機(jī)上的所有IPV4地址。


/* Address to accept any incoming messages. */
#define    INADDR_ANY      ((unsigned long int) 0x00000000) /* 0.0.0.0   */
舉個(gè)例子。剛剛提到的127.0.0.1和192.168.31.6,都是本機(jī)的IPV4地址,如果監(jiān)聽(tīng)0.0.0.0,那么用上面兩個(gè)地址,都能訪問(wèn)到這個(gè)服務(wù)器。


當(dāng)然, 客戶(hù)端connect時(shí),不能使用0.0.0.0。必須指明要連接哪個(gè)服務(wù)器IP。


總結(jié)

  • 127.0.0.1是回環(huán)地址。localhost是域名,但默認(rèn)等于127.0.0.1。


  • ping回環(huán)地址和ping本機(jī)地址,是一樣的,走的是lo0 "假網(wǎng)卡",都會(huì)經(jīng)過(guò)網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層等邏輯,最后在快要出網(wǎng)卡前狠狠拐了個(gè)彎, 將數(shù)據(jù)插入到一個(gè)鏈表后就軟中斷通知 ksoftirqd 來(lái)進(jìn)行收數(shù)據(jù)的邏輯,壓根就不出網(wǎng)絡(luò)。所以斷網(wǎng)了也能ping通回環(huán)地址。


  • 如果服務(wù)器listen的是0.0.0.0,那么此時(shí)用127.0.0.1和本機(jī)地址都可以訪問(wèn)到服務(wù)。


參考資料

《127.0.0.1 之本機(jī)網(wǎng)絡(luò)通信過(guò)程知多少 ?!》


- EOF -


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

上海2022年4月18日 /美通社/ -- 2022年4月,全球衛(wèi)浴科技和建筑給排水行業(yè)翹楚Geberit瑞士吉博力集團(tuán)面向中國(guó)市場(chǎng)正式首發(fā)其全新的吉博力AquaClean Spina濱娜一體式智能掛廁系列。憑借精湛的設(shè)...

關(guān)鍵字: pi

日內(nèi)瓦2022年4月7日 /美通社/ -- 創(chuàng)新型數(shù)字私人銀行Alpian SA(以下簡(jiǎn)稱(chēng)“Alpian”)今天宣布獲得瑞士金融市場(chǎng)監(jiān)管局(FINMA)授予的銀行業(yè)許可證并成功完成B+輪1900萬(wàn)瑞士法郎的融資,使Alp...

關(guān)鍵字: pi

Newman Capital的投資將助力大企業(yè)集團(tuán)對(duì)新興技術(shù)加以利用,并指導(dǎo)他們?nèi)绾卧谌找姘l(fā)展的Web3領(lǐng)域游刃有余 香港2022年4月6日...

關(guān)鍵字: pi

Azpiral功能豐富的忠誠(chéng)度與營(yíng)銷(xiāo)解決方案組合為PDI不斷擴(kuò)大的全球業(yè)務(wù)和解決方案組合,及其最近在歐洲市場(chǎng)進(jìn)行的其他收購(gòu)增添了諸多優(yōu)勢(shì)...

關(guān)鍵字: pi

(全球TMT2022年2月17日訊)為便利零售和石油批發(fā)行業(yè)提供企業(yè)管理軟件的全球性提供商PDI收購(gòu)了總部位于愛(ài)爾蘭的Azpiral,后者是一家基于云的數(shù)字消費(fèi)者參與解決方案領(lǐng)域領(lǐng)導(dǎo)者。 Azpiral成...

關(guān)鍵字: 軟件 pi

北京2021年12月16日 /美通社/ -- 耀世星輝(或“公司”)(GSMG.US)宣布收到來(lái)自公司原始股東TKK資本控股的正式通知,TKK資本控股已于2021年12月15日以每股1.70美元的固定價(jià)格完成了...

關(guān)鍵字: pi

(全球TMT2021年12月17日訊)耀世星輝宣布收到來(lái)自公司原始股東TKK資本控股的正式通知,TKK資本控股已于2021年12月15日以每股1.70美元的固定價(jià)格完成了公司5,726,000股普通股的出售,占總股本8...

關(guān)鍵字: pi

菲尼克斯2021年11月30日 /美通社/ -- 小型市場(chǎng)企業(yè)的領(lǐng)先運(yùn)營(yíng)商與所有者Alpine 4 Holdings, Inc.(納斯達(dá)克股票代碼:ALPP),今日宣布已收購(gòu)鋰/石墨烯電池制造與設(shè)計(jì)行業(yè)先驅(qū)ElecJet...

關(guān)鍵字: 石墨烯電池 pi

紐約2021年11月22日 /美通社/ -- CITIC Capital Acquisition Corp. (NYSE: CCAC.U)(簡(jiǎn)稱(chēng)“CCAC”或“該公司”)更新了與早前宣布的與Quanergy System...

關(guān)鍵字: ui TI pi

CPP開(kāi)發(fā)者

237 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉