先看下ip报头各部分所占内存大小的分布图:
然后下面是wireshack下捕获的包中的ip报头:
上面的结果是wireshack为了方便我们理解而产生的优化效果,其实它真正传输的内容是下面这串数据,一共57帧 20个字节的数据。
450000284f7740008006f4e7c0a800672f67c5fa
那我们去理解这串的内容呢?我把数据进行了分组,然后解释它的含义
1. 这个“4”代表的是协议的版本号(version);也就是表示下面使用的是ipv4版本的ip地址类型,它的二进制格式是“0100”,所占大小为4bit。
2. 这个“5”大小4bit,它的二进制是“0101”;代表IP包头长度(Header Length),也就是我们正在解释的这串数据的长度,这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。
3. “0000”表示的是服务类型(Type of Service,长度8比特。它的二进制是“00000000”,8位按位被如下定义 PPP D T R C 0,我们把它进行分成6组,分别解释
000(PPP) 0(D) 0(T) 0(R) 0(C) 0(O)
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
4.“28”是16进制数,转换成10进制就是40,它代表IP包总长(Total Length):长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
5.“4f77是16进制数,10进制值是20343,代表(数据报ID):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分
6.“4000”的二进制是“01000000 00000000”,所占大小2字节,它这里代表了两组参数,第一组占3个bit,第二组占13bit。
010(Flags) 0000000000000(Fragment Offset))
标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。
7."80"代表的10进制数是128,它的含义是生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
8."06"表示的是下层协议是TCP协议(因为我抓的这个包是TCP包,他是一个三层协议的包,第一层是以太网包,第二层是IP包,第三层是TCP包)。
协议(Protocol):长度8比特。标识了上层所使用的协议。
以下是比较常用的协议号:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF
9."f4e7"代表头部校验(Header Checksum):大小16位,用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改
变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
10.起源和目标地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。
关于它的计算,我以来源地址为例,首先把16进制数 c0a80067 转为10进制得到一个数 3232235623,这是网络数字地址,它与IP地的关系为:
IP: 192.168.0.103 192*256^3 + 168*256^2 + 0*256^1 + 103*256*0 = 3232235623(数字地址)
其他可选项(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的整数倍。
部分参考:http://www.360doc.com/content/12/0329/14/9210126_198940526.shtml
测试评论
1
1
1