在上图中括号之内的数字就是各部件的长度(bit)如果您够细心就会计算得出每一列的总长度都是32bit。下面我们分别对各部件名称解释一下
Version
版本(VER)。表示的是IP规格版本目前的IP规格多为版本4(version 4)所以这里的数值通常为 0x4 (注意封包使用的数字通常都是十六进位的)。
Internet Header Length(值5,表示包头长度为5行,即5个32位,5行=5*32bit=20*8bit=20byte=0x14byte)
标头长度(IHL)。从IP封包规格中看到前面6行为header,如果Options和Padding没有的话,也就只有5行,所以这里长度为“5”。我们知道每行有32bit也就是4byte,那麽5行就是20byte了,20这个数值换成16进制就成了0x14,所以当封包标头长度为最短的时候这里数值最终会被换算为0x14。
让我们看看我们撷取的ICMP封包其中属於IP部份的开头
在这里我们看到的数值是“45”前面的“4”就是版本号数而後面的“5”则是标头长度。
Type of Service
服务类型(TOS)。这里指的是IP封包在传送过程中要求的服务类型其中一共由8个bit组成其中每个bit的组合分别代表不同的意思
000..... Routine 设定IP顺序预设为0否则数值越高越优先
...0.... Delay 延迟要求0是正常值1为低要求
....0... Throughput 通讯量要求0为正常值1为高要求
.....0.. Reliability 可靠性要求0为正常值1为高要求
......00 Not Used 未使用
在下例中我们可以看到TOS的值为0也就是全部设置为正常值
Total Length
封包总长(TL)。通常以byte做单位来表示该封包的总长度此数值包括标头和数据的总和。
从上图我们看到的十六进位数值是“003C”换成十进位就是“60”了。
Identification
识别码(ID)。每一个IP封包都有一个16bit的唯一识别码。我们从OSI的网路层级知识里面知道当程序产生的数据要通过网络传送时都会被拆散成封包形式发送,当封包要进行重组的时候这个ID就是依据了。
从上图我们可以看到此封包的ID为40973 (将 a00d 换成十进制就知道了)。
Flag
标记(FL)。这是当封包在传输过程中进行最佳组合时使用的3个bit的识别记号。请参考下表
000. Reserved Fragment 当此值为0的时候表示目前未被使用。
.0.. Don't Fragment 当此值为0的时候表示封包可以被分割,如果为1则不能被分割。
..0. More Fragment 当上一个值为0时:此值为0就示该封包是最後一个封包,如果为1则表示其後还有被分割的封包。
在下例中我们看到这个封包的标记为“0”也就是目前并未使用。
Fragment Offset
分割定位(FO)。当封包被切开之後由於网路情况或其它因素影响其抵达顺序并不会和当初切割顺序一至的。所以当封包进行切割的时候会为各片段做好定位记录所以在重组的时候就能够依号入座了。
因为我们刚才撷取到的封包并没有被切割所以暂时找不到例子参考在上例中我们看到的FO为“0”。
Time To Live
延续时间(TTL)。这个TTL我们在许多网路设定上都会碰到当一个物件被赋予TTL值(以秒为单位)之後就会进行计时如果物件在到达TTL值的时候还没被处理的话就会被遗弃。 不过并不是所有的 TTL 都以时间为单位例如 ICMP 协定的 TTL则以封包路由过程中的跳站数目(Hop Count)做单位。TTL 值每经过一个跳站(或被一个 router 处理)之後就会被减低一个数值 。这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面。
上图中我们看到的数值可不是 20 哦因为这是个十六进位数字要换成十进位才知道 TTL 原来是 32 个跳站。
Protocol
协定(PROT)。这里指的是该封包所使用的网路协定类型例如ICMPDNS等。要注意的是这里使用的协定是网路层的协定这和上层的程式协定(如FTPPOP等)是不同的。您可以从Linux的/etc/protocol这个档案中找到这些协定和其代号此档案也存放於NT的\winnt\system32\drivers\etc目录里面。其内容如下
------------------------------------------------------
ip 0 IP # internet protocol, pseudo protocol number
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # Internet Group Management
ggp 3 GGP # gateway-gateway protocol
ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'')
st 5 ST # ST datagram mode
tcp 6 TCP # transmission control protocol
egp 8 EGP # exterior gateway protocol
pup 12 PUP # PARC universal packet protocol
udp 17 UDP # user datagram protocol
hmp 20 HMP # host monitoring protocol
xns-idp 22 XNS-IDP # Xerox NS IDP
rdp 27 RDP # "reliable datagram" protocol
iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4
xtp 36 XTP # Xpress Tranfer Protocol
ddp 37 DDP # Datagram Delivery Protocol
idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport
rspf 73 RSPF #Radio Shortest Path First.
vmtp 81 VMTP # Versatile Message Transport
ospf 89 OSPFIGP # Open Shortest Path First IGP
ipip 94 IPIP # Yet Another IP encapsulation
encap 98 ENCAP # Yet Another IP encapsulation
------------------------------------------------------
在我们这个例子中可以看得出PROT的号码为“01”对照/etc/protocol档案我们可以知道这是一个ICMP协定。
Header Checksum
标头检验值(HC)。这个数值主要用来检错用的用以确保封包被正确无误的接收到。当封包开始进行传送後接收端主机会利用这个检验值会来检验馀下的封包如果一切看来无误就会发出确认信息表示接收正常。
上图中我们看到的封包之HC为“9049”。
Source IP Address
来源地址(SA)。相信这个不用多解释了就是发送端的IP地址是也。
我们将“c0.a8.00.0f”换成十进位就可以得出“192.168.0.15”这个地址了。
Destination IP Address
目的地址(DA)。也就是接收端的IP地址啦。
看看你能不能将“a8.5f.01.54”换成“168.95.1.84”
Options & Padding
这两个选项甚少使用只有某些特殊的封包需要特定的控制才会利用到。这里也不作细表啦。
下面我们看一看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 /* Don't Fragment flag即第二位为1(不可分包) */
#define IP_MF 0x2000 /* More Fragments flag即二三位为00(可分包,此为最后一个包)或01(还有后继包) */
#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_v IP协议的版本号,这里是4,现在IPV6已经出来了
ip_hl IP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5.
ip_tos服务类型,说明提供的优先权.
ip_len说明IP数据的长度.以字节为单位.
ip_id标识这个IP数据包.
ip_off碎片偏移,这和上面ID一起用来重组碎片的.
ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃.
ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议.
ip_sum首部校验和,提供对首部数据的校验.
ip_src,ip_dst发送者和接收者的IP地址
要分析IP包,首先要知道IP包的包头格式,各种计算机网络的书籍都有介绍,必须了解该协议分析包才有意义,IPv4首部一般是20字节长,该协议如下:
下面使用Ethereal抓取一个特定的IP包,然后根据该协议分析该IP包。
使用Ethereal抓取的IP包如下:
我用不同的框框划分出来了,便于分析。
首先,开始的 6字节+ 6字节 + 2字节 不属于IP包包头本身。
(1)“ 00 e0 4c 5f 97 1b ” 目的主机的MAC地址
(2)“ 00 1a 4d 28 62 ff ” 源主机的MAC地址:
(3) “08 00 ” 包类型: 08 00 为 IP包
后面的开始为真正的IP包包头,可以根据上面的协议进行分析了。
(4)“45”,其中“4”是IP协议的版本(Version),说明是IP4
“5”指本IP包的包头长度为 5X4 = 20 字节
(5) “00”服务类型(Type of Service)
(6) “00 40”是IP数据报文总长,包含头部以及数据,这里表示4X16 = 64字节(注:00 40为16进制表示)
(7) " 62 06 "、" 40 00 " 表示 认证、标志、段偏移:主要用于数据报的分段
(8) " 40" 表示一个IP数据流的生命周期,用Ping显示的结果,能得到TTL的值,很多文章就说通过TTL位来判别主机类型。因为一般主机都有默认的TTL值,不同系统的默认值不一样.
(9) " 06 " 很重要,表示 传输层的协议类型(Protocol),06表示TCP协议
(10)"8b e5" 为校验和
(11)"c0 a8 0c 34" 源地址的IP : 即 192.128.12.52
(12)"79 c2 06 2e"目的地址的IP: 即 121.194.6.46
后面接着的就是IP的数据内容了,IP包包头分析就到此为止,其实分析包头并不难
阅读(1288) | 评论(0) | 转发(0) |