IP协议(RFC791)-IP包格式

IP协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是IP4的数据包格式,IP封包格式(IPv4包首部长度为20字节)


|0......4........8..............16....................................32
-------------------------------------------------------------------------
|
版本4.|首部长度|服务类型(优先级|数据包总长............................|
-------------------------------------------------------------------------
|
标识...........................|RF|DF|MF|碎片偏移.....................|
-------------------------------------------------------------------------
|
生存时间TTL....|协议(TCP/UDP)..|首部较验和............................|
-------------------------------------------------------------------------
|
IP地址..............................................................|
-------------------------------------------------------------------------
|
目的IP地址............................................................|
-------------------------------------------------------------------------
|
选项..................................................................|
=========================================================================

|数据..................................................................|
-------------------------------------------------------------------------

Version (4) Internet Header Length (4) Type of Service (8) Total Length (16) 
Identification (16) Flags (3) Fragment Offset (13) 
Time To Live (8) Protocol (8) Header checksum (16) 
Source Address (32) 
Destination Address (32) 
Options (Variable) Padding (0-24) 
  
Data


IPIP包字段含义

 

在上图中括号之内的数字就是各部件的长度(bit)如果您够细心就会计算得出每一列的总长度都是32bit。下面我们分别对各部件名称解释一下 

Version 
版本(VER)。表示的是IP规格版本目前的IP规格多为版本4(version 4)所以这里的数值通常为 0x4 (注意封包使用的数字通常都是十六进位的) 

Internet Header Length
(值5,表示包头长度为5行,即532位,5=5*32bit=20*8bit=20byte=0x14byte
标头长度(IHL)。从IP封包规格中看到前面6行为header,如果OptionsPadding没有的话,也就只有5行,所以这里长度为“5”。我们知道每行有32bit也就是4byte,那麽5行就是20byte了,20这个数值换成16进制就成了0x14,所以当封包标头长度为最短的时候这里数值最终会被换算为0x14 

让我们看看我们撷取的ICMP封包其中属於IP部份的开头 

在这里我们看到的数值是“45”前面的“4”就是版本号数而後面的“5”则是标头长度。 

Type of Service 
服务类型(TOS)。这里指的是IP封包在传送过程中要求的服务类型其中一共由8bit组成其中每个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就是依据了。

从上图我们可以看到此封包的ID40973 ( a00d 换成十进制就知道了) 

Flag 
标记(FL)。这是当封包在传输过程中进行最佳组合时使用的3bit的识别记号。请参考下表 

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 
这两个选项甚少使用只有某些特殊的封包需要特定的控制才会利用到。这里也不作细表啦。 

struct ip //看一看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地址

阅读更多
个人分类: 网络编程
想对作者说点什么? 我来说一句

Ethernet/ip协议

2015年06月16日 3.32MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