計算機網絡協議第三章,網絡層協議

網際協議(IP)

協議介紹

     IP (Internet Protocol)協議是TCP/IP最核心的協議,它承載着TCP,UPD,ICMP,IGMP等協議的數據傳輸功能,計算機網絡路由機制的核心協議。

     RFC 791定義IP首部格式如下圖:
IP頭部
4位版本:值位4表示IPV4,現在還有IPV6。
4位首部長度:單位DWORD(4字節),最大首部長度爲60(15*4)字節。
                       IP最小首部長度爲20字節,因此IP首部選項最多40字節。
8位服務類型:不常用,參見RFC 1349對其對說明。
16位總長度: 單位Byte(字節),包括IP首部長度和IP數據長度,最大長度65535。
16位標識:是每個IP數據包的唯一標識,對於需要分片的IP報文,每個分片的標識是一致的。
3位標記: 第一位未使用。
                 第二位DF(不允許分片),路徑MTU發現機制使用IP這一特性。
                 第三位MF (是否有更多分片),IP報文分片時,除最後一個分片不設置該標記,其他分片設置該標記爲1。
13位偏移:是指當前分片在整個IP報文中的位置,比如0表示是第一個IP分片。
8位生存時間:每經過一個路由器減1,防止廣播風暴,目前常用64。
8位協議:區分上層協議,比如ICMP,IGMP,TCP,UDP。
16位首部校驗和:交換IP首部數據是否正確。
32位源IP地址: 源端IP地址。
32位目的IP地址:目的端IP地址。
選項:不常用。可選擇如下項。
           安全和處理限制、記錄路徑、時間戳、寬鬆的源站路由、嚴格的源站路由。

IP地址爲我們所熟知,通常使用點分十進制表示,譬如我的主機IP地址爲(192.168.1.104),一個看似簡單的數字卻包含了不少學問。
1)IP地址可以按照網絡類型進行劃分,還可以在網絡號上進行子網劃分。
2)IP是路由的基礎,路由機制又涉及更多機制,ARP, 路由表,ICMP重定向,動態選路等等。
3)有了IP協議和路由機制,可以讓主機互相進行通訊,發展後來出現安全隱患,人們開始建立安全意識,就有了防火牆、NAT、DMZ等等安全措施,
這些衍生功能都建立在IP協議的基礎之上。隨着這些衍生功能又發展了更多的應用層協議DNS、DDNS、UPNP、DHCP等等。

可以說IP協議是網絡的核心,本章只是初識IP協議,更多IP協議的詳細分析會在後面的章節陸續進行闡述。

ICMP協議

協議介紹

   ICMP(Internet Control Message Protocol)Internet控制報文協議。 基於IP協議,提供網絡控制的服務,TCP、UDP等都會使用該協議控制報文進行對應處理。ICMP協議又服務於IP協議,比如網絡重定向、需要進行分片導致傳輸失敗、子網掩碼獲取等等。因此ICMP協議定位爲網絡層協議是比較合適的。經典的ping,traceroute命令就是基於ICMP協議進行開發的客戶端。

   RFC 792定義ICMP首部格式如下圖:
ICMP頭部
8位類型:描述不同的ICMP控制。
8爲代碼:相同類型的ICMP分爲不同的代號。
16爲校驗和: 檢測整個ICMP報文的數據一致性。
數據部分:根據不同類型,數據部分長度不同。


下圖列舉ICMP的類型和代碼。
ICMP類型代碼

應用

ping

ping命令主要用途是用於測試目的主機是否可達到,ping的請求ICMP類型0,代碼0,迴應類型8,代碼0。大多數情況下可以使用ping命令檢測對方主機是否可達到,爲什麼說是大多數,出於安全性的目的,會禁止對ping的請求進行應答,防止主機IP地址暴露。
ping命令還可以用於測試達到對方主機的往返時間,用於驗證網絡情況好壞。
ping命令可以使用IP記錄路徑選項的功能,獲得達到對方主機所經過路由器的IP地址。ping命令也可以使用IP時間戳選項的功能記錄路徑路由器的時間戳。

如果網絡不可達到、主機不可達到、端口不可達到會使用ICMP協議返回一個差錯報文,這個是上層協議經常使用到的ICMP報文。

