TCP/IP之IP協議

概念:

IP:網絡之間互連的協議(Internet Protocol),是TCP/IP協議族中最爲核心的協議。所有的TCP、UDP、ICMP及IGMP數據都以IP數據報格式傳輸。

  • 不可靠(unreliable)的意思是它不能保證 IP數據報能成功地到達目的地。IP僅提供最好的傳輸服務。如果發生某種錯誤時,如某個路由器暫時用完了緩衝區,IP有一個簡單的錯誤處理算法:丟棄該數據報,然後發送ICMP消息報給信源端。任何要求的可靠性必須由上層來提供(如TCP)。
  • 無連接(connectionless)這個術語的意思是IP並不維護任何關於後續數據報的狀態信息。每個數據報的處理是相互獨立的。這也說明,IP數據報可以不按發送順序接收。如果一信源 向相同的信宿發送兩個連續的數據報(先是A,然後是B),每個數據報都是獨立地進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。

IP首部(IPv4):

普通的IP首部長爲20個字節,除非含有選項字段。

圖中最高位在左邊,記爲0bit;最低位在右邊,記爲31bit。
4個字節的32bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit, 最後是24~31bit。這種傳輸次序稱作big endian字節序。由於TCP/IP首部中所有的二進制整數 在網絡中傳輸時都要求以這種次序,因此它又稱作網絡字節序。以其他形式存儲二進制整數的機器,如little endian格式,則必須在傳輸數據之前把首部轉換成網絡字節序。

  • 版本(Version):IP協議的版本號。當使用IPv4協議時是4。
  • 首部長度(Header Length):首部(含選項部分)佔32bit字的數目。由於佔4bit,所以最大可以表示4X15=60字節。普通IP數據報(沒有任何選擇項)字段的值是5。
  • 服務類型(TOS:Type of Service):TOS字段包括一個3bit的優先權子字段,4bit的TOS子字段和1bit未用位但必須置0。4bit的TOS分別代表:最小時延、最大吞吐量、最高可靠性和最小費用。4bit中只能置其中1bit。如果所有4bit均爲0,那麼就意味着是一般服務。RFC 1340 [Reynolds and Postel 1992]描述了所有的標準應用如何設置這些服務類型。 RFC 1349 [Almquist 1992]對該RFC進行了修正,更爲詳細地描述了TOS的特性。
  • 總長度(Total Length):指的是整個IP數據報的長度,以字節爲單位。利用首部長度字段和總長度字段,就可以知道IP數據報中數據內容的起始位置和長度。
  • 標識(Identifier):唯一的標識主機發送的每一份數據報。通常每發送一份報文它的值就會加1。該字段和Flags和Fragment Offest字段聯合使用,對較大的上層數據包進行分段(fragment)操作。路由器將一個包拆分後,所有拆分開的小包被標記相同的值,以便目的端設備能夠區分哪個包屬於被拆分開的包的一部分。
  • 標誌(Flags):長度3比特。該字段第一位不使用。第二位是DF(Don’t Fragment)位,DF位設爲1時表明路由器不能對該上層數據包分段。如果一個上層數據包無法在不分段的情況下進行轉發,則路由器會丟棄該上層數據包並返回一個錯誤信息。第三位是MF(More Fragments)位,當路由器對一個上層數據包分段,則路由器會在除了最後一個分段的IP包的包頭中將MF位設爲1。
  • 片偏移(Fragment Offset):長度13比特。表示該IP包在該組分片包中位置,接收端靠此來組裝還原IP包。
  • 生存時間(TTL):長度8比特。當IP包進行傳送時,先會對該字段賦予某個特定的值。當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。如果TTL減少爲0,則該IP包會被丟棄。這個字段可以防止由於路由環路而導致IP包在網絡中不停被轉發。
  • 協議(Protocol):長度8比特。標識了上層所使用的協議。
    以下是比較常用的協議號:
    • 1:ICMP
    • 2:IGMP
    • 6:TCP
    • 17:UDP
    • 88:IGRP
    • 89:OSPF
  • 首部校驗和(Header Checksum):長度16位。用來做IP頭部的正確性檢測,但不包含數據部分。 因爲每個路由器要改變TTL的值,所以路由器會爲每個通過的數據包重新計算這個值。
  • 源IP地址和目的IP地址(Source and Destination Addresses):這兩個地段都是32比特。標識了這個IP包的起源和目標地址。要注意除非使用NAT,否則整個傳輸的過程中,這兩個地址不會改變。
  • 可選項(Options):這是一個可變長的字段。該字段屬於可選項,主要用於測試,由起源設備根據需要改寫。可選項目包含以下內容:
    • 鬆散源路由(Loose source routing):給出一連串路由器接口的IP地址。IP包必須沿着這些IP地址傳送,但是允許在相繼的兩個IP地址之間跳過多個路由器。
    • 嚴格源路由(Strict source routing):給出一連串路由器接口的IP地址。IP包必須沿着這些IP地址傳送,如果下一跳不在IP地址表中則表示發生錯誤。
    • 路由記錄(Record route):當IP包離開每個路由器的時候記錄路由器的出站接口的IP地址。
    • 時間戳(Timestamps):當IP包離開每個路由器的時候記錄時間。
    • 填充(Padding):因爲IP包頭長度(Header Length)部分的單位爲32bit,所以IP包頭的長度必須爲32bit的整數倍。因此,在可選項後面,IP協議會填充若干個0,以達到32bit的整數倍。

