主機A與主機B通信,這時主機A肯定首先要封裝這些需要發給主機B的數據包,那么對於主機A來說,自己的IP地址和MAC自己肯定能夠輕易得到,對於主機B的IP地址這時主機A也應該知道,要不然它就不清楚自己將要和誰通信,當有了自己的IP地址,MAC地址以及主機B的IP地址后,主機A在數據包中可以正確地寫上源IP地址,目標IP地址,接下來的工作就是寫入自己的MAC地址(即源MAC),最后還必須正確寫入目標主機B的MAC地址,可這時主機A才發現自己根本沒有目標主機B的MAC地址,那該怎么辦呢?這時主機A就通過比較上面已經封裝好的源IP和目標IP,通過子網掩碼計算一下,發現源IP和目標IP恰好在同一個IP網絡內,那么它想要得到目標主機B的MAC地址就有辦法了,首先主機A就向本網段發過一個ARP請求,這個ARP請求包中包括主機A的源IP地址,源MAC地址,目標主機B的IP地址,而目標MAC地址為廣播MAC地址(全部為F),因為我們要找的就是目標MAC,所以這里用廣播MAC地址,又因為是以太網,所以整個局域網的所有主機都能收到這個請求MAC地址的數據包,當然主機B也能收到,因此在主機B收到此ARP請求后,立即構建一個包括自己的MAC地址的ARP回應包,回應給主機A,當主機A收到這個ARP回應后,終於完成了找尋目標MAC的重大任務,從而把目標主機B的MAC地址正確封裝進上面還未封裝結束的正准備發給主機B的數據包,在這時,源IP和源MAC以及目標IP和目標MAC都已正確存在於數據包中,那么這里主機A向網絡內發出這些數據包,因為目標地址在本網段,所以本網段所有主機都能收到這個數據包(這是以太網的特性),最后只有真正的目標主機B能夠打開這些數據包,在此,同網段兩台主機之間的通信就此圓滿結束!
2、不同網段主機間通信
在這里應該注意另外一個問題,因為主機A要尋找的目標主機B在同一網絡,所以主機A能夠通過ARP得到目標主機B的MAC地址,從而完成通信,當主機A在封裝數據包時檢測到目標主機並不在本網段,在這時,數據包不能把目標主機的MAC地址順利封裝進去,那么就用到另一種方法,那就是網關,主機A在准備發向主機B的數據中,封裝好自己的IP地址和MAC地址,同時也封裝好目標主機B的IP地址,數據包封裝到這里,主機A就利用上面得到同網段目標主機B的方法去請求得到網關的MAC地址,同樣也是用ARP去廣播,因為網關必須和本機在同一網段,理所當然,網關能夠收到這個ARP請求並能正確回應給主機A,這時主機A在數據包中封裝好自己的IP地址和MAC地址,同時也封裝好目標主機B的IP地址和網關的MAC地址,把數據包從網卡發出去,因為目標MAC是網關的,所以網關收到這個數據包后,發現目標MAC是自己,而目標IP卻是別人,所以它不可以再往上打開這個數據包,它要做的工作就是把這些數據包發給下一跳路由器(如果網關自身就是一台路由器的話),如果網關是一台普通PC,那么它就發給路由器,讓路由器把這些數據包正確傳輸到遠程目標網絡,到達遠程網絡后,它們的網關再將數據包發給數據包中的目標IP,即源主機A苦苦尋找的目標主機B,從而真正結束不同網絡之間的通信,回應的數據包也是用同樣的方法到達目的地,在這里,還需要注意的是,當網關把數據包發給下一跳路由器時,這個數據包必須由網關把目標MAC改成下一跳路由器的MAC地址(通過ARP得到),而源端MAC改成發出端口的MAC地址,否則下一跳路由器收到目標MAC不是自己的數據包,會丟棄不予理睬,下一跳路由器再發給下一跳路由器同樣要把目標MAC地址改為下一跳路由器的MAC地址再發出去!
最后還可以總結出:在網段通信時,數據包中的地址就是源IP,目標IP,源MAC,目標MAC,根本用不到網關,而當檢測到需要把數據包發到遠程網絡時,這時,目標MAC就必須改變了,在還沒有出內網時,目標MAC必須寫成網關的MAC地址發出去,當網關收到時,再把目標MAC地址改成下一跳的MAC地址發出去,同時源MAC地址要始終保持為發出端口的MAC地址(回應報文可以依靠它路由回去),而源IP及目標IP不曾改變(用於判斷收到數據包的本機IP和數據包IP是否一致,若一致不轉發),就算到達了公網上,目標MAC仍然在不斷改變着,直到最后,這個數據包到達目標IP的網絡,最終通信結束!
下面是個例子:Ping過程詳細解
配置好路由器Route和pc0、pc1的IP地址以及網關