traceroute

traceroute命令主要用途是跟蹤達到目的主機經過的路由選擇。實際上ping利用IP記錄路徑也可以實現相同工作,爲什麼traceroute還需要支持該功能?
原因在於IP記錄路徑有兩點限制,一是有些路由器可以不實現該功能,二是記錄IP路由地址存放在IP首部,IP首部只有40個字節可供使用,去掉4個字節的記錄路徑選項,最多可以記錄9個IP地址。

traceroute跟蹤達到目的主機的原理是這樣的,通過設置IP頭部的TTL字段,依次設置TTL值爲1,2。。。,由於路由器檢測到TTL值爲1時就會產生一個ICMP報文,類型11,意爲超時,如此就能夠通過ICMP報文的源地址獲得路由器的地址,因此可以依次獲取到第一跳,第二跳。。。的路由地址,但是應該如果判斷目的地址已經達到目的主機了呢?traceroute還需要發送一個UDP報文,端口是一個隨機的較大值,假設目的主機沒有利用該端口,會回覆一個ICMP報文,類型3,代碼3,意爲端口不可達到。如此可以通過ICMP端口不可達到的報文獲得對方的IP地址,如果IP地址和目的地址一致,則表示尋路結束。

traceroute命令還可以用於發現路徑MTU,上一講提到過路徑MTU概念,路徑MTU同樣重要,如果中間路由器不主動進行IP分片,它可能影響到報文是否能夠送達,就算中間路由器進行IP分片,不影響包的達到,那還是會影響到傳輸效率。

traceroute發現路徑MTU的原理是這樣的,通過設置IP頭部標記DF(不允許分片),發送源端MTU大小的報文,如果中間路由有MTU小於該值,並且判斷出DF標記,會向源主機發送一條ICMP報文,類型3,代碼4,意爲不分片無法通過。並且有些路由器會返回它的MTU值,如此源端獲得這條iCMP報文後會使用返回的MTU大小進行再次嘗試,直到不再產生由於不分片無法通過的ICMP報文。


廣播與多播

      有時我們需要向同一網絡的所有主機發送報文,這就是廣播,上一講的ARP,RARP的請求就是廣播。但是也有這樣的需求,向網絡的一部分主機發送報文,就不適合使用廣播,因爲使用廣播的話,那些並不關心該廣播報文的主機卻要處理報文,實在是浪費,因此可以使用多播。

廣播

廣播主要分爲下面四種IP地址類型,我們依次進行介紹。
1)受限的廣播
受限的廣播地址爲255.255.255.255。該地址用於主機啓動過程,此時主機還不知道自己的IP和網絡掩碼。理論上路由器收到該類型的廣播後,不在進行廣播,使它只出現本地網絡內。
2)指向網絡的廣播
指向網絡的廣播地址主機號全爲1。比如A類網絡的廣播是 *.255.255.255。C類網絡則是*.*.*.255。
3)指向子網的廣播
假設B類網絡是128.1.0.0,劃分一個子網爲128.1.1.0,子網掩碼就是255.255.255.0。如此改子網的廣播地址就是128.1.1.255。
4)指向所有子網的廣播
還是上面的那個例子,如果劃分了子網128.1.1.0,子網掩碼是255.255.255.255,那麼指向子網的廣播地址,子網號和主機號全爲1,因此128.1.255.255就是所有子網的廣播地址。

例子:
我的主機號192.168.1.104,網絡號192.168.1.0,網絡掩碼是255.255.255.0。是一個局域網,沒有劃分子網,因此可以使用192.168.1.255進行局域網內廣播。
ping 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.104: icmp_seq=0 ttl=64 time=0.061 ms
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=27.772 ms
64 bytes from 192.168.1.100: icmp_seq=0 ttl=64 time=263.093 ms
64 bytes from 192.168.1.104: icmp_seq=2 ttl=64 time=0.167 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=4.617 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=97.854 ms
^C
--- 192.168.1.255 ping statistics ---
2 packets transmitted, 2 packets received, +4duplicates, 0.0% packet loss
發現除了自己有回覆外,路由器1.1,另一臺主機1.100都對其進行回覆。

