詳談為何兩台主機網路掩碼不一致可能導致ping不通

2022-03-05 14:58:44 字數 2205 閱讀 7944

言歸正傳,論壇上曾經有人提問:

「在乙個交換機下,pca 的ip為 192.168.0.6  掩碼 255.255.255.0    pcb的ip 為192.168.1.3 

掩碼為 255.255.0.0 。   

按我的理解,這兩台電腦應該處於同一網段,但是互相卻ping 不通,這個難以理解,難道我的理解有誤?請各位高手指點。」

該樓主的理解確實有點問題吧,乙個可行的改法是把pca的掩碼改為 255.255.0.0,就沒問題了。原理解釋如下:

(根據該樓主的描述,我們暫且理解為其網路環境中只有一台直連交換機,不存在路由器或其他的網路裝置)

1.1 網路掩碼與網路號

首先,對於乙個使用標準的abcde分類編址方案的ip位址,其實可以看成:ip位址 = 網路號 + 主機號。其中網路號由本機ip位址與本機網路掩碼做與運算獲得,主機號由本機ip位址與本機網路掩碼的反碼做與運算獲得。比如說樓主所舉的例子中,對於pca,網路號為net_ida=192.168.0.0,主機號為 host_ida=0.0.0.6;對於pcb,網路號為net_idb=192.168.0.0,主機號為 host_idb=0.0.1.3。看到這,你肯定要大呼,這倆丫的網路號不是一樣的麼,那就是在同乙個子網啊,為什麼不通呢?別急著下結論,請耐心往下看~

1.2 ping操作其實是一次完整的雙向通訊過程

其次,ping操作的實際內涵是什麼?看下面的步驟:

(1)由本機構造乙個icmp請求包,傳送給目的主機;

(2)目的主機處理後構造乙個icmp響應包,返回給本機;

(3)本機根據是否收到響應包,以及響應包的內容得到本次ping的結果,並交由顯示器呈現給使用者。

也就是說,一次成功的ping操作其實是一次完整的雙向通訊過程,並非只要本機能將請求傳送出去就算好了的。資料報要能出得去,更要回得來。

1.3 資料傳送的流程

最後還要說明的是一台主機要給另一台主機傳送資料時的工作流程,以a向b傳送資料為例,如下圖:

圖1-1 一台主機要給另一台主機傳送資料時的工作流程

2.1 pca ping pcb 

當pca構造好icmp請求包打算傳送給pcb時,參照上面的流程圖,其處理過程應當如下:

pca首先將pcb的ip位址192.168.1.3與自己的掩碼255.255.255.0做與運算,得到它所認為的pcb的網路號:net_idb'=192.168.1.0【注意到net_idb'net_idb並不一致】;

然後用這個net_idb'與自己的網路號net_ida=192.168.0.0 作比較,發現不一樣;

pca把構造好的icmp請求包交付給閘道器,但閘道器不存在,於是請求傳送失敗。

呈現給你的直觀現象就是 pca ping pcb 不通【我猜系統給出的響應應該是:目標主機不可達(中文系統)/destination host unreachable(英文系統)】,原因在於請求出不去。

2.2 pcb ping pca 

當pcb構造好icmp請求包打算傳送給pcb時,參照上面的流程圖,其處理過程應當如下:

pcb首先將pca的ip位址192.168.0.6與自己的掩碼255.255.0.0做與運算,得到它所認為的pca的網路號:net_ida'=192.168.0.0【注意到net_ida'net_ida是一致的】;

然後用這個net_ida'與自己的網路號net_idb=192.168.0.0 作比較,發現一樣;

pcb把構造好的icmp請求包直接交付給pca 。

pca處理後構造完成icmp響應包,打算回給pcb,其處理過程和前文pca向pcb傳送請求包一致,結果是pca傳送響應包失敗。

呈現給你的直觀現象就是 pcb ping pca 不通【我猜系統給出的響應應該是:請求超時(中文系統)/request timed out(英文系統)】,原因在於響應回不來。

如果你不是有什麼特殊需求的話,那麼你應該為你同一子網內的所有主機配置相同的掩碼。

詳解為何兩台主機網路掩碼不一致卻能ping通

網路位址不同,沒有閘道器,為什麼直接能ping通?看到網上有人問網路位址不同的兩台pc,沒配置閘道器,為啥能ping通?pc1的ip192.168.12.1 255.255.248.0,pc2的ip192.168.14.1 255.255.252.0,彼此網路位址不同,而且沒有設定閘道器,直連能pi...

docker容器時間與宿主機不一致

使用docker拉去mysql映象並啟動容器,發現容器時間與宿主機不一致。而宿主機是網路時間。第乙個想法是進入容器修改容器時間。但是發現從官方拉取下來的映象啟動的容器很多命令是沒有的。其中就包括修改時間的clock命令。無奈之下,只好問度娘。度娘的解決方案有兩種,一 修改dockerfile。但這種...

非阻塞網路函式封裝不一致

ace的非阻塞網路函式引數設計有不合理的地方。ace sock stream 和ace sock connector 在非阻塞的的呼叫的介面對於 ace time value timeout 引數的使用不一致,乙個要使用 null 乙個卻要使用 ace time value zero。ace soc...