本文章阐述IP包头部的结构.

版本(4):头长度(4):IP服务类别(8):总长度(16):

标记(16):标志(4):偏移量(12):
生存周期(8):协议(8):头效验和(16):

              源地址(32):

            目的地址(32):

                 选项:

                 填充

* 括号内的值为区域的长度,以比特为单位.

版本: 恒为4 --指出IP的版本为4版本

头部长度(4): 以32比特为除数计算出的IP头部长度   本区域值= IP头部长度 /
32 最长的IP包头长度可以为480比特=60Byte

IP服务类别: 8位  按位被如下定义 PPP D T R C 0
PPP:定义包的优先级:
000 普通 (Routine)
001 优先的 (Priority)
010 立即的发送 (Immediate)
011 闪电式的(flash)
100 比闪电还闪电似的的 (Flash Override)
101 CRI/TIC/ECP (找不到这个词的翻译)
110 网间控制 (Internetwork Control)
111 网络控制 (Network Control)

D 时延:    0:普通 1:尽量小
T 吞吐量: 0:普通 1:尽量大
R 可靠性:  0:普通 1:尽量大
M 传输成本: 0:普通 1:尽量小
0 被保留--恒定为0

总长度: 以字节为单位计算的IP包的长度 (包括数据和头部).-因为上面已经表明总长度只占16个比特位,所以最大为65535字节


标识符(Identifier)(数据报ID):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。 

 

IP包由首部(header)和实际的数据部分组成。数据部分一般用来传送其它的协议,如TCPUDPICMP等。数据部分最长可为65515字节Byte)(=216 - 1 - 最短首部长度20字节)。一般而言,低层(链路层)的特性会限制能支持的IP包长。例如以太网Ethernet)协议,有一个协议参数,即所谓的最大传输单元(Maximum Transfer Unit, MTU) ,为1518字节,以太网的帧首部使用18字节,剩给整个IP包(首部+数据部分)的只有1500字节。

还有一些底层网络只能支持更短的包长。这种情况下,IP协议提供一个分割(fragment)的可选功能。长的IP包会被分割成许多短的IP包,每一个包中携带一个标志(Fragmentid)。发送方(比如一个路由器)将长IP包分割,一个一个发送,接送方(如另一个路由器)按照相应的IP地址和分割标志将这些短IP包再组装还原成原来的长IP包。


标记\标志\偏移量共同来实现包的分段.
一旦一个数据包要穿过一个链路,这个链路的最大传输单元(MTU) 要比这个包的长
度要小. (MTU是链路上所能传输的最大包的大小),那么这个数据包要被拆分成几个
小数据包,并且在目的地址重新组合起来.
标记: 16比特. 路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目
的端设备能够区分哪个包属于被拆分开的包的一部分。

标志:3比特 第1比特没有使用
               第2比特为 "不分段"比特(Don't Fragment)  如果该比特为1,
则含义为通知沿途的路由器即便数据包长度超过MTU值,也不要拆分这个数据包.
(路由器会将这个包丢弃)
               第3比特: 路由器拆分小包后,会将每个小包(除了最后一个)的本
比特置1

生存周期:8比特该数值由发出数据包的设备设置,为避免路由循环,每个包经过路由
器时,路由器会将这个数值减去1,当这个数值为0,则数据包被丢弃.

协议 8 比特: 定义上层协议的类型 (以下是几个)
1   ICMP
2   IGMP 国际胡连网组管理协议
6   TCP
17  UDP
88  IGRP 国际胡连网网关路由协议 (CISCO私有)
89  OSPF

头效验和: 用来做IP头部的正确性检测,但不包含数据部分. 因为每个路由器要改
变TTL的值,所以路由器会为每个通过的数据包重新计算这个值

源地址\目的地址: 如果这个不知道的话,前面的东西劝你还是忘记吧. 但要注意除
非使用NAT否则整个传输的过程中,这两个地址不会有改变.

选项: 长度不固定.  可选的.  主要用于测试.

填充: 为确保IP头部的长度为32的整数倍, 在选项后面, IP协议会填充若干个0,以
达到32比特的整数倍