人們最熟悉的網路可以說是乙太網,而且人們都知道,每塊網絡卡都有乙個編號,也就是網絡卡位址(稱為mac位址),代表計算機的實體地址。另外,網路中的每一台計算機都分配了乙個ip位址,這樣,每台計算機上都有兩個位址,ip位址和mac位址。
ip位址並不能代替mac位址,前者是在大網中為了方便定位主機所採用的方式,如果網路規模不大,完全可以不使用ip位址。但是,無論什麼網路環境實體地址都是要使用的。因為實體地址對應於網絡卡的介面,只有找到它才算真正到達了目的地。而ip位址是為了方便定址人為劃分的位址格式,因此ip位址也被稱為邏輯位址,又因為這種結構化位址是在osi的第3層定義的,也被稱為3層位址。相應地,實體地址是在第2層定義的,被稱為2層位址。ip位址是一種通用格式,無論其下一層的實體地址是什麼型別,都可以被統一到一致的ip位址形式上,因此ip位址遮蔽了下層實體地址的差異。
既然ip位址並不能代替實體地址,它只是在邏輯上表示一台主機,實體地址才對應於網絡卡的介面,只有找到它才能將資料送達到目的地。那麼如何把二者對應起來就是要解決的首要問題,因為二者代表的是同一臺機器。為此人們開發了位址解析協議(address revolution protocol,arp),位址解析協議負責把ip位址對映到實體地址。
下面分兩種情況解釋arp的工作過程:同一子網內的arp和不同子網間的arp。
(1)同一子網內的arp
主機a (172.16.20.20/24)與主機b通訊。假設在a上ping主機b的ip位址172.16.20.5/24。
為了把測試資訊傳送到主機b和a,將構造關於ping的ip資料報。可以確定,這個包頭中的源ip位址是172.16.20.20,目的位址172.16.20.5。ip資料報構造完成以後,需要將它從網絡卡傳送出去,在這之前必須要封裝2層的幀頭,本例中2層是乙太網環境,因此需要構建乙太網幀頭。分析幀頭中的mac位址情況,它的源位址應該是00-0c-04-18-19-aa,這個位址很容易獲得,主機a直接從自己的網絡卡中獲取即可,幀頭中的目的mac位址應該是00-0c-04-38-39-bb,它對應於主機b的mac位址。主機a如何得知主機b的mac位址呢?這是主機a在封裝2層幀頭時必須解決的問題,否則無法傳送這個幀出去。主機a唯一的辦法是向主機b發出詢問,請主機b回答它自己的mac位址是什麼。arp協議正是負責完成這一工作的,即已知目的節點的ip位址來獲取它相應的實體地址。
arp的操作過程如下。
① 主機a發出arp請求,請求幀中的資料部分包括傳送者mac位址00-0c-04-18-19-aa、傳送者ip位址 172.16.20.20和目標mac位址,這裡全部填充0,因為它未知(這正是arp要詢問的),目標ip位址是172.16.20.5。
② 在請求幀的幀頭部分,目的mac位址是廣播位址,因此所有收到的站點(其中就包括主機b)都開啟這個幀檢視其資料部分的內容。
③ 只有符合目標ip位址172.16.20.5的主機(主機b)回答這個arp請求,其他站點則忽略這個請求。
④ 主機b把自己的mac位址寫入「目標位址」欄位中,送給主機a。
主機a通過arp的操作得到了主機b的mac位址,可以繼續完成它的封裝過程,從而最終執行了ping的操作。
arp請求者收到應答後,會在自己的快取中構建乙個arp表,將得到的位址資訊快取起來,以備將來和同一目的節點通訊時直接在arp表中查詢,避免了多次的廣播請求。
實際上,完整的操作過程是:主機a在準備構造2層幀頭時,首先根據目的ip去查詢arp表,如果找到對應項,則直接得到目的mac位址,如果沒有查到才執行上面所說的arp廣播請求。這樣做是為了最大限度地減少廣播。
(2)不同子網間arp
假設在主機a(172.16.10.10/24)上ping主機b的ip位址172.16.20.5/24,隨後主機a將構造關於ping的ip資料報,這一過程與前面相同,只是目的位址在另外乙個子網中。主機a仍然面臨如何確定2層幀頭中的目的mac位址的問題。
如果仍然依照目的節點和源節點位於同一子網中的思路,這個目的mac應該是主機b網絡卡的mac位址。順著這個思路走下去,看看會發生什麼情況。
由於主機b位於路由器的另外一側,因此主機b要想收到主機a發出的乙太網幀必須通過路由器**,那麼路由器是否會**呢?答案是否定的。路由器在收到某個乙太網幀後首先檢查其目的mac,而這裡假設a發出的幀中的目的mac是b的網絡卡位址,路由器從ethernet 0介面收到該幀後,檢視目的mac位址,發現它不是自己的mac位址,從而將其丟棄掉。由此看來,位於不同子網的主機之間在通訊時,目的mac位址不能是目標主機的實體地址。
實際上,不同子網之間的主機通訊要經過路由過程,這裡就是需要路由器a進行**。因此,主機a發現目標主機與自己不在同乙個子網中時就要借助於路由器。它需要把資料幀送到路由器上,然後路由器會繼續**至目標節點。在該例中,主機a發現主機b位於不同子網時,它必須將資料幀送到路由器上,這就需要在幀頭的「目的位址」欄位上寫入路由器介面ethernet 0的mac位址。因此,主機a需要通過arp詢問路由器ethernet 0介面的mac位址。
這裡仍然是兩個操作過程,乙個是arp請求;另乙個是arp應答。不過在arp的請求幀中,目標ip位址將是路由器ethernet 0介面的ip位址,這個位址實際上就是子網172.16.10.0/24中主機的預設閘道器。路由器收到arp請求後回答自己ethernet 0介面的mac位址,這樣主機a就獲得了其預設閘道器的mac位址。主機a構建完整的資料幀並將其傳送給到路由器。路由器收到主機a的資料後,根據路由表的指示將從另一介面ethernet 1把資料傳送給主機b。同樣,在傳送前路由器也要封裝2層幀頭,也需要知道主機b的mac位址,路由器也是通過arp協議來獲得b的mac位址的。
綜合以上兩種情況,主機a的完整操作過程如下:
主機a首先比較目的ip位址與自己的ip位址是否在同一子網中,如果在同一子網,則向本網傳送arp廣播,獲得目標ip所對應的mac位址;如果不在同一子網,就通過arp詢問預設閘道器對應的mac位址。
ARP位址解析過程
arp位址解析過程 1 主機a首先檢視自己的arp表,確定其中是否包含有主機b對應的arp表項。如果找到了對應的mac位址,則主機a直接利用arp表中的mac位址,對ip資料報進行幀封裝,並將資料報傳送給主機b。2 如果主機a在arp表中找不到對應的mac位址,則將快取該資料報文,然後以廣播方式傳送...
判斷兩台計算機IP位址是同一子網路
子網掩碼是用來判斷任意兩台計算機的ip位址是否屬於同一子網路的根據。利用sscanf s函式進行格式化輸入,很方便得到各個數字,下面進行與運算就ok了 include include oj.h 功能 判斷兩台計算機ip位址是同一子網路。原型 int issamesubnetwork char pci...
判斷兩個IP是否屬於同一子網(20200309)
子網掩碼是用來判斷任意兩台計算機的ip位址是否屬於同一子網路的根據。子網掩碼與ip位址結構相同,是32位二進位制數,其中網路號部分全為 1 和主機號部分全為 0 利用子網掩碼可以判斷兩台主機是否中同一子網中。若兩台主機的ip位址分別與它們的子網掩碼相 與 後的結果相同,則說明這兩台主機在同一子網中。...