這個過程可以具體分為四個階段:
一、pc0到Router階段


1、ping進程將調用因特網控制報文協議(ICMP),ICMP創建一個回應請求數據包;
2、ICMP將這個有效負荷交給因特網協議(IP),然后IP協議會創建一個數據包。這時,這個數據包將包含源IP地址、目的IP地址和值為0x01的協議字段。
3、一旦數據包被創建,IP協議將判斷目的IP地址是處於本地網絡中,還是處於一個遠程網絡中;
4、由於IP協議斷定這是一個遠程請求,這個數據包需要被發送到默認網關,這樣, 這個數據包才能路由到遠程網絡。本機注冊表將被使用,以查找配的默認網關;
5、主機pc0的默認網關被配置為172.16.0.1 要能夠發送這個數據包到默認網關,必須要知道路由器的FastEthernet0/0接口(其IP地址被配置為172.16.0.1)的硬件地址,因為只有這樣,數據包才可以被下傳給數據鏈路層並生成數據幀,
【注:】在本地局域網內,主機只可以通過硬件地址來進行通信,
pc0要想和pc1通信,它必須將數據包發送到本地網絡中默認網關的mac地址上,這一點很重要。mac地址永遠都應用於本地局域網,而絕不會通過路由器。
6、接着,pc0檢查arp緩存,查看一個默認網關的IP地址是否已經解析為硬件地址,如果已經被解析,數據包就將被釋放、傳送到數據鏈路層並生成數據幀(目的方的硬件地址也將通數據包一同下傳至數據鏈路層),要查看pc0主機上的arp緩存,可以使用下列命令:
PC>arp -a
Internet Address Physical Address Type
172.16.0.1 0004.9ade.a201 dynamic
如果這個硬件地址在pc0主機的arp緩存中尚未被解析,一個arp廣播將被發送到本地網絡,以搜索172.16.0.1的硬件地址,路由器會響應這個請求並提供FastEthernet0/0的硬件地址,接着pc0主機將緩存這個地址;

7、一旦這個數據包和目的方的硬件地址被交付給數據鏈路層,局域網驅動器將用來提供媒體訪問以通過以太網,此時將會產生一個數據幀,使用控制信息來封轉此數據包。在這個幀中包含有目的方和源方的mac地址,以及以太網類型字段。在本例中,這個協議為IP協議。在這個幀的結尾處是被稱為幀校驗序列(FCS)的字段,它是裝載循冗余校驗(CRC)計算值的區域。此數據幀還需要查詢一些信息,即pc0的mac地址,以及作為目的方的默認網關的mac地址,但這里並不包括pc1主機的mac地址;
8、數據幀完成封裝以后,就會被交付到物理層,以一次一位的方式發送往物理媒體(在試驗中是雙絞線對);
9、在沖突域中的每台設備將接收這些位並重建為幀。它們都運行CRC並核對保存在FCS字段中的內容,如果這 兩個值不匹配,此幀將會被丟棄。
如果這個
CRC值相吻合,那么就核查目的方的mac地址,如果匹配,那么路由器將將查看以太網類型字段,以了解在網絡層使用的協議;
10、數據包從數據幀中抽出,然后這個數據幀剩下的部分被丟棄,再把數據包傳給以太網類型字段中列出的上層協議,在這里是傳給IP協議;
11、IP會接受這個數據包,並檢查其目的IP地址,由於數據包的目的地址與接收路由器所配置的任一地址不相匹配,路由器將會在路由表中查看目的IP網絡的地址;
12、此路由表中必須包含有網絡172.16.1.0的表項,否則此數據包會被立即丟棄,然后一個攜帶有“destination network unavailable”信息的ICMP包將被發送回發送方pc0;
13、如果路由器找到目的方的網絡,數據包將被交換到輸出接口,由於在被試驗中所有網絡都是直連的,因此沒有必要使用主動路由協議;
二、Router到pc1階段

