1. 程式人生 > >【TCP/IP】域名解析過程,ARP的機制,PING的實現

【TCP/IP】域名解析過程,ARP的機制,PING的實現

ARP(Address Resolution Protocol)地址解析協議

ARP協議是網路層傳輸的,在已經知道下一站路由器的IP地址後,要將乙太網包傳送給目的地址,但是乙太網需要的是目的mac地址不是IP地址,而通過ARP請求包就可以獲得目的IP地址的mac地址。

為什麼需要ARP協議呢?

因為在OSI七層模型中,對資料從上到下進行封裝傳送出去,然後對資料從下到上解包接收,但是上層(網路層)關心的IP地址,下層關心的是MAC地址,這個時候就需要對映IP和MAC。

ARP請求的過程:源主機以廣播的形式,傳送一個ARP請求包,所有與源主機在直連的主機都會收到一個請求包,如下圖所示,請求包詢問目的IP地址的mac地址,目的IP地址的主機收到這個請求後,傳送一個ARP應答,告訴源主機自己的mac地址。 (也就是說,ARP必須是在同一區域網下才可以使用)

ARP請求/應答包的資料格式如下圖所示。ARP硬體型別首部中硬體型別表示鏈路層的協議,乙太網為1;協議型別表示網路層協議,IP協議為0x0800:

為了減少ARP的請求次數,在主機和路由中存在一個ARP的快取表,這張表中儲存了最近用到的IP地址與mac地址的對應關係。用arp -a命令可以查詢主機的arp快取表,例如:

 (115.156.142.9) 位於 00:01:2e:4e:eb:ab [ether] 在 enp6s0
 (115.156.142.254) 位於 14:14:4b:7d:4c:bd [ether] 在 enp6s0

也就是說,地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取實體地址的一個TCP/IP協議。主機發送資訊時將包含目標IP地址的ARP請求廣播到網路上的所有主機,並接收返回訊息,以此確定目標的實體地址;收到返回訊息後將該IP地址和實體地址存入本機ARP快取中並保留一定時間,下次請求時直接查詢ARP快取以節約資源。

如何在區域網眾多主機裡獲得目的主機的MAC?

剛開始PC1並不知道PC2的MAC地址,同樣需要傳送ARP請求,但是這個局域網裡主機很多,怎麼唯獨獲取PC2的MAC呢,①我們想到和一群陌生人交流一樣,可以挨著詢問一遍,這就是我們要說的廣播,首先PC1廣播發送詢問資訊(資訊和上一張圖介紹的一樣),在這個普通交換機上連線的裝置都會受到這個PC1傳送的詢問資訊。

接下來②需要做的是,所有在這個交換機上的裝置需要判斷此詢問資訊,如果各自的IP和要詢問的IP不一致,則丟棄,如圖PC3、Route均丟棄該詢問資訊,而對於PC2判斷該詢問資訊發現滿足一致的要求,則接受,同樣的寫入PC1的IP和MAC到自己的ARP對映表中。

最後,③PC2單播發送應答資訊給PC1,告訴PC1自己的IP和MAC地址。

DNS 解析

IP地址用於識別通訊雙方的地址,但它是一串長數字,不方便記憶,人們希望主機有自己自己的名字,這個名字是唯一的,而且容易記住。於是,誕生了“域名”的概念。域名是一種為了識別主機名稱和機構名的具有分層的名稱,比如在域名 seu.edu.cn中,seu是主機名,edu 和 cn 是不同層次下的域名。

域名和 IP 地址都可以唯一對應一臺主機,DNS 協議的作用就是將自身具有意義的域名轉換成不容易記住的 IP 地址。

域名的層次

域名系統的最高層次是根域名,然後是頂級域名,二級域名依次類推。頂級域名一般不會變動,主要都是那麼幾個:表示國家的.cn,.us等,.edu,.com等等。頂級域名下就是二級域名,二級域名是怎麼來的呢?要去指定的機構完成註冊。mail www等都是主機名不能再分。 

域名伺服器 

域名只是一個抽象的概念,域名系統由域名伺服器來維護。上一級域名伺服器中都儲存著下一級域名地址。比如:根域名伺服器中都儲存著所有頂級域名的伺服器地址。而com域名伺服器中又儲存這下面所有二級域名的地址。

DNS查詢

DNS查詢分為兩種方式:遞迴查詢和迭代查詢。遞迴查詢就是下一個伺服器作為DNS客戶幫助查詢,迭代查詢就是域名伺服器返回下一級域名伺服器的IP地址,由本地域名伺服器自己去查詢。從主機到本地域名伺服器往往採用迭代查詢,從本地域名伺服器到其他域名伺服器一般採用迭代的方式。

本地域名伺服器與域名伺服器不是一類東西。本地域名伺服器是提供給一個網路或幾個網路的主機來查詢域名用的,它並沒有維護域名與IP地址的對應關係。本地域名伺服器分佈在各個地方,離主機一般不超過幾個路由。本地域名伺服器中儲存了根域名伺服器的地址,如果需要查詢的域名不在快取記憶體中,就向根域名傳送DNS查詢資料報。 