應用案例:
我們公司有一個實際使用廣播的案例,我們公司的產品型號有很多種,提供客戶一全套的解決方案,假設產品都在同一個局域網內,如何獲取到局域網內我公司的產品和產品類型呢?這就是一個比較適合使用廣播的應用場景,開發了一個XXXSearch的客戶端,向局域網內發送廣播報文,有對應報文格式,公司的每種產品都必須接收廣播報文並且進行處理,返回自己的型號等等信息。


多播

IP地址分爲(A,B,C,D,E)五類,多播屬於D類IP地址。D類地址的劃分是最高字節的前4個bit是1110,多播組ID爲28位,如下圖。
多播

根據D類IP地址規則,多播組的地址範圍是224.0.0.0 - 239.255.255.255。
一些多播組地址被IANA確定爲知名地址,被當做永久主機組。例如224.0.0.1代表“該子網內的所有系統組”,224.0.0.2代表“該子網內的所有路由器”,224.0.1.1用於網絡時間協議NTP。

多播理論上可以劃分2的28次方個多播組,每個多播組可以讓主機自由的加入和退出,這就涉及到後續的IGMP協議。
多播實際上是對廣播的一種補充,形成一個主機組,如果主機組內的主機相互通信就可以使用多播進行,而不至於影響其他不在多播組內的其他主機的性能。多播還可以在使兩個不同網絡的主機加入到一個多播組,實現不同網絡上主機的交互。


應用案例:
我們公司一個實際的多播多播案例,在同一個局域網內,有N個視頻源(實時視頻流),有M個客戶端(用戶),當有M個客戶端同時播放同一個視頻源時,最差的實現方式是發出M路視頻流,其次的方案是可以利用服務器,負載均衡的分發出視頻源,更好的方案可以利用客戶端P2P互相傳輸(互聯網時經常使用),我們提供一套方案就是將M個客戶端和這個視頻源加入一個多播組,然後由視頻源發送多播報文,M個用戶能夠同時收到該視頻源的實時流(局域網內很有效),可以很好的減少局域網內的網絡流量。

IGMP協議

協議介紹

IGMP (Internet Group Management Protocol) Internet組管理協議,基於IP協議,用於管理主機的多播組。

RFC 1112定義IGMP協議首部格式如下圖:

IGMP首部
4位版本:目前該值爲1。
4位類型: 1爲查詢報文,2爲報告報文。
16校驗和:校驗IGMP數據一致性。
32組地址:多播組地址。

主機如何加入和退出多播組:
1)當第一個進程加入組時,主機就發送一個IGMP報告。如果有多個進程加入同一個組,只需發送一次即可,路由器只關心是否有主機加入了多播組。
2)進程離開時無需發送任何報文,如果所有進程都離開,那麼路由器發送組查詢報文時,不對其進行報告即可。
3)多播路由器定時發送IGMP查詢來了解是否還有主機還屬於多播組。多播路由器必須對每個接口都進行查詢,查詢報文的組地址被設置爲0,表示查詢主機所有的多播組。
4)主機通過發送報告相應多播路由器的查詢請求,對至少有一個進程加入的多播組均要報告。

多播路由對每個接口保存一直記錄表,記錄是否還存在一個主機屬於該多播組,如果存在,收到多播報文時就通過該接口轉發多播報文,以到達向另一個網絡傳輸的功能。
其工作原理如下圖:
IGMP

小結

      本章主要介紹了IP協議,重點介紹ICMP協議及其應用,廣播和多播簡單的入門概念講解,IGMP作爲多播協議的基礎進行介紹。實際上可以大致的看出網絡層協議主要負責工作和其分工,爲日後使用上層協議打好基礎。IP協議作爲核心協議,主要分析IP協議的首部字段,IP主要工作,並沒有深入的對其進行講解,後續會陸續的進行各個擊破,如果沒有站在一個更高的抽象層面去看待網絡協議,就無法領略網絡協議的全貌。所以我計劃幾個章節對網絡協議進行一個概況,不一定面面俱到,希望可以將描繪整張藍圖。

參考

《TCP/IP詳解-協議》卷一     W.Richard Stevens


修訂

  初稿                                       2014-10-25                Simon


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章