日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

为什么我在公司里访问不了家里的电脑

發布時間:2023/12/15 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 为什么我在公司里访问不了家里的电脑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上篇文章「為什么我們家里的 IP 都是 192.168 開頭的?」提到,因為 IPv4 地址有限,最大 42 億個。為了更好的利用這有限的 IP 數量,網絡分為局域網和廣域網,將 IP 分為了私有 IP 和公網 IP,一個局域網里的 N 多臺機器都可以共用一個公網 IP,從而大大增加了 "可用 IP 數量"。

收發數據就像收發快遞

當我們需要發送網絡包的時候,在 IP 層,需要填入源 IP 地址,和目的 IP 地址,也就是對應快遞的發貨地址和收貨地址。

IP 報頭里含有發送和接收 IP 地址

但是我們家里的局域網內,基本上都用 192.168.xx.xx 這樣的私有 IP

如果我們在發送網絡包的時候,這么填。對方在回數據包的時候該怎么回?畢竟千家萬戶人用的都是 192.168.0.1,網絡怎么知道該發給誰?

所以肯定需要將這個 192.168.xx 私有 IP 轉換成公有 IP

因此在上篇文章最后,留了這么個問題。局域網內用的是私有 IP,公網用的都是公有 IP。一個局域網里的私有 IP 想訪問局域網外的公有 IP,必然要做個 IP 轉換,這是在哪里做的轉換呢?

私有 IP 和公有 IP 在哪進行轉換

答案是 NAT 設備,全稱 NetworkAddressTranslation,網絡地址轉換。基本上家用路由器都支持這功能。

我們來聊下它是怎么工作的。

NAT 的工作原理

為了簡單,我們假設你很富,你家里分到了一個公網 IP 地址20.20.20.20,對應配到了你家自帶 NAT 功能的家用路由器上,你家里需要上網的設備有很多,比如你的手機,電腦都需要上網,他們構成了一個局域網,用的都是私有 IP,比如 192.168.xx。其中你在電腦上執行 ifconfig 命令,發現家里的電腦 IP 是 192.168.30.5。你要訪問的公網 IP 地址是 30.30.30.30。

于是就有下面這樣一張圖

內網 IP 訪問公網 IP

當你準備發送數據包的時候,你的電腦內核協議棧就會構造一個 IP 數據包。這個 IP 數據包報頭里的發送端 IP 地址填的就是 192.168.30.5,接收端 IP 地址就是 30.30.30.30。將數據包發到 NAT 路由器中。

此時 NAT 路由器會將 IP 數據包里的源 IP 地址修改一下,私有 IP 地址 192.168.30.5 改寫為公網 IP 地址 20.20.20.20,這叫 SNATSourceNetworkAddressTranslation,源地址轉換)。并且還會在 NAT 路由器內部留下一條192.168.30.5 -> 20.20.20.20 的映射記錄,這個信息會在后面用到。之后 IP 數據包經過公網里各個路由器的轉發,發到了接收端 30.30.30.30,到這里發送流程結束。

SNAT

如果接收端處理完數據了,需要發一個響應給你的電腦,那就需要將發送端 IP 地址填上自己的 30.30.30.30,將接收端地址填為你的公網 IP 地址 20.20.20.20,發往 NAT 路由器。NAT 路由器收到公網來的消息之后,會檢查下自己之前留下的映射信息,發現之前留下了這么一條192.168.30.5 -> 20.20.20.20 記錄,就會將這個數據包的目的 IP 地址修改一下,變成內網 IP 地址 192.168.30.5, 這也叫 DNAT(DestinationNetworkAddressTranslation,目的地址轉換)。之后將其轉發給你的電腦上。

DNAT

整個過程下來,NAT 悄悄的改了 IP 數據包的發送和接收端 IP 地址,但對真正的發送方和接收方來說,他們卻對這件事情,一無所知

這就是 NAT 的工作原理。

NAPT 的原理

到這里,相信大家都有一個很大的疑問。

局域網里并不只有一臺機器,局域網內 每臺機器都在 NAT 下留下的映射信息都會是192.168.xx.xx -> 20.20.20.20,發送消息是沒啥事,但接收消息的時候就不知道該回給誰了。

NAT 的問題

這問題相當致命,因此實際上大部分時候不會使用普通的 NAT

那怎么辦呢?

問題出在我們沒辦法區分內網里的多個網絡連接。

于是乎。

我們可以加入其他信息去區分內網里的各個網絡連接,很自然就能想到端口。

但 IP 數據包(網絡層)本身是沒有端口信息的。常見的傳輸層協議 TCP 和 UDP 數據報文里才有端口的信息。

TCP 報頭有端口號

UDP 報頭也有端口號

于是流程就變成了下面這樣子。

當你準備發送數據包的時候,你的電腦內核協議棧就會先構造一個 TCP 或者 UDP 數據報頭,里面寫入端口號,比如發送端口是 5000,接收端口是 3000,然后在這個基礎上,加入 IP 數據報頭,填入發送端和接收端的 IP 地址。

