IP(v4) Packet Header(IP包头)[ 以下无特殊说明时IP均表示IPV4,也是我们当前大部分人在使用的。]
下面,我来结合通过抓包工具所截取到的IP包头来对它的各个字段作说明:
Version:标识数据包所归属的IP版本号。这个4 bit的字段当被设置为0100时表示IPV4(可以看到我抓包中version:4这个内容),设置为0110时表示IPV6(IPV6将在我以后的文章中讲到)。
Header Length:标识IPV4数据包头部长度。这个字段值的会根据后面Options字段变化而变化。IP数据包包头最小长度为20字节(在抓到的数据包中可以看到Header length:20 bytes这个内容),而最大可以60个字节。但由于IPV4的Options段用得比较少,我们看到的大部分IP数据包都为20字节。
Type of Service (TOS)或DiffServ:服务类型或差分服务。该字段长度为8
Total Length:总长度,表示IP数据包的总长度,包括IP包头部分。此字段长度为16 bit,因此用十进制表示最大为65535,也就是说IP数据包最大长度为65535字节。并且接收方用这个字段的值减IP头部长度的字段,就可得出数据包的有效载荷 (抓包中Total Length :75,再根据前面提到的Header length:20 bytes,我们可得出这个IP包的有效载荷为75-20=55bytes) 。
Identifier:标识符,长度为16 bit。一般需与后面的Flag及Fragment Offset字段配合使用,用来将同一个数据包的分片数据包打上同样的标记,以供接收者识别。(抓包中的Identification:0x0f49,表示为数据包打的标记。)
Flags:标记字段,长度为3 bit。第一位未使用(抓包中Reserved bit:not set);第二位为DF位(抓包中Don’t fragment:Not set,表示未设置),当此位被设置(1)时,表示节点不对数据进行分片操作。由此带来的坏处是,当节点遇到超过它自身的MTU(最大传输单元)时,将无法传递数据包;第三位为MF位(抓包中More fragments:Not set,表示未设置),当此位被置位(1)时,表示后面还有被分片的数据包,直到MF=0才表示为被分片的最后一个数据包。由此可以方便接收者知道何时为分片数据包传输完毕。
Fragment Offset:分段偏移位,字段长度为13 bit。指明被分片的数据包相对于数据包起始位置,由此可使接收者正确的重组被分片的数据包 (抓包中此字段被设置为0) 。
Time to Live (TTL):生存时间,字段长度为8位。在数据包被创建时,该字段被设置为某个特定值(抓包中的TTL被设置为128)。每经过一个路由器,该值会被减1,当TTL值被减到0时,该数据包会被丢弃!其中一大好处是当一个IP数据包在形成环路的链路上传输时,它的TTL值会被减为0,由此而避免了数据包在网络中无限期的传输下去。我们常用的Trace命令就是利用了这个字段。
Protocol:协议字段,长度为8位。它指出了上层传输的协议号(抓包中Protocol字段被设置为UDP)。
Header Checksum:头部校验和,字段长度为16 bit。可以对于IP报头纠错,它不包括被封装的数据内容。由于这个字段与上层协议中这个功能有冗余之嫌,故在IPV6中取消了此字段。
Source and Destination Addresses:源、目标地址字段,长度为32 bit。标识发送者的源及目标IP地址(抓包中可以看出它们相对应的值:Source:145.254.160.237 Destination:145.253.2.203。)
Options:可选项字段,内容如其名,可选且长度可变,但最长为20字节。此字段在实际中用得并不多,也可以看出在我抓取的数据包中并没有包含此字段。