14、路由器將交換此數據包到FastEthernet0/1的緩沖區內;
15、FastEthernet0/1的緩沖區需要了解目的方主機的mac地址,它首先檢查arp緩存,
如果
pc1的mac地址已經被解析並保存在路由器的arp緩存中,則這個數據包和mac地址將被傳遞到數據鏈路層並組成數據幀。下面是路由器的arp緩存:
Router#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 172.16.0.1 - 0004.9ADE.A201 ARPA FastEthernet0/0
Internet 172.16.0.2 35 0001.63BC.C8A7 ARPA FastEthernet0/0
Internet 172.16.1.1 - 0004.9ADE.A202 ARPA FastEthernet0/1
Internet 172.16.1.2 35 000C.8513.CAAB ARPA FastEthernet0/1
如果這個硬件地址尚未被解析,路由器將從
FastEthernet0/1發送一個arp廣播到請求,以查找 172.16.1.2的硬件地址,pc1會響應這個請求並提供硬件地址,接着路由器將緩存這個地址;然后這個包和硬件地址都會被發送到數據鏈路層並組成數據幀;
16、數據鏈路層將使用這個目的方的源方的mac地址,以及以太網的類型字段和FCS來創建一個數據幀,這個幀將被
17、pc1主機會接收到此幀,並立即運行CRC,如果運算結果與FCS字段的內容相匹配,這個目的mac地址將被檢查,如果發現是匹配的,隨后將檢查以太網類型字段中的值,以判斷應該將數據包上傳給網絡層的什么位置;
18、在網絡層,IP會接收這個數據包,並檢查其目的方的IP地址,由於他們是匹配的,數據包的協議字段將會被檢查,以了解有效負荷應該交給誰;
三、pc1到Router階段

19、此有效負荷會交給ICMP,它將知道這是一個回應請求,ICMP會應答這個請求,通過即可丟掉這個數據包並隨之產生一個新的有效負荷來作為回應應答;
20、隨后創建的數據包中將包含源方和目的方的地址、協議字段和有效負荷。現在,目的方設備為pc0;
21、IP協議將判斷目的IP地址是處於本地網絡中,還是處於一個遠程網絡中,由於IP協議斷定這是一個遠程請求,這個數據包需要被發送到默認網關,這樣,這個數據包才能路由到遠程網絡。本機注冊表將被使用,以查找配的默認網關;
22、在pc1的注冊表中可以找到默認網關的IP地址,之后將查看arp緩存,以了解是否已經完成了從IP地址到mac地址的解析;
23、一旦默認網關的mac地址找到,此數據包和目的方的mac地址都將被送往數據鏈路層,以完成數據幀的封轉;
24、數據鏈路層會封裝數據包的內容,並在幀報頭中包含以下內容:
目的方和源方的mac地址 在以太網類型字段中填充0x0800(IP) 將CRC結果填入FCS字段
25、這時,幀將會被傳給物理層,並以一次一位的方式發送到網絡媒體上;
26、路由器的FastEthernet0/1接口會接收到這些位並重建為一個幀,CRC校驗被運行,幀的FCS字段被檢驗,以確認 兩個結果是相符的;
27、CRC檢驗通過之后,目的mac地址將被檢查。由於路由器的接口同這個地址是想匹配的,數據包將被從這個幀中取出, 然后以太網類型字段將被檢查,以了解數據包應該投遞給網絡層上的哪一個協議;
28、由於協議被判斷為IP。於是IP將得到這個數據包,首先IP將對IP報頭運行CRC校驗,然后檢查目的方的IP地址;
29、在這種情況下,路由器確實知道到達172.16.0.0的方式,這一輸出的接口是FastEthernet0/0,於是數據包將交換到接口FastEthernet0/0上;
四、Rouetr到pc0階段


30、路由器檢查arp緩存,確定172.16.0.2的mac地址是否已經被解析;
31、由於在將數據包傳送到pc1的過程中,172.16.0.2的mac地址已經被緩存起來,因此,這一mac地址和數據包將被傳遞到數據鏈路層;
32、數據鏈路層會使用這個目的方的mac地址和源mac地址,然后將IP放入以太網類
33、這個幀然后被傳送到物理層,以一次一位的方式發送到本地網絡;
34、pc0將接收這個幀,運行CRC算法,檢查目的方的mac地址,並查看以太網類型字段中的內容,以判斷誰來處理這個幀;
35、由於IP是被指定的接收者,隨后這個數據包被傳遞給網絡層的IP協議,它將檢查包的協議字段,以確定進一步的操作,IP發現要將此有此有限負荷交給ICMP的指示,接着ICMP將確定此數據包是一個ICMP的應答回復包;
36、ICMP通過發送一個感嘆號(!)到用戶接口來表明它已經接收到一個回復,在命令提示行下表現為收到報文,這之后,ICMP會嘗試繼續發送4個應答請求到pc1。
