IP數據報格式和IP地址路由(三)

一、IP數據報格式

注:注意的是網絡數據包以大端字節序傳輸,當然頭部也得是大端字節序

linux中的IP數據結構體:

struct ip
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ip_hl:4; /* header length */
    unsigned int ip_v:4; /* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int ip_v:4; /* version */
    unsigned int ip_hl:4; /* header length */
#endif
    u_int8_t ip_tos; /* type of service */
    u_short ip_len; /* total length */
    u_short ip_id; /* identification */
    u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
    u_int8_t ip_ttl; /* time to live */
    u_int8_t ip_p; /* protocol */
    u_short ip_sum; /* checksum */
    struct in_addr ip_src, ip_dst; /* source and dest address */
  }; 


版本
IP協議版本號,長度爲4位,IPv4此字段值爲4,IPv6此字段值爲6


首部長度
以32位的字爲單位,該字段長度爲4位,最小值爲5,即不帶任何選項的IP首部20個字節;最大值爲15,所以首部長度最大爲60個字節


服務類型(TOS)
長度爲8位。此字段包含3位的優先權(現已忽略),4位的服務類型子字段(只能有一位置1)和1位的保留位(必須置0)。4位的服務類型分別爲最小延遲(D)、最大吞吐量(T)、最高可靠性(R)、最小費用(F),如下圖。


總長度
該字段長度爲16位,以字節爲單位,該字段長度包含IP的頭部和數據部分(payload)。IP數據報最大可達65535(2^16-1)個字節。

標識
16位標識,用來標識一個IP數據報,每發送一個此值會加1,可用於分片和重新組裝成數據報。



標誌與片偏移

3位標誌其中第一位不使用, 每二位DF(Don’t Fragment),該位如果爲1,如果傳輸的數據報超過最大傳輸單元(MTU),該數據報會被丟棄,併發送一個ICMP差錯報文。第三位MF(More Fragment)表示是否有更多的片,該位爲1,說明後續有分片。最後一片MF爲0。


假設一個IP數據報大於最大傳輸單元MTU,那麼如果設置了分片標誌位,將會被分片傳輸。

每一片都有自己的IP 頭部,IP頭部中的標識是一樣的,但是片偏移不同(以8字節爲單位)。除了最後一片,分片要求其他片除去IP頭部的大小必須是8字節的整數倍。除了第一片有tcp/udp頭部,其他片都沒有。分片完成後,每一片獨自成爲一個數據包(跟數據報概念不同,參見這裏),可以走不同的路由,最後到達目的地的時候IP層根據它們各自IP頭部的信息重新組成一個IP數據報。如下圖,這裏IP數據報被分出了2片





TTL
TTL(Time To Live)表示數據報最多可經過的路由器的數量。數據報每經過一個路由器,TTL減1,減爲0時丟棄,併發送ICMP報文通知源主機。TTL可以避免數據報在路由器之間不斷循環。


協議類型
表示IP層上承載的是哪個高級協議。在封裝與分用的過程中,協議棧知道該交給哪個層的協議處理。1 ICMP 2 IGMP 6 TCP 17UDP


頭部校驗和
保證數據報頭部的數據完整性,但校驗不包括數據部分。



源IP地址
發送數據的主機IP地址


目的IP地址
接收數據的主機IP地址


選項與填充(選項爲4字節整數倍,否則用0填充)


二、IP地址與路由

IPv4的IP地址長度爲4字節,通常採用點分十進制表示法(dotted decimal representation),Internet被各種路由器和網關設備分隔成很多網段,爲了標識不同的網段,需要把32位的IP地址劃分成網絡號和主機號兩部分,網絡號相同的各主機位於同一網段,相互間可以直接通信,網絡號不同的主機之間通信則需要通過路由器轉發。


這臺主機只有一個網絡接口連到172.16.148.0/24網絡(172.16.148.166 & 255.255.255.0 = 172.16.148.0)

路由表的Destination(目標)是目的網絡地址網關;(Gateway)是下一跳地址,接口(Iface)是發送接口,標誌(Flags)中的U標誌表示此條目有效(可以禁用某些條目),G標誌表示此條目的下一跳地址是某個路由器的地址,沒有G標誌的條目表示目的網絡地址是與本機接口直接相連的網絡,不必經路由器轉發,因此下一跳地址處記爲*號。


路由的處理過程如下



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