Ping命令、ICMP

ping命令主要是用來檢查路由是否能夠到達,由於ping命令傳送的資料包非常小,所以在網上傳遞的速度很快,可以快速地檢測你要去的站點是否可以到達。

ping命令的工作原理是:向網路上的另一個主機系統傳送ICMP報文,如果指定系統得到了報文,它將把報文一模一樣地傳回給傳送者,這有點象潛水艇聲納系統中使用的發聲裝置。 

ping命令的使用格式是在命令提示符下鍵入:ping IP地址或主機名,執行結果顯示響應時間。

ping的工作過程:

假定主機A的IP地址是192.168.1.1,主機B的IP地址是192.168.1.2,都在同一子網內,則當你在主機A上執行“Ping 192.168.1.2”後,都發生了些什麼呢?

首先,Ping命令會構建一個固定格式的ICMP請求資料包,然後由ICMP協議將這個資料包連同地址“192.168.1.2”一起交給IP層協議(和ICMP一樣,實際上是一組後臺執行的程序),IP層協議將以地址“192.168.1.2”作為目的地址,本機IP地址作為源地址,加上一些其他的控制資訊,構建一個IP資料包,並在一個對映表中查找出IP地址192.168.1.2所對應的實體地址(MAC地址,這是資料鏈路層協議構建資料鏈路層的傳輸單元——幀所必需的),一併交給資料鏈路層。

後者構建一個數據幀,目的地址是IP層傳過來的實體地址,源地址則是本機的實體地址,還要附加上一些控制資訊,依據乙太網的介質訪問規則,將它們傳送出去。

主機B收到這個資料幀後,先檢查它的目的地址,並和本機的實體地址對比,如符合,則接收;否則丟棄。接收後檢查該資料幀,將IP資料包從幀中提取出來,交給本機的IP層協議。同樣,IP層檢查後,將有用的資訊提取後交給ICMP協議,後者處理後,馬上構建一個ICMP應答包,傳送給主機A,其過程和主機A傳送ICMP請求包到主機B一模一樣。

其中,ping的過程中也是用到了上文講到的ARP實現。ARP具體說來就是將網路層(IP層,也就是相當於OSI的第三層)地址解析為資料連線層(MAC層,也就是相當於OSI的第二層)的MAC地址:

PC1依據OSI模型①依次從上至下對資料進行封裝,包括對ICMP Date加IP包頭的封裝,但是到了封裝MAC地址的時候,②PC1首先查詢自己的ARP快取表,發現沒有IP2和他的MAC地址的對映,這個時候MAC資料幀封裝失敗。我們使用ping命令的時候,是指定PC2的IP2的,計算機是知道目的主機的IP地址,能夠完成網路層的資料封裝,因為裝置通訊還需要對方的MAC地址,但是PC1的快取表裡沒有,所以在MAC封裝的時候填入不了目的MAC地址。

那麼PC1為了獲取PC2的MAC地址,③PC1要傳送詢問資訊,詢問PC2的MAC地址,詢問資訊包括PC1的IP和MAC地址、PC2的IP地址,這裡我們想到一個問題,即使是詢問資訊,也是需要進行MAC資料幀的封裝,那這個詢問資訊的目的MAC地址填什麼呢,規定當目的MAC地址為ff-ff-ff-ff-ff-ff時,就代表這是一個詢問資訊,也即使後面我要說的廣播。

PC2收到這個詢問資訊後,將這裡面的IP1和MAC1(PC1的IP和MAC)新增到本地的ARP快取表中,然後④PC2傳送應答資訊,對資料進行IP和MAC的封裝,傳送給PC1,因為快取表裡已經有PC1的IP和MAC的映射了呢。這個應答資訊包含PC2的IP2和MAC2。PC1收到這個應答資訊,理所應當的就獲取了PC2的MAC地址,並新增到自己的快取表中。

經過這樣互動式的一問一答,PC1和PC2都獲得了對方的MAC地址,值得注意的是,目的主機先完成ARP快取,然後才是源主機完成ARP快取。之後PC1和PC2就可以真正交流了。

TraceRoute

TraceRoute命令利用ICMP 協議定位您的計算機和目標計算機之間的所有路由器。TTL 值可以反映資料包經過的路由器或閘道器的數量,通過操縱獨立ICMP 呼叫報文的TTL 值和觀察該報文被拋棄的返回資訊,traceroute命令能夠遍歷到資料包傳輸路徑上的所有路由器。

通過傳送UDP報文,設定目的埠為一個不可能的值,將IP首部中的TTL分別設定從1到N,每次逐個增加,如果收到埠不可達,說明到達目的主機,如果是因為TTL跳數超過,路由器會發送主機不可達的ICMP報文。