电脑是怎么知道它自己已经联上网怎么知道电脑有没有联网
簡(jiǎn)單解釋, 當(dāng)你的操作系統(tǒng)連接特定 HTTP 服務(wù), 比如 http://www.gstatic.com/generate_204, 如果能夠返回 204 狀態(tài)碼, 那就基本說(shuō)明你連接上網(wǎng)絡(luò)了. 如果被 301, 說(shuō)明你已經(jīng)有 IP, 但是你的網(wǎng)絡(luò)可能是一個(gè)付費(fèi)網(wǎng)絡(luò), 會(huì)跳轉(zhuǎn)到一個(gè)頁(yè)面讓你付錢(qián)/登陸. 如果無(wú)法解析域名/創(chuàng)建 TCP 連接, 說(shuō)明你的三層/四層網(wǎng)絡(luò)存在問(wèn)題, 再下去多半是網(wǎng)線沒(méi)插之類(lèi)的物理層問(wèn)題.
至于 TCP/UDP(一般主要是為了 DNS) 無(wú)法創(chuàng)建, 有可能是因?yàn)闆](méi)路由, 或者是 SYN 過(guò)去沒(méi)包回來(lái)超時(shí), 或者是 SYN 飛過(guò)去, 中間路由 ICMP 告訴你目標(biāo)不可達(dá); 如果是創(chuàng)建 socket 失敗說(shuō)明可能沒(méi)三層 IP, 沒(méi) IP 可能是因?yàn)闆](méi)網(wǎng)卡/沒(méi)插網(wǎng)線/二層里沒(méi)有 DHCP 或者沒(méi)有設(shè)置 IP.
但是你看到這些沒(méi)明白, 你看下面可能都不見(jiàn)得明白. 很多人自以為明白上面那些內(nèi)容, 實(shí)際上不少觀點(diǎn)還是錯(cuò)誤的.
首先就是很經(jīng)典的五層網(wǎng)絡(luò)模型:
首先從物理層開(kāi)始說(shuō).
所謂物理層, 就是雙絞線/光纖/無(wú)線電等傳輸介質(zhì). 比方說(shuō)電腦上顯示的「網(wǎng)線已經(jīng)拔出」, 就說(shuō)明物理層沒(méi)有建立鏈接. 還有就是雙絞線以太網(wǎng)的速度協(xié)商, 光模塊的功率協(xié)商, 各種無(wú)線網(wǎng)絡(luò)的時(shí)分/碼分/空分/功率協(xié)商技術(shù)都是物理層的體現(xiàn).
無(wú)線網(wǎng)絡(luò)的頻率,信噪比, 帶寬, 物理模式
光模塊的信息, 包含了波長(zhǎng), 電壓, 功率, 發(fā)射/接收功率(信噪比)
有線網(wǎng)絡(luò)的狀態(tài)
接下來(lái)就是媒體訪問(wèn)控制層, 也即是 MAC 層, 簡(jiǎn)稱(chēng)二層, 代表的以太網(wǎng)設(shè)備有交換機(jī)/無(wú)線AP.
首先要確定, 我們的以太網(wǎng)是一個(gè)「分組傳輸」機(jī)制, 也就是數(shù)據(jù)流(stream), 會(huì)被切成分組(packet), 而每個(gè)數(shù)據(jù)分組都有可能因?yàn)楦鞣N問(wèn)題, 比如你的網(wǎng)線質(zhì)量不好, 然后產(chǎn)生錯(cuò)誤被分組內(nèi)的校驗(yàn)和檢查出來(lái), 然后被交換機(jī)丟掉; 與分組傳輸機(jī)制對(duì)應(yīng)的就是「電路交換」, 比如工作在電路域的電話, 本質(zhì)上是機(jī)器代替人工幫你完成了從你的電話到你交流的人的線.
而分組在二層上的大小, 被稱(chēng)為 MTU, 最大傳輸單元, 超過(guò)這個(gè)大小, 就會(huì)嘗試調(diào)整或在三層進(jìn)行拆分;所有以太網(wǎng)二層設(shè)備都會(huì)有一個(gè)能接受的最大 MTU, 和一個(gè)標(biāo)記設(shè)備的 mac 地址. 這個(gè)地址的前 24bit 是 vendor ID, 廠商編號(hào)
這一層包含了著名的 ARP 協(xié)議(地址解析協(xié)議), 簡(jiǎn)單來(lái)說(shuō)就是用于完成 IP 地址-> mac 物理地址的轉(zhuǎn)換, 就好比教室里你喊一聲某個(gè)同學(xué)的名字, 然后那個(gè)同學(xué)/知道那個(gè)同學(xué)的人就會(huì)回答你他所在的座位坐標(biāo). 如果多個(gè) mac 地址對(duì)應(yīng)了一個(gè) IP 地址, 我們就說(shuō) IP 地址發(fā)生了沖突, 好比兩個(gè)人坐在了一個(gè)位置上.
以及還有 IPv4 里面非?;A(chǔ)的 DHCP 協(xié)議, 這個(gè)協(xié)議好比一個(gè)老師, 當(dāng)你沒(méi)有就坐(沒(méi)有分配到 IP 地址)的時(shí)候, 可以聽(tīng)到老師(們)宣布分配座位的廣播, 然后你選擇一個(gè)選擇老師的分配廣播, 請(qǐng)求這個(gè)老師為自己分配位置. 當(dāng)然這個(gè)位置是有時(shí)間限制的, 到這個(gè)期限之前就要提出續(xù)約, 當(dāng)然老師也可要求你改變位置. 當(dāng)然你自己也可以坐在一個(gè)固定位置, 相當(dāng)于手工設(shè)置 IP(但是如果和別人不在一個(gè)子網(wǎng)(subnet)里面, 除非有人充當(dāng) arp proxy 的角色, 不然你就無(wú)法和不在一個(gè)子網(wǎng)的同一個(gè)二層人進(jìn)行 IP 的傳輸.
DHCP 的狀態(tài)機(jī)
其中大多數(shù)操作系統(tǒng)當(dāng)檢測(cè)到鏈接到一個(gè)二層但是沒(méi)有 DHCP 的時(shí)候, 就會(huì)使用一個(gè)特殊的 link-local 機(jī)制, 為自己分配一個(gè) 169.254.0.0/16 的地址, 后面的 /16 是根據(jù)自己 mac 地址的填充. 所以當(dāng)你把兩臺(tái)電腦直接用 RJ45 網(wǎng)線連接在一起的時(shí)候, 理論上常見(jiàn)的操作系統(tǒng)的 DHCP client 都會(huì)配置上這個(gè)地址, 從而允許通過(guò) IP 連接.
而 IPv6 不主張使用 DHCP 的分配模式, 而是使用類(lèi)似 link local 那樣的自己設(shè)置+隨機(jī)生成的模式, 讓設(shè)備拿到, 這套機(jī)制叫 SLAAC, 借助的協(xié)議叫做 NDP, 其中需要二層網(wǎng)絡(luò)里面有一個(gè)三層路由器宣告自己的 IPv6 路由, 大概就是比如說(shuō) 2001:2333::2a4e/48是你的路由器, 他告訴這個(gè)網(wǎng)絡(luò)的人他有到 2000::/3(差不多是 IPv6 的公網(wǎng)地址) 的路由, 那么你就可以通過(guò)他的地址前綴 2001:2333::/48 給自己取名字. 其中一個(gè)相對(duì)固定的名字是通過(guò)你的 mac 地址來(lái)確定, 而因?yàn)?SLACC 地址前綴都只要有 /64, 所以就需要一套機(jī)制完成 48bit 的 mac 地址到 64bit, 即 EUI64. 除了這個(gè)地址之外就是一些臨時(shí)地址, 直接隨機(jī)生成, 用于提供 IPv6 的匿名性.
所以簡(jiǎn)單說(shuō)二層的意義就是讓一堆在不同物理層的設(shè)備連接在一起交換數(shù)據(jù), 同時(shí)為各種三層上的數(shù)據(jù)連接/交換做準(zhǔn)備.
然后就是三層, 也叫做 IP 層. 其實(shí)我們?cè)谝蕴W(wǎng)二層里面講了很多三層的信息. 其實(shí)簡(jiǎn)單的說(shuō)一二層的各種作用就是讓我能夠拿到 IP 地址, 并且能和其他 IP 地址的設(shè)備進(jìn)行通信:
我們通過(guò) DHCP/PPPo/SLAAC 拿到 IP 地址, 但是不足以說(shuō)明我們真的能連上互聯(lián)網(wǎng). 所以三層的重點(diǎn)就在于路由. 所謂路由就好比剛才那個(gè)給你分配地址的 DHCP 老師, 他告訴你, 如果你要訪問(wèn)別的班級(jí), 那么你需要把信息傳達(dá)給一個(gè)中介, 這個(gè)中介很多時(shí)候就是這個(gè)老師, 有的時(shí)候就是別的同學(xué); 這個(gè)中介通常叫做網(wǎng)關(guān), 而作為一個(gè)萌新, 你通常也不會(huì)有別的路由, 所以這個(gè)網(wǎng)關(guān)帶來(lái)的路由意義就很重要, 通常就叫做「默認(rèn)路由」, 剛才提到的 2000::/3, 就是 IPv6 里面最重要的一類(lèi)「默認(rèn)路由」.
然而這個(gè)經(jīng)過(guò)路由后面的交換層不一定就是你要訪問(wèn)的對(duì)象, 還要經(jīng)過(guò)別的路由器. 通常來(lái)說(shuō)就需要各種路由協(xié)議讓各個(gè)路由器之間互相交換信息, 這里根據(jù)很多路由協(xié)議, 比如基于距離向量的 RIP, 還有基于圖論 Dijkstra 最短路徑算法的 OSPF, 還有像是 IS-IS 協(xié)議. 當(dāng)然這些都是 AS 內(nèi)的協(xié)議, 在今天互聯(lián)網(wǎng)起著決定性作用的協(xié)議還是 BGP 協(xié)議. 同時(shí) BGP 協(xié)議關(guān)聯(lián)的還有 IP 地址塊的分配.
然而三層本身還是有個(gè)問(wèn)題: 他仍然是一個(gè)分組交換. 換句話說(shuō), 你發(fā)一個(gè) ICMP echo(也就是經(jīng)常說(shuō)的 ping 包), 中間路由任何一條丟了就沒(méi)了. 但是你訪問(wèn)的網(wǎng)頁(yè)所建立的連接 就不能因?yàn)橐粋€(gè)包丟了就完全壞了, 所以我們還需要一層.
這就是傳輸層, 最典型的協(xié)議就是 TCP 和 UDP.
先說(shuō) UDP, UDP 就是在 IP 包的基礎(chǔ)上加上端口機(jī)制, UDP 本身沒(méi)有連接的概念, 也就是有一說(shuō)一, 直接發(fā)了就行. 然后從你自己的一個(gè)信箱(端口)發(fā)了之后就到了另外一個(gè)端口(信箱), 這樣對(duì)面的應(yīng)用就能讀這個(gè)信箱.
而 TCP 不僅僅是在 IP 包上加了端口那么簡(jiǎn)單, 更重要的是他提供了一種可靠的交付方式, 即 ARQ 機(jī)制, 換句話說(shuō)兩邊建立連接之后發(fā)送的所有內(nèi)容, 都會(huì)有個(gè)「簽收」機(jī)制保證到達(dá), 如果不到的話就會(huì)重發(fā); 并且有擁塞控制機(jī)制, 防止因?yàn)榘l(fā)送速率過(guò)快導(dǎo)致中間路由超載(buffer 用完)導(dǎo)致的大量丟包, 讓速度維持在一個(gè)可靠的位置.
但是 TCP 的可靠是有代價(jià)的, 首先它需要建立連接, 而 UDP 直接發(fā)包就行. TCP 監(jiān)測(cè)到自己發(fā)送的包丟失之后, 會(huì)暫時(shí)停止/減慢后面的數(shù)據(jù)包的發(fā)送, 主要會(huì)先把漏掉的包補(bǔ)上. 而監(jiān)測(cè)到對(duì)面過(guò)來(lái)的數(shù)據(jù)包丟失的一邊, 這個(gè)丟失數(shù)據(jù)包后面的包則無(wú)法交付給用戶, 所以就會(huì)造成一個(gè)瞬間的大延時(shí). 也就是所謂的 TCP 的實(shí)時(shí)性差. 借助 TCP 的語(yǔ)音/直播應(yīng)用, 就需要加入比較的緩沖空間, 避免這些延遲造成的中斷. 換句話說(shuō)就是用一個(gè)固定的延遲中和掉了隨機(jī)產(chǎn)生的大延遲, 讓人感覺(jué)連接沒(méi)有中斷. 而 UDP 雖然實(shí)時(shí)性好, 但是就 UDP 協(xié)議棧本身沒(méi)法抵抗丟包, 除非應(yīng)用有一套類(lèi)似的 ARQ 機(jī)制, 或者 UDP 發(fā)送的內(nèi)容里面包含了冗余編碼, 從而在個(gè)別包丟失的情況下, 其他抵達(dá)的包仍然能還原內(nèi)容. 特別是音頻/視頻應(yīng)用里面這種技術(shù)非常的有用. 換句話說(shuō)丟包對(duì)于這些有冗余設(shè)計(jì)的應(yīng)用來(lái)說(shuō)只是短暫降低了傳輸?shù)馁|(zhì)量, 但是并不會(huì)造成業(yè)務(wù)的中斷.
有了 TCP 我們就可以建立連接. 但是連接之上我們需要一套協(xié)議, 用戶規(guī)范連接里面的「禮儀」, 也就是各種各樣的協(xié)議, 其中使用最廣泛的代表就是 HTTP 協(xié)議. HTTP 不僅僅是用來(lái)傳輸文本, 比如網(wǎng)頁(yè), 還包含了 RPC 的基本設(shè)計(jì)理念, 比如 RESTful, 就好比你用 HTTP 傳輸你點(diǎn)個(gè)外賣(mài)的信息, POST 方法就是發(fā)出點(diǎn)外賣(mài)的請(qǐng)求, PUT 方法就是改變外賣(mài)訂單信息, GET 方法就是獲取訂單狀態(tài), DELETE 方法就是撤銷(xiāo)訂單. 同樣類(lèi)比, 你查看這個(gè)回答就是 GET, 提交評(píng)論是 POST, 修改提交的評(píng)論是 PUT, 刪除評(píng)論是 DELETE. 這樣一套標(biāo)準(zhǔn)就能很方便實(shí)現(xiàn)各種功能.
但是問(wèn)題在于這套協(xié)議構(gòu)建在明文的 TCP 之上, 所以我們就需要 TLS/SSL 加密保護(hù)我們的 TCP 連接. 被 TLS/SSL 保護(hù)的 HTTP 也被叫做 HTTPS. 而加密之外還要進(jìn)行身份驗(yàn)證(使用非對(duì)稱(chēng)密鑰), 不能連上假的知乎, 那么就需要 PKI 機(jī)制去驗(yàn)證這個(gè)知乎的真?zhèn)? 然后驗(yàn)明正身的同時(shí)還需要協(xié)商出一把公共密鑰(使用非對(duì)稱(chēng)密鑰或者 DH 算法生成公共秘密)和對(duì)稱(chēng)加密算法(加解密是同一把密鑰), 用于加密雙方通信.
DigiCert 簽發(fā)的知乎域名證書(shū)
這里展示了加密了 TLS 的版本, 密鑰協(xié)商算法 ECDHE_RSA, 非對(duì)稱(chēng)橢圓曲線算法 X25519 用于身份驗(yàn)證, AES-128-GCM 用于對(duì)稱(chēng)密鑰加密傳輸, 其中還有一個(gè)消息摘要/哈希算法沒(méi)有展示, 目前安全的算法通常是 SHA256, 還有 SHA3, 以及國(guó)密 SM3 干的也是這個(gè)事情
然后我們又回到最初的那段話了, 如果我們的 HTTP 返回的是 204(注意那個(gè)頁(yè)面就是為了返回 204), 說(shuō)明你大概率連上了互聯(lián)網(wǎng), 只不過(guò)身份確認(rèn)無(wú)法做. 而還有個(gè)情況就是中間有人通過(guò) DNS/路由/HTTP 劫持等手段掌握了你的 HTTP 連接(HTTPS + HSTS 做不到), 那么他就能發(fā)出 301 請(qǐng)求, 把你定位到另外一個(gè)頁(yè)面, 這種技術(shù)通常叫做 portal, 也就是常見(jiàn)讓你在付費(fèi)的免費(fèi) Wi-Fi 下, 系統(tǒng)彈出一個(gè)頁(yè)面讓你登陸/付費(fèi).
總結(jié)
以上是生活随笔為你收集整理的电脑是怎么知道它自己已经联上网怎么知道电脑有没有联网的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Selenium WebDriver中的
- 下一篇: 还不会做图表可视化,那你千万不能错过这个