IP首部的一般定義如下:

typedef struct _iphdr //定義IP首部
{
    unsigned char h_lenver; //4位首部長度+4位IP版本號
    unsigned char tos; //8位服務類型TOS
    unsigned short total_len; //16位總長度(字節)
    unsigned short ident; //16位標識
    unsigned short frag_and_flags; //3位標誌位
    unsigned char ttl; //8位生存時間 TTL
    unsigned char proto; //8位協議 (TCP, UDP 或其他)
    unsigned short checksum; //16位IP首部校驗和
    unsigned int sourceIP; //32位源IP地址
    unsigned int destIP; //32位目的IP地址
}IP_HEADER;

IP路由選擇:

IP可以從TCP、UDP、ICMP和IGMP接收數據報(即在本地生成的數據報)並進行發送,或者從一個網絡接口接收數據報(待轉發的數據報)並進行發送。 IP層在內存中有一個路由表,當有數據要發送時,它要對該表進行一次搜索以確認轉發地址。如果數據報來自某個網絡接口時,當收到的數據到達IP層時,IP層會檢查數據報的目的地址是否爲本機IP或廣播IP:

  • 如果是,就根據IP首部協議字段的協議分發到相應的模塊進行處理。
  • 如果不是,那麼:
    IP層被設爲路由器功能,則對此數據報進行轉發。
    否則,丟棄該數據被報。

路由表內容如下所示:

  • 目的IP地址:可以是網絡地址,也可以是主機地址,由路由表中的標誌字段區分。
  • 下一跳路由器IP地址:與當前網絡接口直接相連的路由器或主機網絡接口的IP地址,具體是哪一個由路由表中的標誌字段區分。
  • 標誌:其中一個標誌區分目的IP是網絡地址還是主機地址,另一個標誌區分下一跳路由器是真的路由器還是網絡接口。
  • 網絡接口:指明對應的數據報應該從哪個網絡接口發出去。

IP路由選擇是逐跳地(hop-by-hop)進行的。IP路由選擇主要完成以下這些功能:

  • 搜索路由表,尋找能與目的IP地址完全匹配的表目(網絡號和主機號都要匹配)。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網絡接口(取決於標誌字段的值)。
  • 搜索路由表,尋找能與目的網絡號相匹配的表目。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網絡接口(取決於標誌字段的值)。目的網絡上的所有主機都可以通過這個表目來處置。例如,一個以太網上的所有主機都是通過這種表目進行尋徑的。這種搜索網絡的匹配方法必須考慮可能的子網掩碼。
  • 搜索路由表,尋找標爲“默認(default)”的表目。如果找到,則把報文發送給該表目指定的下一站路由器。
  • 如果上面這些步驟都沒有成功,那麼該數據報就不能被傳送。如果不能傳送的數據報來自本機,那麼一般會向生成數據報的應用程序返回一個“主機不可達”或“網絡不可達”的錯誤。

子網尋址:

把IP地址中的主機號再分成一個子網號和一個主機號。
即,將原來的IP地址
IP地址 ::= { <網絡號>, <主機號>}
劃分爲:
IP地址 ::= { <網絡號>, <子網號>, <主機號>}

子網掩碼:

這個掩碼是一個32bit的值,其中值爲1的比特留給網 絡號和子網號,爲0的比特留給主機號。
給定IP地址和子網掩碼以後,主機就可以確定IP數據報的目的是:

  • 本子網上的主機;
  • 本網絡中其他子網中的主機;
  • 其他網絡上的主機。

如果知道本機的IP地址,那麼就知道它是否爲A類、B類或C類地址(從IP地址的高位可以得知),也就知道網絡號和子網號之間的分界線。而根據子網掩碼就可知道子網號與主機號之間的分界線。

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