http://www.voidcn.com/blog/gao1440156051/article/p-5787916.html
ip數據包經由路由轉發的時候源ip,目的ip是否改變?
最近面試網絡方面的經常問到這個問題,答案是不能改變的,除非做了nat轉換才能改變。
不過mac地址是變化的,因為發送端開始不知道目的主機的mac地址,所以每經過一個路由器mac地址是變化的。
目的mac地址是如何得到的?
TCP/IP里面是用的ARP協議。比如新建了一個內網,如果一台機器A找機器B,封裝FRAME時(OSI的第二層用的數據格式),要封裝對方的MAC,開始時A不知道B的MAC,只知道IP,它就發一個ARP包,源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是廣播的。然后這個請求包在內網內被廣播,當其他機器接到這個包時,用目的IP和自己的IP比較,不是的話就丟棄。B接到時,發現IP與自己的一樣,就答應這個包的請求,把自己的MAC送給A。如果B是其他子網的機器,那么路由器會判斷出B是其他子網,然后路由器把自己的MAC返回給A,A以后再給B發包時,目的MAC封裝的是路由器的。
路由轉發過程:
當主機A發向主機B的數據流在網絡層封裝成IP數據包,IP數據包的首部包含了源地址和目標地址。主機A會用本機配置的24位IP網絡掩碼255.255.255.0與目標地址進行與運算,得出目標網絡地址與本機的網絡地址是不是在同一個網段中。如果不是將IP數據包轉發到網關。
在發往網關前主機A還會通過ARP的請求獲得默認網關的MAC地址。在主機A數據鏈路層IP數據包封裝成以太網數據幀,然后才發住到網關……也就是路由器上的一個端口。
當網關路由器接收到以太網數據幀時,發現數據幀中的目標MAC地址是自己的某一個端口的物理地址,這時路由器會把以太網數據幀的封裝去掉。路由器認為這個IP數據包是要通過自己進行轉發,接着它就在匹配路由表。匹配到路由項后,它就將包發往下一條地址。
路由器轉發數據包就是這樣,所以它始終是不會改IP地址的。只會改MAC.
當有數據包傳到路由器時,路由器首先將其的目的地址與路由表進行對比,如果是本地網絡,將不會進行轉發到外網絡,而是直接轉發給本地網內的目的主機;但是如果目的地址經路由表對比,發現不是在本網中,有nat就將改變源地址的IP(原源地址的Ip地址改為了路由器的IP地址),路由器將數據包轉發到相應的端口,進行通信。
比如:
如:A訪問B,
首先對比是否同一子網,如果是,檢查ARP表,有B的MAC就直接發送,沒有就發送ARP請求.如果否,發送到默認網關C,源IP為A,源MAC為A,目的IP為B,目的MAC地址為C,
C接收到這個包,檢查路由表,發送到下一跳D,源IP為A,源MAC為C,目的IP為B,目的MAC為D…..
如此循環,直到發送到B.
NAT為特殊應用,會修改源IP為網關自己外網IP。
數據包經由路由轉發時源、目的IP地址及MAC地址變化情況
關於MAC地址和IP地址在傳輸過程中變與不變的問題:
結論:mac地址在同一個廣播域的傳輸過程中是不變的,在跨越廣播域的時候會發生改變的;而IP地址在傳輸過程中是不會改變的(除NAT的時候)。
我們知道的幾個概念:
首先我們要知道,MAC地址是用於同一物理或邏輯第2層網絡上的設備間進行通信的;
而第三層地址(IP地址)是可以在多個網絡設備之間通信的。
下面我們來分析一下:
MAC地址是在同一個廣播域有效的,那么去了另外一個廣播域(網段)MAC地址肯定要改變的;
在同一個廣播域中數據幀的mac地址是不會變的,因為所有交換機應該都知道該廣播域中的所有主機的MAC地址(如果不知道會通過被動廣播的方式來學習到)。既然知道所有的MAC地址,那么當我交換機收到數據幀的時候就看一下目標MAC地址,然后對照一下MAC地址表,從對應的接口仍出去就好了。
IP地址是在整個網絡中有效的,整個Internet網絡就相當於是一個大的地圖,同樣知道所有的IP地址如何到達,那么在傳輸過程中源ip和目的ip也是不會改變的。當路由器收到數據包的時候,檢查數據包的目的IP地址,然后查找路由表(路由轉發表),選擇合適的接口發出去。
練習一下:
圖中A-R4-R2-B
假設有數據幀X,傳輸過程中:
A到R4:MAC地址(存在的話)源地址是A,目的地址是R4;
R4到R2:MAC地址(存在的話)源地址是R4,目的地址是R2;
R2到B:MAC地址(存在的話)源地址是R2,目的地址是B;
在沒有經過NAT情況下,源IP地址和目的IP地址在整個傳輸過程是不能改變的。
A到R4:IP地址 源地址是A,目的地址是R4 B;
R4到R2:IP地址 源地址是A,目的地址是R4 B;
R2到B:IP地址 源地址是A,目的地址是R4 B;
當交換機收到一個數據包時;
交換機會將這個數據包包頭的目的MAC信息提取出來,與自身的MAC地址表比較;
情況一:如果找到對應項,則按MAC表進行轉發;
情況二:如果沒找到對應項,則在除了接收到數據包以外的所有端口進行轉發(廣播);
解釋:MAC地址表 是MAC地址與端口對應的關系表;即某個MAC地址連接在某個端口;
問題:當情況二發生時,需要在其他所有端口進行廣播(這樣做其實很不好),這個廣播會到什么地方結束呢?答:——路由器。
為什么到路由器就會結束了呢?
當路由器接收到一個數據包時,工作過程如下:
首先提取數據包頭的目的MAC信息,與自身MAC表比較:
情況一:如果找到對應項,則按MAC表進行轉發(與交換機一樣);
情況二(亮點來了):如果沒找到則提取數據包頭的目的IP信息,則與自身的路由表進行比較(又分兩種情況)
情況二。1找到了對應的路由表,則按着路由表轉發(與查到MAC表很像啊)。
情況二。2沒找到對應路由表,則按着缺省路由轉發(發現了嗎自始自終沒有出現過廣播)
解釋:路由表和MAC的區別在於,路由表存放的是目的IP下一步要去的地方的IP。
廣播在路由器能夠結束,原因就是路由器會在查找不到對應MAC表時,根據目的IP進行路由。路由過程的兩種情況都不存在廣播。