今天看到一個問題:B能否ping通A。這裡完整描述一下問題:
如下圖,服務器A的IP地址為192.168.26.129,掩碼為255.255.255.0,服務器B的IP地址192.168.26.3,掩碼被錯誤的設置為255.255.255.224。假設現在服務器B ping服務器A,請問能ping通嗎?
首先看系統是如何進行IP地址的路由的。我們知道,處于同一網絡中的兩台主機會直接将數據包發到目的IP地址,不需要作任何路由。同一網段(由子網掩碼劃分出來的網段相同)判斷标準是什麼呢?IP地址與掩碼與運算的結果相同則二者處于同一網絡,如果不在同一個網絡中,則需要通過路由尋找網關來轉發數據包。因此,首先網關必須IP地址在同一網絡,否則配置網絡時,會自動報錯。
針對處于不同網絡中的兩台主機:首先,判斷标準是:IP地址與子網掩碼與運算的結果,與目的IP與本端網關的與運算結果不相同。系統則會到本地的路由表中查詢能夠匹配得上的路由信息,影響路由的幾個因素有:策略路由、主路由和默認網關。針對上面的問題,當B對A發起ping時,通過計算,發現A與自己在不同的網絡中,因此B會将數據包發給網關,網關将數據包轉發給A,當B給A回複ICMP報文時,發現A與自己在同一個網絡中,因此直接将數據包發給了B。這樣實際的數據包傳輸的過程為:
因此隻要B端沒有配置網關或者網關不起作用的話,就無法ping通。如果是從A對B發起ping,并且B沒有網關,那麼抓包會發現,A上面可以正常發出ICMP包,但是收不到B回應的ICMP包,同樣在B側抓包,會發現,能收到ICMP包,但是無法回應給A。
從這個問題稍微做一點延伸,路由表與默認網關的原理。
當我們需要指定哪些對端網絡可以訪問本機時,就可以配置具體的路由來實現。在這篇博客中詳細講述了路由表的操作:linux路由表的配置。一般情況下,我們可能隻需要主路由表,如:主機通過一個網卡接入到局域網中,通過網關實現局域網與外部網絡的連接,這個時候,路由器作為網關,實現數據包的路由和轉發。
如上圖,這樣的網絡配置,Windows系統會為我們生成一條路由信息:
表明所有的數據包都走192.168.1.1,也即是網絡中路由器指定的網關地址。
當系統的網絡環境比較複雜時,如主機有兩塊網卡,各自接入一個獨立網絡中,指定了兩塊網卡的配置為:
A網卡,IP:192.168.1.2,網關:192.168.1.1,掩碼:255.255.255.0
B網卡,IP:100.100.1.2,網關:100.100.1.2,掩碼:255.255.255.0
其中A接入的是内部網絡,B通過網關接入外部網絡(Internet)。在Linux系統上面,如果将A、B兩個網絡的網關同時作為主機的默認網關,那麼會發生什麼事情,如果有一個Internet上的主機200.200.1.2通過B網關轉來數據包,需要處理和回應。當回應數據包時,系統在路由表中尋找可用的路由。會發現,沒有路由能與之匹配,因此隻有将數據包走給默認網關。但是此時,系統又有兩個默認網關,無法決定到底是用哪一個。一般而言會随機選擇其中的某一個。如果剛好選擇的也是B,那麼此時網絡能通,如果選擇的是A,則數據包最終會被A的網關丢棄。網絡表現為時斷時通。
解決這個問題的辦法有:1、針對外部網絡的IP地址添加具體的路由,使之綁定B網絡的網關上面。2、去掉A網絡的網關作為默認網關。一般我們并不知道哪些是外部網絡,因此使用方法2比較容易操作。因此針對兩塊網卡,并不能對等的去配置網絡,而是要視具體的情況區别對待。往往有時候,因為對配置命令的具體的作用不夠熟悉,會導緻主機在某個網絡中呈現時斷時通的現象。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!