目錄服務器
@網絡
我打算從一個ping命令的抓包結果來結合實際分析鏈路層和網絡層的幾個協議,先看一些無聊卻重要的基礎知識,封裝過程圖鎮樓併發
咱們都知道網絡是分層的,在鏈路層的封裝主要是以太網封裝,這裏咱們直接給出格式tcp
這裏也給出了IEEE 802的封裝,下面的就是以太網封裝,咱們看到以太網的封裝會爲網絡層的其餘協議提供服務,同時也看到ARP/RARP 和IP的地位是並列的。他們根據以太網頭部的類型字段區分,以太網的源地址和目的地址是6字節的硬件地址也就是咱們常說的MAC地址,一個硬件由它來標識。能夠看到除了14個字節的頭部之外,數據段要求最小46個字節,因此會有填充的出現,後面的尾部是4個字節,即以太網數據幀一共最少有64字節(有時候會略去尾部直接是60字節)。測試
咱們雖然從ping命令開始,可是必須介紹一些基礎知識,首先就是ip協議,上圖就是ip協議的頭部,最小是20字節。後面的抓包結果要結合這張圖來看。目前幾乎全部的互聯網傳輸都使用的ip協議。命令行
首先介紹一下這些字段3d
ping程序是測試連通性用的,固然他還有其餘功能,這個下面會說,首先咱們就用它的測試功能,至於ping的原理,咱們邊抓包邊看,這其中會涉及不少網絡層的協議,咱們結合抓包講解。代理
打開wireshark後,開啓命令行的ping命令ping一個ip地址(這裏我ping的是一個網段的地址10.134.220.102,我本機的地址是10.134.220.113),如何使用wireshark和如何查看本身的ip地址請自行百度。這裏ping完成後code
收到這四個回覆,咱們先無論這些,看看咱們抓包抓到了什麼,這裏我加了過濾器:blog
ip.dst == 10.134.220.102 or ip.src == 10.134.220.102 or arp
抓包結果
咱們能夠看看發生了什麼,第一行不是此次ping產生的,從第二行看,首先是ARP協議的數據,內容是後面的看起來是詢問的內容,而後下一行仍是ARP的協議,看起來是回答。咱們注意到第一列是時間,第二列是源地址,6字節的,第三列是目的地址,也是6字節的。這兩個地址就是上面以太網封裝頭部中的那兩個硬件地址。咱們看到有的目的地址是廣播,廣播地址是全1的6字節。這個能夠詳細的看包裏的內容。咱們先無論這些協議是什麼,就是看看發生了啥。接續看,有四組連續的(忽略中間那個ARP)ICMP協議的報文,並且是一問一答形式的,想一想咱們的ping命令的結果,是否是對起來了?
從上面的抓包結果咱們看到了兩個協議,ARP與ICMP,這兩個重要的協議咱們細細講解,同時會結合抓包的內容一塊看。
ARP是什麼?ARP是一種地址解析協議。
ARP幹嗎用的?當咱們知道目的ip地址後,咱們覺得計算機知道了應該找哪臺主機,可是計算機硬件一臉懵,在他那裏只有硬件地址,ip地址是網路層的東西,要數據傳輸必須知道鏈路層的信息即硬件的地址,那麼如何根據ip地址知道目的地址的硬件地址呢?答案就是使用ARP協議來查詢,將ip地址轉化爲硬件地址。還有一種協議是RARP,他跟ARP反着,根據硬件地址查詢ip地址,這種協議是無盤系統沒法從本地知曉本身的ip地址,只能經過RARP協議從RARP服務器上查詢本身的ip地址。因爲我這裏沒有無盤機,因此抓包抓不到RARP協議的包,有須要的能夠查資料詳細理解。他們倆的報文格式仍是很像的。
ARP如何工做的?
ARP分爲請求和應答,他的報文格式以下
還記得看以太網封裝時說過的,ARP是跟IP並列的。這裏詳細介紹ARP的報文格式
對於以太網頭部中的目的地址,在ARP請求報文中,是沒法知道的(由於自己就是去查詢的),那麼如何填呢?或者說ARP如何起做用呢?固然是把全部的主機全問一遍唄。因此這裏就填成全1表示廣播地址,這樣整個以太網上的全部主機都能收到ARP請求,而後看看是否是本身被翻了牌子,若是是,就發回一個ARP應答告知本身的硬件地址。整個過程能夠參考下圖
這是在同一個以太網的狀況下。若是不在同一個以太網下,又如何呢?若是ARP請求是從一個網絡的主機發往另外一個網絡上的主機,那麼鏈接這兩個網絡的路由器就能夠回答該請求,這個過程稱做委託A R P或A R P代理(Proxy ARP)。這樣能夠欺騙發起ARP請求的發送端,使它誤覺得路由器就是目的主機,而事實上目的主機是在路由器的「另外一邊」。路由器的功能至關於目的主機的代理,把分組從其餘主機轉發給它。這方面這篇文章裏暫時沒有,後續會有一個專門的文章介紹。
若是目的主機不存在呢?那就隔一段時間問一次,多問幾回都沒答覆就不問了,哈哈哈。
好,接下來回到抓包結果,咱們說開頭的是兩個ARP協議,瞭解了原理後咱們知道他們其實就是一個ARP請求和ARP應答
這是個人ARP請求報文
逐字節解析,前6字節就是全1的廣播以太網地址,而後是6字節的發送端以太網地址。而後0806表明是ARP協議。0001表明的以太網,0800表明ip協議,06的硬件地址長度,04的協議地址長度,0001的op字段表明ARP請求,而後就是發送端的硬件地址和ip地址,而後就是咱們前面說的全0的目的硬件地址,而後是目的ip。
一樣的應答報文就不解析了,就是對着格式來。
ICMP是什麼? ICMP是Internet控制報文協議,對,就是控制報文協議,發送控制報文的,啥叫控制報文?看下去就知道了。必須知道ICMP是封裝在IP數據報裏面的。在IP頭部的8位協議字段中規定的,1就表明ICMP。
ICMP幹嗎用的? 頗有用,用途普遍,哈哈哈。
ICMP如何用?
看格式
8位的類型,8位的代碼都在上面那張很長的圖中。因爲太多,就不介紹詳細的了,就介紹咱們ping命令用到的即ICMP回顯應答報文。
U n i x系統在實現p i n g程序時是把I C M P報文中的標識符字段置成發送進程的I D號。這樣即便在同一臺主機上同時運行了多個p i n g程序實例, p i n g程序也能夠識別出返回的信息。序列號從0開始,每發送一次新的回顯請求就加1。p i n g程序打印出返回的每一個分組的序列號,容許咱們查看是否有分組丟失、失序或重複。I P是一種最好的數據報傳遞服務,所以這三個條件都有可能發生。
以我本機發送的ICMP回顯請求報文爲例:
前面的14個字節以太網首部就不解析了,如今從第一行的45開始
回顧ip首部,4表明ipv4 , 5表明ip首部佔5個四字節即20字節,說明沒有選項字段。後面兩個00表明的TOS字段,你們到網上一查,不對啊,00表明不少服務啊,怎麼區分啊?其實如今大多數實現都不實用TOS段了,因此就不用管這個字段了。
進入第二行,003c是總長度,整個ip數據報有60個字節,說明數據部分有40個字節,咱們數一下,整個報文74個字節,除去14字節以太網首部,20字節的ip首部,剩下的40字節就是數據部分(沒有計算以太網尾部)。
4347是標識,0000是偏移量,這個沒啥好說的。80是TTL生存時間,01是表明的ICMP報文。2996是校驗和。而後是源ip地址0a 86 dc 71, 是否是就是10.134.220.113 。目的地址是0a 86 dc 66 。後面我選中的藍色部分就是真正的ICMP回顯請求報文的內容了, 08 00 與咱們說的代碼是同樣的,0101校驗和,後面的就不說了。
這篇文章從一個ping命令入手,講述了兩個很重要的協議ARP協議和ICMP協議,結合實際抓包的結果,分析了報文內容,可是這裏仍是有疑問,好比,咱們說以太網幀除去尾部最少60字節,可是實際抓包時有的就只有42字節(好比個人ARP請求那裏),沒有進行填充,這部分疑問尚未獲得解決嗎,但願有人能夠指導一下。