同一子網
兩台主機分別為A和B,A主機中如果使用名稱訪問B主機必須先使用DNS,將B的名稱解析為IP,然后A主機一以自己的IP為源地址,B的IP為目標地址封裝IP數據包,同時使用A自己的網卡接口的子網掩碼和B的IP進行與運算,如果B和自己在636f70797a6431333262353438相同網絡機載接口直接發送出去。但接口在發送時還需要將IP數據包封裝成數據幀,這需要兩台主機的MAC地址。如果A知道B的MAC,則直接使用B 的MAC作為數據幀中的目的地址,如果不知道則向網絡中發送ARP廣播,將B的IP解析為MAC。
得到B的MAC地址后完成數據幀的封裝,將數據幀用高低不同的電平值表示發送到物理線路中就可以了。這是同一子網中A向B的單向通信過程。
不同子網
不同子網的通信過程中,DNS的名稱解析是一樣的。在數據包當中封裝的源IP是A,目標IP是B,這個也一樣。但是當A主機使用接口掩碼和B的IP進行與運算后會發現兩個IP不在同一子網,這是A會將這個數據包發送給本網絡的網關(通常是本網的路由器),由網關來轉發。另外,在封裝數據幀時,主機需要知道B的MAC地址,向外廣播要求解析B的MAC,但B不在本網絡,所以只能有網關的ARP代理功能實現,但A主機得到的並不是B的MAC地址,而是網關的MAC地址,所以A在數據幀中封裝目的地址為本地網關。接下來從接口發送出去,當數據到達網關,網關會讀取數據包中的目的IP,並根據目的IP進行轉發,在轉發時數據包中的目的IP不變,但數據幀中的源MAC地址和目的MAC地址都會發生變化。源MAC地址變為網關的發送接口的MAC地址,而目的地址可能是B主機的MAC或是下一個路由器的接口MAC。這就是不同子網的單向通信過程。B向A的通信和此過程是一樣的。
如下摘自:https://blog.csdn.net/whueratsjtuer/article/details/89702586
學習計算機網絡如果只是被動的接受知識的話,不但枯燥,效率低下,而且理解也不夠深。這里我推薦一款網絡仿真軟件cisco packet tracer。這款軟件最有價值的地方在於用戶可以通過軟件來模擬真實的網絡,能夠零成本搭建一套計算機網絡。我們可以邊學網絡邊用這個軟件來進行仿真,驗證所學知識。
下載鏈接:https://www.netacad.com/courses/packet-tracer 學生版是免費的,學習的話足夠了。
下面是軟件主界面的截圖 :
我們看看同一網段內的主機是怎么通信的。
1. 假設我們有如下的一個子網:
三個主機通過一個hub進行連接,我們知道hub是第一層(物理層)設備,所以它只具備無腦廣播的功能。
此時,子網內的任何一個兩個主機之間的通信都是通過廣播的方式來進行,而且一次只能允許一台主機發送消息(沖突域),否則同一條線路可能同時傳輸兩個信號,會相互干擾。這種通信方式效率非常低,因此hub現在已經很少使用了。
2. 把上圖中的hub換成switch:
Switch是第二層網絡設備(數據鏈路層),它具備了數據單播的能力,因為switch具有自學習能力(其實就是維護一個mac-address-table),保存了跟它連接的設備的mac地址與端口的映射關系。
數據鏈路層的數據包格式如下:
它包含了目標mac和源mac。當數據包從一台主機(MAC地址為X)發送另一台主機(MAC地址為Y)時,數據包先發送交換機上,交換機在mac-address-table更新X和端口的映射。然后查詢Y是否在表中,如果存在則將數據轉發到該端口;如果不存在則廣播到所有端口上,Y主機收到以后返回一個數據包到交換機,交換機更新Y的映射關系。這樣下載X再給Y發送數據的時候,就不需要廣播了。
如果一個網段內主機非常多,這個表可能會是TB級別的,不易擴展和維護。那我們可以采用這樣一個辦法,那就是將多個主機組成一個子網,這個子網共用一個邏輯地址(其實就是IP地址),子網的網絡設備只需要維護子網內的主機就行了。然后將許多子網連接起來組成一個更大的子網,這樣可以一直擴展下去,理論上就可以容納無窮多台主機了。如下圖:
有了IP地址以后,我們邊可以將數據包先發送到目標主機所在的子網,剩下的可以依據上面的原理就可以發送到目標主機了。
注:先看看IP數據包的大概格式。可以看到數據格式跟數據的流動方式密切相關的。數據從主機A的應用層依次往下進行封裝,在后再路由器先解封,在重新封裝,最后發到目標主機進行解封,所以才有了上面的數據格式
3. 在同一子網中,兩個主機要通過IP地址進行通信,過程是怎樣的呢?
以ping命令為例,當我們用PC0 ping PC1時,數據包發送過程如下圖所示:
總結一下,每次同一子網內主機之間要通信之前,源主機都要查詢目標ip是否在自己的mac-ip映射表中,如果不存在就要通過arp協議來尋找目標主機的mac地址,找到目標主機的mac之后,源主機會將目標主機的mac-ip添加到映射表中,然后就可以開始點對點發送數據了。
下面來看看不同網段之間主機之間的通信過程。
假設我們有如下的網絡拓撲結構:
我們要跟目標主機通信,就必須知道目標主機的ip和mac地址。如果源主機與目標主機不屬於同一子網,那么目標mac地址為默認網關的mac地址。隨后數據被發送到默認網關,發送的方式參考上面同一子網內主機的通信(因為默認網關與源主機必定是在同一個子網中的)。默認網關收到后,將目標mac地址設置為下一跳的路由器的mac地址(找不到下一跳的mac地址就使用arp協議,廣播到所有子網設備)。在這一過程中目標IP和源IP始終不變,只有目的mac地址不斷變化。
為什么要同時使用mac地址和ip地址?
不同的地址作用於不同的層,mac作用於數據鏈路層,ip作用於網絡層;數據包中,“mac地址包在ip地址之外面” ,每當一個數據包被解析時,總是mac地址先被解析到。如果數據包的mac地址跟當前設備的mac地址不符,則直接丟棄,反之會繼續向上層發送,這樣能夠提高效率。所以可以這樣理解,ip地址是邏輯地址,它可以計算網絡的最短路徑,為數據包指明了下一個應該去的設備,將下一個設備的mac地址設為目的mac地址,從而使得該數據包能夠被送到那個路由器。
總結起來可以這么理解,ip地址為數據包去向指明了方向,下一個站是哪里;而mac地址有點類似於一個跑腿的,能夠將數據包運送到指定的設備。因此,可以看到在整個傳輸過程中目的ip始終不變,應為它表明了數據包的終點,每次到達一個路由器,都會計算出下一步怎么走最優,一旦找到了下一個目標路由器,則將目的mac設為那個路由器的mac,至於怎么到達,就不是ip地址需要操心的了,而是由數據鏈路層和物理層負責。