Ping指令的工作過程及單向Ping通的原因
當網絡出現問題時,我們最常用的測試工具就是“Ping”指令了。但有時候我們會碰到單方向Ping通的現象,例如通過HUB或一根交叉線連接配接的在同一個區域網路内的電腦A、 B,在檢查它們之間的網絡連通性時,發現從主機A Ping 主機B正常而從主機B Ping 主機A時,出現“逾時無應答”錯誤。為什麼呢?
要知道這其中的奧秘,我們有必要來看看Ping指令的工作過程到底是怎麼樣的。
假定主機A的IP位址是192.168.1.1,主機B的IP位址是192.168.1.2,都在同一子網内,則當你在主機A上運作“Ping 192.168.1.2”後,都發生了些什麼呢?
首先,Ping指令會建構一個固定格式的ICMP請求資料包,然後由ICMP協定将這個資料包連同位址“192.168.1.2”一起交給IP層協定(和ICMP一樣,實際上是一組背景運作的程序),IP層協定将以位址“192.168.1.2”作為目的位址,本機IP位址作為源位址,加上一些其他的控制資訊,建構一個IP資料包,并在一個映射表中查找出IP位址192.168.1.2所對應的實體位址(也叫MAC位址,熟悉網卡配置的朋友不會陌生,這是資料鍊路層協定建構資料鍊路層的傳輸單元——幀所必需的),一并交給資料鍊路層。後者建構一個資料幀,目的位址是IP層傳過來的實體位址,源位址則是本機的實體位址,還要附加上一些控制資訊,依據以太網的媒體通路規則,将它們傳送出去。
主機B收到這個資料幀後,先檢查它的目的位址,并和本機的實體位址對比,如符合,則接收;否則丢棄。接收後檢查該資料幀,将IP資料包從幀中提取出來,交給本機的IP層協定。同樣,IP層檢查後,将有用的資訊提取後交給ICMP協定,後者處理後,馬上建構一個ICMP應答包,發送給主機A,其過程和主機A發送ICMP請求包到主機B一模一樣。
從Ping的工作過程,我們可以知道,主機A收到了主機B的一個應答包,說明兩台主機之間的去、回通路均正常。也就是說,無論從主機A到主機B,還是從主機B到主機A,都是正常的。那麼,是什麼原因引起隻能單方向Ping通的呢?
一、安裝了個人防火牆
在共享上網的機器中,出于安全考慮,大部分作為伺服器的主機都安裝了個人防火牆軟體,而其他作為客戶機的機器則一般不安裝。幾乎所有的個人防火牆軟體,預設情況下是不允許其他機器Ping本機的。一般的做法是将來自外部的ICMP請求封包濾掉,但它卻對本機出去的ICMP請求封包,以及來自外部的ICMP應答封包不加任何限制。這樣,從本機Ping其他機器時,如果網絡正常,就沒有問題。但如果從其他機器Ping這台機器,即使網絡一切正常,也會出現“逾時無應答”的錯誤。
大部分的單方向Ping通現象源于此。解決的辦法也很簡單,根據你自己所用的不同類型的防火牆,調整相應的設定即可。
二、錯誤設定IP位址
正常情況下,一台主機應該有一個網卡,一個IP位址,或多個網卡,多個IP位址(這些位址一定要處于不同的IP子網)。但對于在公共場所使用的電腦,特别是網吧,人多手雜,其中不泛有“探索者”。曾有一次兩台電腦也出現了這種單方向Ping通的情況,經過仔細檢查,發現其中一台電腦的“撥号網絡擴充卡”(相當于一塊軟網卡)的TCP/IP設定中,設定了一個與網卡IP位址處于同一子網的IP位址,這樣,在IP層協定看來,這台主機就有兩個不同的接口處于同一網段内。當從這台主機Ping其他的機器時,會存在這樣的問題:
(1)主機不知道将資料包發到哪個網絡接口,因為有兩個網絡接口都連接配接在同一網段;
(2)主機不知道用哪個位址作為資料包的源位址。是以,從這台主機去Ping其他機器,IP層協定會無法處理,逾時後,Ping 就會給出一個“逾時無應答”的錯誤資訊提示。但從其他主機Ping這台主機時,請求包從特定的網卡來,ICMP隻須簡單地将目的、源位址互換,并更改一些标志即可,ICMP應答包能順利發出,其他主機也就能成功Ping通這台機器了。