網路位址不同,沒有閘道器,為什麼直接能ping通?
看到網上有人問網路位址不同的兩台pc,沒配置閘道器,為啥能ping通?
pc1的ip192.168.12.1/255.255.248.0,pc2的ip192.168.14.1/255.255.252.0,彼此網路位址不同,而且沒有設定閘道器,直連能ping通,問為什麼?
如上圖,pc1去pingpc2,能夠ping通。而且ttl為128沒有減少,說明是直連路由通的。
同樣pc2去ping pc1同樣能ping通,而且ttl同樣128,是直連路由。
為什麼網路位址不同但能夠ping通?
首先,要明白ping的過程,要根據目的ip位址確定是走直連路由還是其他(預設路由,閘道器的設定ip),就是要判斷是否是同一網段(網路號是否相同)?是的話,檢視mac位址快取裡是否有對應ip的mac位址,有的話,直接發包。沒有的話,要發出arp請求來獲取mac位址,得到響應後,組包發出。若不是直連路由,就檢查是否閘道器配置,有的話,同樣檢查閘道器ip是否在同一網段,在,重複檢查mac位址快取表是否有閘道器的mac位址,有的話,直接組包,沒有的話,發出arp請求,請求成功後,組包發出。沒有閘道器設定,直接回顯失敗,沒有獲得對方mac位址,或者閘道器mac位址,回顯失敗。
對ping的響應,也是同樣的過程,根據收到ping的request訊息裡的ip進行判斷路由,進行和上面同樣的過程。
其次,是否直連路由的判斷是用pc自己的子網掩碼去和目的ip相與,和自身網路位址相同,就是同一網段,不同就不是。
再者,掩碼要借用主機位或者網路位,判斷子網時要確定掩碼在ip位址所在段,乙個ip位址的網路號是ip位址和掩碼相與得出的,掩碼所在的那一段中的主機位若為m,代表主機的取值是2^m個,從0到2^m-1,主機位為全0是網路位址,主機位全1是廣播位址。子網的個數是2^(8-m)個,取值從0到2^(8-m)-1,每乙個值加上主機位為0的值就是網路位址的所在段值。這些子網都有各自的網路位址,每個子網可用的ip範圍就是主機位非全0或者全1的ip,共2^m*後面幾段的最多值-2個可用位址。
可用的ip位址範圍是開始是網路位址+1,結束是廣播位址-1。
192.168.205.201 後兩段用二進位制來表示
192.168.1100 1101.1100 1001
255.255.1110 0000.0000 0000
192.168.1100 0000.0000 0000 網路位址是192.168.192.0
掩碼是19就是第三段用了3位作為網路位,所以第三段第四段的網路位和主機位有下面的取值,最小值和最多值見下圖:
第三段bin 第四段bin ip位址dec 第三段bin 第四段bin ip位址dec
000 00000 0000 0000 192.168.0.0 000 11111 1111 1111 192.168.31.255
001 00000 0000 0000 192.168.32.0 001 11111 1111 1111 192.168.63.255
01000000 0000 0000 192.168.64.0 010 11111 1111 1111 192.168.95.255
011 00000 0000 0000 192.168.96.0 011 11111 1111 1111 192.168.127.255
100 00000 0000 0000 192.168.128.0 100 11111 1111 1111 192.168.159.255
101 00000 0000 0000 192.168.160.0 101 11111 1111 1111 192.168.191.255
110 00000 0000 0000 192.168.192.0 110 11111 1111 1111 192.168.223.255
111 00000 0000 0000 192.168.224.0 111 11111 1111 1111 192.168.255.255
所以,掩碼為
19位的
ip位址,有第三列的
ip的最小值為子網號,第六列
ip位址最大值作為廣播位址。子網號的個數是
2^3=8,
可用主機數的為第三段主機位數
5的平方乘以第四段的
256,即
2^5*256-2=2046
個可用ip
位址。192.168.205.201
是在子網號
192.168.192.0
這個子網下。
ping
的過程分析:
pc1的ip 192.168.12.1/255.255.248.0,248就是二進位制1111 1000就是掩碼21位,這樣的子網號就是192.168.8.0,ip有效範圍就是192.168.8.1~192.168.15.254。
pc2的ip是192.168.14.1/255.255.252.0,252就是二進位制1111 1100就是掩碼22位,這樣子網號是192.168.12.0,ip的有效訪問就是192.168.12.1~192.168.15.254。
ping命令執行時,要查路由表,直連路由優先,所以首先判斷目的ip是否是和本身ip在同一網路位址下,用自身的子網掩碼和目的ip去做與運算,判斷結果是否與自身網路位址相同,192.168.14.1&&255.255.248.0=192.168.8.0,所以認為是同一網段,直接發出arp請求,pc2會響應目的ip是它自己的arp請求,同時記錄pc1的mac位址和ip的對應關係。pc1會得到pc2的mac位址,ping的request訊息會發出,pc2收到後,同樣去查自身路由表,直連路由優先順序高,會判斷收到request訊息請求的源ip和自身ip是否在同一網段, 192.168.14.1&&255.255.252.0=192.168.12.0,和自身網路位址相同,所以發出ping的應答reply訊息,會回pc7的ping的request請求,mac位址快取表裡已經有pc1的mac,所以直接發包,而且ttl不會減1。
pc2去ping pc1的過程正好和上面的相反,pc2去查自己的路由表,直連路由優先,發現pc1的ip和自己在同一網段192.168.12.0子網,就會發出arp查詢,請求pc1 192.168.12.1的mac位址,得到後直接組包發出,pc1收到pc2的ping的request訊息,查詢路由表,發現同一網段,在192.168.8.0/21這個子網中,會響應ping的請求,發出reply訊息。
結論:之所以能ping通是因為兩個子網的合法ip有交叉,彼此都在自己的子網中。判斷是否在同一網段要根據自己的掩碼與目的ip來與來計算,子網號就是乙個網路地,每個網路位址下有對應的乙個合法的ip段,在這個ip段的都是同一網段。不用傳送到閘道器。
arp的查詢的發出,一般是直連路由的目的ip才會發出arp查詢訊息,目的ip要麼是同網段,要麼是同網段的閘道器ip。回arp請求訊息,一般只檢查是否是本埠配置的有的ip位址,有的話,就回arp響應,告知自己的mac位址。
詳談為何兩台主機網路掩碼不一致可能導致ping不通
言歸正傳,論壇上曾經有人提問 在乙個交換機下,pca 的ip為 192.168.0.6 掩碼 255.255.255.0 pcb的ip 為192.168.1.3 掩碼為 255.255.0.0 按我的理解,這兩台電腦應該處於同一網段,但是互相卻ping 不通,這個難以理解,難道我的理解有誤?請各位高...
docker容器時間與宿主機不一致
使用docker拉去mysql映象並啟動容器,發現容器時間與宿主機不一致。而宿主機是網路時間。第乙個想法是進入容器修改容器時間。但是發現從官方拉取下來的映象啟動的容器很多命令是沒有的。其中就包括修改時間的clock命令。無奈之下,只好問度娘。度娘的解決方案有兩種,一 修改dockerfile。但這種...
非阻塞網路函式封裝不一致
ace的非阻塞網路函式引數設計有不合理的地方。ace sock stream 和ace sock connector 在非阻塞的的呼叫的介面對於 ace time value timeout 引數的使用不一致,乙個要使用 null 乙個卻要使用 ace time value zero。ace soc...