天天看點

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

本節書摘來自異步社群《wireshark資料包分析實戰(第2版)》一書中的第6章6.2節網際網路協定,作者【美】chris sanders,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

6.2 網際網路協定

位于osi模型中第3層的協定的主要目的就是使得網絡間能夠互聯通信。正如你所知道的,mac位址被用來在第2層處理單一網絡中的通信。與其類似,第3層則負責跨網絡通信的位址。在這層上工作的不止一個協定,但最普遍的還是網際網路協定(ip)。在此,我們将介紹在rfc 791中所定義的ip協定版本4(ipv4)。

如果網絡中的所有裝置僅使用集線器或者交換機進行連接配接,那麼這個網絡稱為區域網路。如果你想将兩個區域網路連接配接起來,你可以使用路由器辦到這一點。在複雜的網絡中,可能會包含成千上萬的區域網路,而這些區域網路是由世界各地成千上萬的路由器連接配接起來的。網際網路本身就是由無數區域網路和路由器所組成的一個集合。

6.2.1 ip位址

ip位址是一個32位的位址,用來唯一辨別連接配接到網絡的裝置。由于讓人記住一串32位長的01字元确實比較困難,是以ip位址采用點分四組的表示法。

在點分四組表示法中,以a.b.c.d的形式,構成ip位址的四組1和0分别轉換為十進制0到255之間的數(如圖6-7所示)。我們拿這樣一個ip位址11000000 10101000 00000000 00000001舉例來說,這個值顯然不容易記憶或者表示,但如果采用點分四組的表示法,我們就可以将其表示為192.168.0.1。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

ip位址之是以會被分成4個單獨的部分,是因為每個ip位址都包含着兩個部分:網絡位址和主機位址。網絡位址用來辨別裝置所連接配接到的區域網路,而主機位址則辨別這個網絡中的裝置本身。用來決定究竟ip位址哪部分屬于網絡或者主機的劃分通常并不唯一。這實際上是由另一組名為網絡掩碼(netmask, network mask)的位址資訊所決定的,有時它也會被稱為子網路遮罩(subnet mask)。

網絡掩碼用來辨別ip位址中究竟哪一部分屬于網絡位址而哪一部分屬于主機位址。網絡掩碼也是32位長,并且被設為1的每一位都辨別着ip位址的對應部分是屬于網絡位址的,而剩下設為0的部分則辨別着主機位址。

我們以ip位址10.10.1.22為例,其二進制形式為00001010 00001010 00000001 00010110。為了能夠區分出ip位址的每一個部分,我們将使用網絡掩碼。在這個例子中,我們的網絡掩碼是11111111 11111111 00000000 00000000。這意味着ip位址的前一半(10.10或者00001010 00001010)是網絡位址,而後一半(1.22或者00000001 00010110)辨別着這個網絡上的主機,如圖6-8所示。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

網絡掩碼也可以寫成點分四組的形式。比如網絡掩碼11111111 11111111 00000000 00000000可以被寫成255.255.0.0。

ip位址和網絡掩碼為簡便起見,通常會被寫成無類型域間選路(classless inter-domain routing, cidr)的形式。在這個形式下,一個完整的ip位址後面會有一個左斜杠(/),以及一個用來表示ip位址中網絡部分位數的數字。舉例來說,ip位址10.10.1.22和網絡掩碼255.255.0.0,在cidr表示法下就會被寫成10.10.1.22/16的形式。

6.2.2 ipv4頭

源ip位址和目的ip位址都是ipv4資料標頭中的重要組成部分,但它們并不是你在資料包中能夠找到的ip資訊的全部。ip頭比起我們剛剛介紹過的arp資料包複雜得多。這其中包含很多額外的資訊,以便ip完成其工作。

如圖6-9所示,ipv4頭有着下列幾個域。

版本号(version):ip所使用的版本。

首部長度(header length):ip頭的長度。

服務類型(type of service):優先級标志位和服務類型标志位,被路由器用來進行流量的優先排序。

總長度(total length):ip頭與資料包中資料的長度。

辨別符(identification):一個唯一的辨別數字,用來識别一個資料包或者被分片資料包的次序。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

标記(flags):用來标記一個資料包是否是一組分片資料包的一部分。

分片偏移(fragment offset):一個資料包是一個分片,這個域中的值就會被用來将資料包以正确的順序重新組裝。

存活時間(time to live):用來定義資料包的生存周期,以經過路由器的跳數/秒數進行描述。

協定(protocol):用來識别在資料包序列中上層協定資料包的類型。

首部校驗和(header checksum):一個錯誤檢測機制,用來确認ip頭的内容沒有被損壞或者篡改。

源ip位址(source ip address):發出資料包的主機的ip位址。

目的ip位址(destination ip address):資料包目的地的ip位址。

選項(options):保留作額外的ip選項。它包含着源站選路和時間戳的一些選項。

資料(data):使用ip傳遞的實際資料。

6.2.3 存活時間

存活時間(ttl)值定義了在該資料包被丢棄之前,所能經曆的時間,或者能夠經過的最大路由數目。ttl在資料包被建立時就會被定義,而且通常在每次被發往一個路由器的時候減1。舉例來說,如果一個資料包的存活時間是2,那麼當它到達第一個路由器的時候,其ttl會被減為1,并會被發向第二個路由。這個路由接着會将ttl減為0,這時如果這個資料包的最終目的地不在這個網絡中,那麼這個資料包就會被丢棄,如圖6-10所示。由于ttl的值在技術上還是基于時間的,一個非常繁忙的路由器可能會将ttl的值減去不止1,但通常情況下,我們還是可以認為一個路由裝置在多數情況下隻會将ttl的值減去1。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