那數據包長這樣。

數據包的構成

假設,發送端 IP 地址填的就是 192.168.30.5,接收端 IP 地址就是 30.30.30.30。

將數據包發到 NAT 路由器中。

此時 NAT 路由器會將 IP 數據包里的源 IP 地址和端口號修改一下,從 192.168.30.5:5000 改寫成 20.20.20.20:6000。并且還會在 NAT 路由器內部留下一條192.168.30.5:5000 -> 20.20.20.20:6000 的映射記錄。之后數據包經過公網里各個路由器的轉發,發到了接收端 30.30.30.30:3000,到這里發送流程結束。

NAPT 發送數據

接收端響應時,就會在數據包里填入發送端地址是 30.30.30.30:3000,將接收端是 20.20.20.20:6000,發往 NAT 路由器。NAT 路由器發現下自己之前留下過這么一條192.168.30.5:5000 -> 20.20.20.20:6000 的記錄,就會將這個數據包的目的 IP 地址和端口修改一下,變回原來的 192.168.30.5:5000。之后將其轉發給你的電腦上。

NAPT 接收數據

如果局域網內有多個設備,他們就會映射到不同的公網端口上,畢竟端口最大可達 65535,完全夠用。這樣大家都可以相安無事。

像這種同時轉換 IP 和端口的技術,就是 NAPT(Network Address Port Transfer ,網絡地址端口轉換)。

看到這里,問題就來了。

那這么說只有用到端口的網絡協議才能被 NAT 識別出來并轉發?

但這怎么解釋 ping 命令?ping 基于 ICMP 協議,而 ICMP 協議報文里并不帶端口信息。我依然可以正常的 ping 通公網機器并收到回包。

ping 報頭

事實上針對 ICMP 協議,NAT 路由器做了特殊處理。ping 報文頭里有個 Identifier 的信息,它其實指的是放出 ping 命令的進程 id

對 NAT 路由器來說,這個 Identifier 的作用就跟端口一樣。

另外,當我們去抓包的時候,就會發現有兩個 Identifier,一個后面帶個 BE(Big Endian),另一個帶個 LE(Little Endian)。

其實他們都是同一個數值,只不過大小端不同,讀出來的值不一樣。就好像同樣的數字 345,反著讀就成了 543。這是為了兼容不同操作系統(比如 linux 和 Windows)下大小端不同的情況。

1667783441963

內網穿透是什么

看到這里,我們大概也發現了。使用了 NAT 上網的話,前提得內網機器主動請求公網 IP,這樣 NAT 才能將內網的 IP 端口轉成外網 IP 端口

反過來公網的機器想主動請求內網機器,就會被攔在 NAT 路由器上,此時由于 NAT 路由器并沒有任何相關的 IP 端口的映射記錄,因此也就不會轉發數據給內網里的任何一臺機器。

舉個現實中的場景就是,你在你家里的電腦上啟動了一個 HTTP 服務,地址是 192.168.30.5:5000,此時你在公司辦公室里想通過手機去訪問一下,卻發現訪問不了。

那問題就來了,有沒有辦法讓外網機器訪問到內網的服務?

有。

大家應該聽過一句話叫," 沒有什么是加中間層不能解決的,如果有,那就再加一層 "。

放在這里,依然適用。

說到底,因為 NAT 的存在,我們只能從內網主動發起連接,否則 NAT 設備不會記錄相應的映射關系,沒有映射關系也就不能轉發數據。

所以我們就在公網上加一臺服務器 x,并暴露一個訪問域名,再讓內網的服務主動連接服務器 x,這樣 NAT 路由器上就有對應的映射關系。接著,所有人都去訪問服務器 x,服務器 x 將數據轉發給內網機器,再原路返回響應,這樣數據就都通了。這就是所謂的內網穿透

像上面提到的服務器 x,你也不需要自己去搭,已經有很多現成的方案,花錢就完事了,比如花某殼。

內網穿透

到這里,我們就可以回答文章標題的問題。

為什么我在公司里訪問不了家里的電腦?

那是因為家里的電腦在局域網內,局域網和廣域網之間有個 NAT 路由器。由于 NAT 路由器的存在,外網服務無法主動連通局域網內的電腦。

兩個內網的聊天軟件如何建立通訊

好了,問題就叒來了。

我家機子是在我們小區的局域網里,班花家的機子也是在她們小區的局域網里。都在局域網里,且 NAT 只能從內網連到外網,那我電腦上登錄的 QQ 是怎么和班花電腦里的 QQ 連上的呢?

兩個局域網內的服務無法直接連通

上面這個問法其實是存在個誤解,誤以為兩個 qq 客戶端應用是直接建立連接的。

然而實際上并不是,兩個 qq 客戶端之間還隔了一個服務器。

聊天軟件會主動與公網服務器建立連接

