IP包头结构详解

1,IP包头结构如下图所示
[img]http://dl.iteye.com/upload/attachment/309017/d67cbc63-5fe8-3a3f-b587-03496343eea9.jpg[/img]

2,下面具体分析IP包头中各部分的作用。

[b]版本号(Version):[/b]长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)

[b]IP包头长度(Header Length):[/b]长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。

[b]服务类型(Type of Service):[/b]长度8比特。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)

[b]D 时延:[/b] 0:普通 1:尽量小
T 吞吐量: 0:普通 1:尽量大
R 可靠性: 0:普通 1:尽量大
M 传输成本: 0:普通 1:尽量小
0 最后一位被保留,恒定为0

[b]IP包总长(Total Length):[/b]长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。

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

[b]标记(Flags):[/b]长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
[b]
片偏移(Fragment Offset):[/b]长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

[b]生存时间(TTL):[/b]长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。

[b]协议(Protocol):[/b]长度8比特。标识了上层所使用的协议。
以下是比较常用的协议号:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF
[b]
头部校验(Header Checksum):[/b]长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改
变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

[b]起源和目标地址(Source and Destination Addresses):[/b]这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

至此,IP包头基本的20字节已介绍完毕,此后部分属于可选项,不是必须的部分。
[b]
填充(Padding):[/b]因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

3,c结构体定义:

//IP头部,总长度20字节
typedef struct _ip_hdr
{
#if LITTLE_ENDIAN
unsigned char ihl:4; //首部长度
unsigned char version:4, //版本
#else
unsigned char version:4, //版本
unsigned char ihl:4; //首部长度
#endif
unsigned char tos; //服务类型
unsigned short tot_len; //总长度
unsigned short id; //标志
unsigned short frag_off; //分片偏移
unsigned char ttl; //生存时间
unsigned char protocol; //协议
unsigned short chk_sum; //检验和
struct in_addr srcaddr; //源IP地址
struct in_addr dstaddr; //目的IP地址
}ip_hdr;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值