為什麼ttl的值會這樣重要?我們通常所關心的一個資料包的生存周期,隻是其從源前往目的地所花去的時間。但是考慮到一個資料包想要通過網際網路發往一台主機需要經過數十個路由器。在這個資料包的路徑上,它可能會碰到被錯誤配置的路由器,而失去其到達最終目的地的路徑。在這種情況下,這個路由器可能會做很多事情,其中一件就是将資料包發向一個網絡,而産生一個死循環。

如果你有任何程式設計背景,那麼你就會知道死循環會導緻各種問題,一般來說會導緻一個程式或者整個作業系統的崩潰。理論上,同樣的事情也會以資料包的形式發生在網絡上。資料包可能會在路由器之間持續循環。随着循環資料包的增多,網絡中可用的帶寬就會減少,直至拒絕服務(dos)的情況出現。ip頭中的ttl域就為了防止出現這個潛在的問題。

讓我們看一下wireshark中的示例。檔案ip_ttl_source.pcap包含着兩個icmp資料包。icmp(我們會在這章之後介紹到)利用ip傳遞資料包,我們可以通過在packet details面闆中展開ip頭區段看到。

你可以看到ip的版本号為4圖示1,ip頭的長度是20位元組圖示2,首部和載荷的總長度是60位元組圖示3并且ttl域的值是128圖示4。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

icmp ping的主要目的就是測試裝置之間的通信。資料從一台主機發往另一台作為請求,而後接收主機會将那個資料發回作為響應。這個檔案中,我們一台ip位址為10.10.0.3圖示5的裝置将一個icmp請求發向了位址為192.168.0.128圖示6的裝置。這個原始的捕獲檔案是在源主機10.10.0.3上被建立的。

現在打開檔案ip_ttl_dest.pcap。在這個檔案中,資料在目的主機192.168.0.128處被捕獲。展開這個捕獲中第一個資料包的ip頭,來檢查它的ttl值(如圖6-12所示)。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

你可以立刻注意到ttl的值變為127了,比原先的ttl減少了1。即使不知道網絡的結構,我們也可以知道這兩台裝置是由一台路由器隔開,并且經過這台路由器的路徑會将ttl值減1。

6.2.4 ip分片

資料包分片是将一個資料流分為更小的片段,是ip用于解決跨越不同類型網絡時可靠傳輸的一個特性。

一個資料包的分片主要基于第2層資料鍊路協定所使用的最大傳輸單元(maximum transmission unit, mtu)的大小,以及使用這些第2層協定的裝置配置情況。在多數情況下,第2層所使用的資料鍊路協定是以太網。以太網的預設mtu是1500,也就是說,以太網的網絡上所能傳輸的最大資料包大小是1500位元組(并不包括14位元組的以太網頭本身)。

注意

 盡管存在着标準的mtu設定,但是一個裝置的mtu通常可以手工設定。mtu是基于接口進行設定,其可以在windows或者linux系統上修改,或者在管理路由器的界面上修改。

當一個裝置準備傳輸一個ip資料包時,它将會比較這個資料包的大小,以及将要把這個資料包傳送出去的網絡接口mtu,用于決定是否需要将這個資料包分片。如果資料包的大小大于mtu,那麼這個資料包就會被分片。将一個資料包分片包括下列的步驟。

1.裝置将資料分為若幹個可成功進行傳輸的資料包。

2.每個ip頭的總長度域會被設定為每個分片的片段長度。

3. 更多分片标志将會在資料流的所有資料包中設定為1,除了最後一個資料包。

4.ip頭中分片部分的分片偏移将會被設定。

5.資料包被發送出去。

檔案ip_frag_source.pcap從位址為10.10.0.3的計算機上捕獲而來。它向一個位址為192.168.0.128的裝置發送ping請求。注意在icmp(ping)請求之後,packet list面闆的info列中列出了兩個被分段的ip資料包。

先檢查資料包1的ip頭(如圖6-13所示)。

根據更多分片和分片偏移域,你可以斷定這個資料包是分片資料包的一部分。被分片的資料包要麼有一個大于0的分片偏移,要麼設定了更多分片的标志位。在第一個資料包中,更多分片标志位被設定圖示1,意味着接收裝置應該等待接收序列中的另一個資料包。分片偏移被設為0圖示2,意味着這個資料包是這一系列分片中的第一個。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

第二個資料包的ip頭(如圖6-14所示),同樣被設定了更多分片的标志位,但在這裡分片偏移的值是1480。這裡明顯意味着1500位元組的mtu,減去ip頭的20位元組。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

第三個資料包(如圖6-15所示),并沒有設定更多分片标志位圖示1,也就标志着整個資料流中的最後一個分片。并且其分片偏移被設定為2960圖示2,也就是1480+(1500-20)的結果。這些分片可以被認為是同一個資料序列的一部分,是因為它們ip頭中的标志位域擁有相同的值。

《Wireshark資料包分析實戰(第2版)》—第6章6.2節網際網路協定

繼續閱讀