Android網路編程系列 一 TCP/IP協議族之網際層

來源:互聯網
上載者:User

標籤:

這篇借鑒的文章主要是用於後續文章知識點的擴散,在此特作備份和擴散學習交流。

    網際層包括:IP、ICMP、IGMP 以及處在網際層實際工作在鏈路層的 ARP 和 RARP等等協議。

1.IP協議

    互連網上的每個介面必須有一個唯一的Internet地址(也稱作IP地址)。IP地址長32 bit。IP協議是TCP/IP協議的核心,所有的TCP,UDP,ICMP,IGMP的資料都以IP資料格式傳輸。要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種資料未傳達以後的處理機制--這被認為是上層協議--TCP或UDP要做的事情。所以這也就出現了TCP是一個可靠的協議,而UDP就沒有那麼可靠的區別。Internet地址並不採用平面形式的地址空間,如1、2、3等。IP地址具有一定的結構,五類不同的互連網地址格式如下:

                                                                                                              

 

1.1.IP協議頭

    挨個解釋它是教科書的活計,我感興趣的只是那八位的TTL欄位,還記得這個欄位是做什麼的嗎?這個欄位規定該資料包在穿過多少個路由之後才會被拋棄(這裡就體現出來IP協議包的不可靠性,它不保證資料被送達),某個ip資料包每穿過一個路由器,該資料包的TTL數值就會減少1,當該資料包的TTL成為零,它就會被自動拋棄。這個欄位的最大值也就是255,也就是說一個協議包也就在路由器裡面穿行255次就會被拋棄了,根據系統的不同,這個數字也不一樣,一般是32或者是64,Tracerouter這個工具就是用這個原理工作的,tranceroute的-m選項要求最大值是255,也就是因為這個TTL在IP協議裡面只有8bit。

現在的ip版本號碼是4,所以也稱作IPv4。現在還有IPv6,而且運用也越來越廣泛了。

1.2.IP路由選擇

    當一個IP資料包準備好了的時候,IP資料包(或者說是路由器)是如何將資料包送到目的地的呢?它是怎麼選擇一個合適的路徑來"送貨"的呢?

最特殊的情況是目的主機和主機直連,那麼主機根本不用尋找路由,直接把資料傳遞過去就可以了。至於是怎麼直接傳遞的,這就要靠ARP協議了,後面會講到。

稍微一般一點的情況是,主機通過若干個路由器(router)和目的主機串連。那麼路由器就要通過ip包的資訊來為ip包尋找到一個合適的目標來進行傳遞,比如合適的主機,或者合適的路由。路由器或者主機將會用如下的方式來處理某一個IP資料包

  1. 如果IP資料包的TTL(生命週期)以到,則該IP資料包就被拋棄。
  2. 搜尋路由表,優先搜尋匹配主機,如果能找到和IP地址完全一致的目標主機,則將該包發向目標主機
  3. 搜尋路由表,如果匹配主機失敗,則匹配同子網的路由器,這需要“子網路遮罩(1.3.)”的協助。如果找到路由器,則將該包發向路由器。
  4. 搜尋路由表,如果匹配同子網路由器失敗,則匹配同網號(第一章有講解)路由器,如果找到路由器,則將該包發向路由器。
  5. 搜尋陸遊表,如果以上都失敗了,就搜尋預設路由,如果預設路由存在,則發包
  6. 如果都失敗了,就丟掉這個包。

這再一次證明了,ip包是不可靠的。因為它不保證送達。

1.3.子網定址

    IP地址的定義是網路號+主機號。但是現在所有的主機都要求子網編址,也就是說,把主機號在細分成子網號+主機號。最終一個IP地址就成為 網路編號+子網號+主機號。例如一個B類地址:210.30.109.134。一般情況下,這個IP地址的紅色部分就是網路號,而藍色部分就是子網號,綠色部分就是主機號。至於有多少位代表子網號這個問題上,這沒有一個硬性的規定,取而代之的則是子網路遮罩,校園網相信大多數人都用過,在校園網的設定裡面有一個255.255.255.0的東西,這就是子網路遮罩。子網路遮罩是由32bit的位元字序列,形式為是一連串的1和一連串的0,例如:255.255.255.0(二進位就是11111111.11111111.11111111.00000000)對於剛才的那個B類地址,因為210.30是網路號,那麼後面的109.134就是子網號和主機號的組合,又因為子網路遮罩只有後八bit為0,所以主機號就是IP地址的後八個bit,就是134,而剩下的就是子網號碼--109。

2. ARP協議

    還記得資料連結層的乙太網路的協議中,每一個資料包都有一個MAC地址頭嗎?我們知道每一塊乙太網路卡都有一個MAC地址,這個地址是唯一的,那麼IP包是如何知道這個MAC地址的?這就是ARP協議的工作。

ARP(位址解析)協議是一種解析協議,本來主機是完全不知道這個IP對應的是哪個主機的哪個介面,當主機要發送一個IP包的時候,會首先查一下自己的ARP快取(就是一個IP-MAC地址對應表緩衝),如果查詢的IP-MAC值對不存在,那麼主機就向網路發送一個ARP協議廣播包,這個廣播包裡面就有待查詢的IP地址,而直接收到這份廣播的包的所有主機都會查詢自己的IP地址,如果收到廣播包的某一個主機發現自己符合條件,那麼就準備好一個包含自己的MAC地址的ARP包傳送給發送ARP廣播的主機,而廣播主機拿到ARP包後會更新自己的ARP緩衝(就是存放IP-MAC對應表的地方)。發送廣播的主機就會用新的ARP快取資料準備好資料連結層的的資料包發送工作。

