一道常見的題目
我在多個場合都看到過這樣的網絡題目,給兩個地址,讓咱們判斷一下這二者是否可以通訊。對這樣的題目,按理說我應該很熟練的,可是當別人猛然問個人時候,我依然沒法很是有信心的說出正確的答案,儘管我能說出正確的答案,但我在闡述的過程中,依然是心有疑惑的,我知道,這確定是我理解的依然不夠透徹,儘管我從事網絡行業也有一點時間了。windows
在網上和書裏面看到過不少人的的文章,也包括林沛滿在《wireshark網絡分析就這麼簡單》一書中的論述,但沒有一個我本身滿意的,無論別人怎麼寫,怎麼詳細論述,看上去都以爲彆扭,那不是本身的理解。網絡
兩個地址:ide
A:192.168.0.2/24 沒有設置網關; B:192.168.0.32/27 沒有設置網關; A主機 ping B主機 ,是否能ping通?
不少書中一下來就講它們是如何通訊的,但我認爲應該先審下題,題目出的對不對?A的主機IP看起來沒有問題,但B的主機的IP看起來不太正常,由於它的IP看起來正好在節點上。code
B主機的掩碼是27位,也就是說把256分紅了2的3次方份,也就是把256分紅了8份,每一份是32,而B主機的掩碼好像就設置在節點上,這是比較可疑的,那咱們來看B的主機IP這麼設置對嗎?好,32寫成二進制是00100000,那掩碼又是11100000,主機位全是0,IP地址不容許主機 位全是0的,因此這個地址是根本沒法設置成功的,因此這個題是個錯題。blog
其實你能夠驗證一下,windows在這方面作的很是好,你只要在網卡上設置一下,在保存的時候,windows會提示你這麼設置是不對的,會出現這樣的報錯:接口
The combination of IP address and subnet mask is invalid. All of the bits in the host address portion of the IP address are set to 0 Please enter a valid combination of P address and subnet mask(IP 地址和子網掩碼的組合無效。IP 地址的主機地址部分中的位是設置爲 0,請輸入有效的IP地址和子網掩碼)jsx
上面咱們出了一個錯題,下面咱們出一個正確的題:路由
A:192.168.0.2/24 沒有設置網關; B:192.168.0.23/27 沒有設置網關; A和B主機接入到同一個傻瓜交換機上,A主機 ping 主機 ,是否能ping通?
看一下通訊流程,其實這個流程是很是重要的,我很是但願華爲官方能出一本關於HCIE的路由交換指南書籍,如今是一個叫泰克的培訓機構出品這本書,我很是不滿意,緣由就是由於這本書是「死的」,就是由於裏面沒有詳細的通訊流程,僅僅是知識點的羅列,而華爲出品的《HCNP路由交換指南》裏面是有明確的通訊流程的,讓人一看就懂。it
第一步:A經過本身的掩碼判斷出本身的網絡位是192.168.0.0/24,而後A又經過A本身的掩碼判斷B的網絡位,網絡位也是192.168.0.0/24,因此A認爲B與本身是一個網段,因而A直接arp廣播詢問B的mac地址,那B能不能收到呢?這是廣播呀,因此說必定能收到,那B又怎麼回覆呢?B收到arp的請求廣播以後,B會怎麼回覆呢?其實在這裏面很容易讓人迷惑,既然A能到達B,那B會順着原路返回嗎?實際上是不行的,其實咱們仔細想想,所謂通訊,就是一來一回,路由也要是雙向的,若是路由是單向的,即便請求包到達,那回復包並不會根據原路返回的,經過這想一個設想,咱們就絕了讓回覆包順着請求包的路徑返回的心吧!B也是活生生的主機,B也有本身的「考量」,那B是如何考量的?即使A的請求報文已經到達了B,B也收到了,B也知道A是來找本身的,但B也要根據arp廣播報文當中攜帶的A的IP地址,判斷一個A是否和本身在一個網段,常常作運算,B發現A是和本身一個網段的,因而回復arp報文(其實這個論述是錯誤的,後面咱們會講到,arp廣播實際上是不考慮子網的,只要收到就回復),這裏值得一提的是,arp的請求雖然是廣播的,但回覆倒是單播,其實dhcp的報文也是如此。io
好了,A如今也收到了B的arp回覆報文,那A就能夠在封裝MAC的時候封裝目標MAC了,其實在arp階段交換機就已經知道了目標mac在哪一個接口,那icmp報文確定能順利到達B主機,B主機也是如此,這樣通訊就成功 了。
A:192.168.0.2/24 網關是192.168.0.1/24,而且網關正常 B:192.168.0.33/27 網關是192.168.0.1/24,而且網關正常 A和B主機接入到同一個三層交換機,兩臺主機們於同一個vlan,A主機 ping 主機 ,是否能ping通?
A認爲B和本身一個網段,B能收到arp的請求廣播,其實A也能收B的回覆廣播,即便B認爲A和本身不是一個網段,但不要忘了,arp廣播是不考慮子網的,咱們後面會進行抓包驗證。B也會正常收到A的icmp請求,可是B有本身的判斷呀?B會頗有原則的判斷A和本身不在同一個網段,因而B會arp請求網關的MAC,網關固然也會回覆B,因而B與A的ICMP回覆包是交給網關了,那網關怎麼辦呢?網關一看目標IP和本身是一個網段,直接從該網關轉發出去,交換會順利的交給A,由於交換機是A的網卡的mac地址對應的接口的,好,一次通訊就完成了。
注意,這裏面依靠了網關的轉發能力,沒有網關是不行的,若是沒有網關的話,只有icmp的請求報文能到達B,但B的回覆報文卻由於沒有網關轉發根本到不了A,咱們能夠作個實驗驗證一下。
先看沒有網關的狀況下:
PC1的mac:54-89-98-B1-4C-BA
PC2的mac:54-89-98-A4-04-23
在PC1主機上ping PC2,在PC2上抓包看,截圖以下:
上面這張圖挺有意思的,咱們能夠看到pc1發的arp請求包,這一個報文挺正常,值得關注的是第二個報文,第二個報文的存在就頗有意思,按理來講他不應存在,由於B已經判斷出A和它不在一個網段,爲何B還正常回復arp報文,只有一個解釋,那就是arp回覆時是不考慮子網的,B無論A和它是否在不在同一個網段,都會回覆arp報文。咱們再來看第三個報文,第三個報文是A獲得了B的MAC以後,開始發送了一個ICMP請求報文,嗯,這沒有問題,但咱們看第四個報文,第四個報文居然是一個arp請求報文,請求的目標是網關,是B主機發送的,這證實了咱們上面的論述,由於沒有網關,而A是一直ping着B主機,因此ICMP請求報文和B主機arp請求報文會交替出現。
那出現了網關是什麼後呢?A主機ping B主機時,咱們再在A主機上抓包看看:
網關MAC:4c1f-cc2a-29db
前兩個報文都很好理解,A去詢問B的MAC地址,因而B回覆給A了,因而A發了一個ICMP的請求報文,可是第4、五個arp包,我就有點看不懂了,這兩個arp報文是網關發的,廣播詢問了兩個主機的MAC,可是隻有A主機回覆了,爲何只有A主機回覆,其實不是這樣的,兩個主機實際上是都回復了,只是咱們是在A這一側抓的包,而arp回覆報文又是單播報文,因此只看到了A回覆的。好,那還有一個問題,爲何網關會發這兩個arp請求報文?網關不會平白無故發的,必定是某種緣由觸發的,那是什麼緣由呢?A給B發ICMP請求的時候是不用經過網關的,因此不是這個問題致使網關發送arp廣播的,那是爲何呢?是B,B收到了A的請求報文以後,B確定請求網關的MAC了,而後將請求報文交給網關,網關一看目標IP是本身接口之下的,但並不會立馬轉發,也是會arp詢問一下一個arp的mac地址 ,而後再進行轉發,至於爲何網關還會詢問B的mac,這裏面我也沒法解釋。
在A主機ping B主機時,在B主機上抓包看下:
在這個報文當中,咱們看到了arp的annoucement,就是arp的通告,意思就是網關說它使用了這個IP地址,咱們在B主機上看到了A主機發來的arp廣播,B主機也回覆了,因此B收到了A的ICMP請求,而後B主機就回復了ICMP報文,這個回覆報文是給網關的,而後網關又詢問A的mac,而後纔開始轉發。
上面這個報文有兩個地方值得注意,一是網關問了兩個主機的arp,只有B回覆,是由於咱們是在B主機上抓的包。第二個注意點是,咱們發現了ICMP的重定向報文,ICMP在兩種狀況下會發送ICMP重定向報文,一個收到報文的接口正在報文轉發到要去的接口,這時候路由會向源發送重定向,通告源主機不用通過他,直接發送到目的主機便可。第一種狀況,就是數據包的源地址和本身的下一跳處在同一個網段,會向源發送重定向,通告源主機不用通過他,直接發送到目的主機便可,咱們這裏的狀況應該是知足第二條;
由於咱們這個實驗環境並無放置路由器,是使用vlanif接口作的,並且ENSP抓的包,真實性不敢徹底保證。
其實咱們來能看到一些東西,就是網關其實還要經過arp廣播確認目標主機在本身哪一個接口之下。
那A主機究竟是如何與B主機通話的,A是直接將報文發給B,但B並非直接將報文發給A,而是將報文發給網關,而後網關又給交A的。
A:192.168.0.2/24 網關是192.168.0.1/24,而且網關正常 B:192.168.0.33/27 網關是192.168.0.1/24,而且網關正常 A和B主機接入到同一個三層交換機,兩臺主機們於同一個vlan,B主機 ping 主機A,是否能ping通?
B一上來就知道A和他不是一個網段,因此B會先問網關的mac,網關B後,B將ICMP的請求報文給網關,網關而後arp請求a,a回覆後網關將報文轉發到接口,請求報文到達,那回復呢?回覆的話,A會直接問B的MAC,而且B也會回覆A,這一題的報文轉發順序與與上一題相反,也是通的。