該章節舉了如下例子:

伺服器A: IP: 192.168.26.129/24 GW: 192.168.26.2

伺服器B: IP: 192.168.26.3/27 GW: 192.168.26.2

B和A之間能否正常通信。

書中用實踐加解說的形式給出了能互通的結論,過程簡述如下:

  1. B ping A,ICMP包走網關轉發給A;
  2. 因為A認為和B同子網,A直接發送ARP請求查詢B的MAC;
  3. B回復ARP響應給A,同時緩存A的MAC(該步驟不產生子網驗證);
  4. A收到ARP響應,拿到了B的MAC,於是雙方愉快的ping通了。

我的困惑如下:

就算ARP響應不關心子網,在B收到ICMP請求準備回復之前,難道不是應該先用自身IP和目的IP和自己的子網掩碼做一次與運算之後才能決定IP包的下一跳嗎?查詢ARP表和子網驗證這兩步驟的優先順序到底是怎麼樣的?


整個故事情節,還忽略了兩個重要的事件:

(1)ICMP Redirect(2)Gratuitous ARP讓我們回顧一下整個事件的先後次序:主機A、B啟動好,會主動發送Gratuitous ARP,這個消息是廣播發送,所以A、B、Gateway 都可以收聽到該廣播,於是A、B可以互相學習到對方的MAC地址,並緩存在本地的ARP Cache里,為了防止超時,還會周期性刷新。1. B發現A與自己不在相同網段,需要聯繫gateway,於是獲得gateway 的MAC,發給Gateway。

2. Gateway發現流量需要發給A,需要將流量沿著入向(incoming) 介面發送出去(outgoing), 這很不合理。這不符合「horizon split」 精神。

3. 於是gateway給B發送一個「ICMP Redirect」消息,意思是,以後這樣的流量不要來煩我,請直接聯繫A。

4. 同時,gateway 儘管很不爽,還是耐著性子把Ping echo request 發給了A。

5. A發現B與自己在同一個網段,又有B的MAC地址,於是愉快地聊了起來。上文中步驟3,B收到Gateway的「ICMP Redirect」,也非常不爽,心中罵道:「娘西皮,如果我能直接聯繫A,還會麻煩你?」於是默默地將「ICMP Redirect」丟棄,繼續我行我素…

需要著重指出的三點:

(1)B收到A的gratuitous ARP 消息,會不會接收並緩存?

接收並緩存!

(2)Gateway發現B依然將流量發給自己,還會發「ICMP Redirect」消息嗎?

在「maximum threshold」以下會發,超過了可能就不發了。

(3) B之所以我行我素,是因為B認為A和自己不在一個網段,必須通過gateway轉發。


這是一個三角形的路線,B走網關經過網關轉發到A,A直接通過二層發送到B,去和回是不同路線,這並不影響網路的使用,IP層本質上來說是單向發送的,並不要求雙向迴路走相同路徑。不過這裡要求網關能夠將一個二層網路收到的報文轉發回同一個二層網路,這是需要配置的,並不是所有路由器都允許將同一個二層網路的報文轉發回同一個二層網路,有的需要打開相關的設置。


ARP僅存在於區域網,用來做MAC和IP的映射。和IP層是同級關係,並不是基於IP協議的,所以不存在定址。

B收到A的ARP請求後,直接廣播應答就可以了。也就是說ARP請求和應答,都是廣播的形式,同一區域網的設備都能收得到。


收到icmp報文,這已經過了ip層了,回包必然也是要過ip層,要通過自己的路由表和子網掩碼來確定應答的包發給誰的。通過路由表確定這個包發給誰,通過那個網卡出去之後。在把包丟給網卡,在上面找要丟給的ip的對應的mac。然後通過mac地址丟給他的


這個案例基本就是要去理解PC機間基本的通信原理就ok了。

假設這兩台伺服器是A和B。

當兩台伺服器A和B剛開機,A與B本地都也沒有對方的arp緩存。如果A要和B通信,正常來說,兩層幀頭需要添加源目MAC地址就是(A與B的),現在沒有B的MAC地址,本地沒有緩存嘛

這時A就會向外發起arp廣播包,直連的交換機收到這個arp廣播後,就會向本地的廣播域里介面廣播,當然收到arp請求的介面除外。

這個時候,那麼B就會回應給A它的MAC地址,並且SW的介面就都能學到A、B的MAC,填寫在MAC表裡,這時A就能正常封裝兩層幀頭,發送給SW,SW收到後就會查看目的MAC,並且查找MAC地址表。如果MAC地址表存在B的MAC,就會把兩層幀頭轉發到相應的介面上。

所以,如果兩台PC是在同一網段,其實是屬於兩層通信,主要是查找MAC表,封裝兩層枕,轉發數據幀。如果是跨三層,才會去考慮,子網的問題。謝謝,希望能講的明白了


我是有點疑問…A為什麼認為自己和B是同一個子網的呀?


推薦閱讀:
相关文章