一個典型的arp緩衝資訊如下,在任意一個系統裡面用“arp -a”命令:

1234 Interface: 192.168.11.3 --- 0x2  Internet Address      Physical Address      Type  192.168.11.1          00-0d-0b-43-a0-2f     dynamic  192.168.11.2          00-01-4a-03-5b-ea     dynamic

都會得到這樣的結果。這樣的快取是有時限的,一般是20分鐘(伯克利系統的衍生系統)。

 

3.ICMP協議

    前面講到了,IP協議並不是一個可靠的協議,它不保證資料被送達,那麼,自然的,保證資料送達的工作應該由其他的模組來完成。其中一個重要的模組就是ICMP(網路控制報文)協議。

當傳送IP資料包發生錯誤--比如主機不可達,路由不可達等等,ICMP協議將會把錯誤資訊封包,然後傳送回給主機。給主機一個處理錯誤的機會,這 也就是為什麼說建立在IP層以上的協議是可能做到安全的原因。ICMP資料包由8bit的錯誤類型和8bit的代碼和16bit的校正和組成。而前 16bit就組成了ICMP所要傳遞的資訊。書上的圖6-3清楚的給出了錯誤類型和代碼的組合代表的意思。

儘管在大多數情況下,錯誤的包傳送應該給出ICMP報文,但是在特殊情況下,是不產生ICMP錯誤判文的。如下

  1. ICMP差錯報文不會產生ICMP差錯報文(出IMCP查詢報文)(防止IMCP的無限產生和傳送)
  2. 目的地址是廣播位址或多播地址的IP資料報。
  3. 作為鏈路層廣播的資料報。
  4. 不是IP分區的第一片。
  5. 源地址不是單個主機的資料報。這就是說,源地址不能為零地址、迴路位址、廣播地 址或多播地址。

雖然裡面的一些規定現在還不是很明白,但是所有的這一切規定,都是為了防止產生ICMP報文的無限傳播而定義的。

ICMP協議大致分為兩類,一種是查詢報文,一種是差錯報文。其中查詢報文有以下幾種用途:

  1. ping查詢(不要告訴我你不知道ping程式)
  2. 子網路遮罩查詢(用於無盤工作站在初始化自身的時候初始化子網路遮罩)
  3. 時間戳記查詢(可以用來同步時間)

而差錯報文則產生在資料傳送發生錯誤的時候。就不贅述了。

3.1 ICMP的應用--ping

    ping可以說是ICMP的最著名的應用,當我們某一個網站上不去的時候。通常會ping一下這個網站。ping會回顯出一些有用的資訊。一般的資訊如下:

 

123456789 Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Reply from 10.4.24.1: bytes=32 time<1ms TTL=255Reply from 10.4.24.1: bytes=32 time<1ms TTL=255 Ping statistics for 10.4.24.1:    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ping這個單詞源自聲納定位,而這個程式的作用也確實如此,它利用ICMP協議包來偵測另一個主機是否可達。原理是用類型碼為0的ICMP發請 求,受到請求的主機則用類型碼為8的ICMP回應。ping程式來計算間隔時間,並計算有多少個包被送達。使用者就可以判斷網路大致的情況。我們可以看到, ping給出來了傳送的時間和TTL的資料。我給的例子不太好,因為走的路由少,有興趣地可以ping一下國外的網站比如sf.net,就可以觀察到一些 丟包的現象,而程式啟動並執行時間也會更加的長。
ping還給我們一個看主機到目的主機的路由的機會。這是因為,ICMP的ping請求資料報在每經過一個路由器的時候,路由器都會把自己的ip放到該數 據報中。而目的主機則會把這個ip列表複製到回應icmp資料包中發回給主機。但是,無論如何,ip頭所能紀錄的路由列表是非常的有限。如果要觀察路由, 我們還是需要使用更好的工具,就是要講到的Traceroute(windows下面的名字叫做tracert)。

3.2 ICMP的應用--Traceroute

    Traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。前面說到,儘管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器。所以Traceroute正好就填補了這個缺憾。

Traceroute的原理是非常非常的有意思,它受到目的主機的IP後,首先給目的主機發送一個TTL=1(還記得TTL是什麼嗎?)的UDP(後面就 知道UDP是什麼了)資料包,而經過的第一個路由器收到這個資料包以後,就自動把TTL減1,而TTL變為0以後,路由器就把這個包給拋棄了,並同時產生 一個主機不可達的ICMP資料報給主機。主機收到這個資料報以後再發一個TTL=2的UDP資料報給目的主機,然後刺激第二個路由器給主機發ICMP資料 報。如此往複直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由IP的問題。

有人要問,我怎麼知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCP和UDP協議有一個連接埠號碼定義,而普通的網路程式只監控少數的幾個號碼較 小的連接埠,比如說80,比如說23,等等。而traceroute發送的是連接埠號碼>30000(真變態)的UDP報,所以到達目的主機的時候,目的 主機只能發送一個連接埠不可達的ICMP資料報給主機。主機接到這個報告以後就知道,主機到了,所以,說Traceroute是一個騙子一點也不為過:)

Traceroute程式裡面提供了一些很有用的選項,甚至包含了IP選路的選項,請察看man文檔來瞭解這些,這裡就不贅述了。

4 IGMP(略)5 RARP(略)

Android網路編程系列 一 TCP/IP協議族之網際層

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.