也就是說,兩個在內網的客戶端登錄 qq 時都會主動向公網的聊天服務器建立連接,這時兩方的 NAT 路由器中都會記錄有相應的映射關系。當在其中一個 qq 上發送消息時,數據會先到服務器,再通過服務器轉發到另外一個客戶端上。反過來也一樣,通過這個方式讓兩臺內網的機子進行數據傳輸。

兩個內網的應用如何直接建立連接

上面的情況,是兩個客戶端通過第三方服務器進行通訊,但有些場景就是要拋開第三端,直接進行兩端通信,比如 P2P 下載,這種該怎么辦呢?

這種情況下,其實也還是離不開第三方服務器的幫助。

假設還是 A 和 B 兩個局域網內的機子,A 內網對應的 NAT 設備叫 NAT_A,B 內網里的 NAT 設備叫 NAT_B,和一個第三方服務器 server。

流程如下。

step1 和 2: A 主動去連 server,此時 A 對應的 NAT_A 就會留下 A 的內網地址和外網地址的映射關系,server 也拿到了 A 對應的外網 IP 地址和端口。

step3 和 4: B 的操作和 A 一樣,主動連第三方 server,NAT_B 內留下 B 的內網地址和外網地址的映射關系,然后 server 也拿到了 B 對應的外網 IP 地址和端口。

step5 和 step6 以及 step7: 重點來了。此時 server 發消息給 A,讓 A 主動發 UDP 消息到 B 的外網 IP 地址和端口。此時 NAT_B 收到這個 A 的 UDP 數據包時,這時候根據 NAT_B 的設置不同,導致這時候有可能 NAT_B 能直接轉發數據到 B,那此時 A 和 B 就通了。但也有可能不通,直接丟包,不過丟包沒關系,這個操作的目的是給 NAT_A 上留下有關 B 的映射關系

step8 和 step9 以及 step10: 跟 step5 一樣熟悉的配方,此時 server 再發消息給 B,讓 B 主動發 UDP 消息到 A 的外網 IP 地址和端口。NAT_B 上也留下了關于 A 到映射關系,這時候由于之前 NAT_A 上有過關于 B 的映射關系,此時 NAT_A 就能正常接受 B 的數據包,并將其轉發給 A。到這里 A 和 B 就能正常進行數據通信了。這就是所謂的 NAT 打洞

step11: 注意,之前我們都是用的 UDP 數據包,目的只是為了在兩個局域網的 NAT 上打個洞出來,實際上大部分應用用的都是 TCP 連接,所以,這時候我們還需要在 A 主動向 B 發起 TCP 連接。到此,我們就完成了兩端之間的通信。

NAT 打洞

這里估計大家會有疑惑。

端口已經被 udp 用過了,TCP 再用,那豈不是端口重復占用(address already in use)?

其實并不會,端口重復占用的報錯常見于兩個 TCP 連接在不使用 SO_REUSEADDR 的情況下,重復使用了某個 IP 端口。而 UDP 和 TCP 之間卻不會報這個錯。之所以會有這個錯,主要是因為在一個 linux 內核中,內核收到網絡數據時,會通過五元組(傳輸協議,源 IP,目的 IP,源端口,目的端口)去唯一確定數據接受者。當五元組都一模一樣的時候,內核就不知道該把數據發給誰。而 UDP 和 TCP 之間 "傳輸協議" 不同,因此五元組也不同,所以也就不會有上面的問題。

五元組

NAPT 還分為好多種類型,上面的 nat 打洞方案,都能成功嗎?

關于 NAPT,確實還細分為好幾種類型,比如完全錐形 NAT 和限制型 NAT 啥的,但這并不是本文的重點。所以我就略過了。我們現在常見的都是錐形 NAT。上面的打洞方案適用于大部分場景,這其中包括限制最多的端口受限錐形 NAT

1668247032737

總結

?IPV4 地址有限,但通過 NAT 路由器,可以使得整個內網 N 多臺機器,對外只使用一個公網 IP,大大節省了 IP 資源。

?內網機子主動連接公網 IP,中間的 NAT 會將內網機子的內網 IP 轉換為公網 IP,從而實現內網和外網的數據交互。

?普通的 NAT 技術,只會修改網絡包中的發送端和接收端 IP 地址,當內網設備較多時,將有可能導致沖突。因此一般都會使用 NAPT 技術,同時修改發送端和接收端的 IP 地址和端口

?由于 NAT 的存在,公網 IP 是無法訪問內網服務的,但通過內網穿透技術,就可以讓公網 IP 訪問內網服務。一波操作下來,就可以在公司的網絡里訪問家里的電腦。

最后留個問題,有了 NAT 之后,原本并不富裕的 IPv4 地址突然就變得非常夠用了。

那我們為什么還需要 IPv6?

另外 IPv6 號稱地址多到每粒沙子都能擁有自己的 IP 地址,那我們還需要 NAT 嗎?

本文來自微信公眾號:小白 debug (ID:xiaobaidebug),作者:小白

總結

以上是生活随笔為你收集整理的为什么我在公司里访问不了家里的电脑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。