1 版本域:表示数据报相对应的IP协议是多少,目前是4(代表IPv4,但IPv6也许要替代IPv4了)
2 首部长度:4位,IP协议包头的长度,指明IPv4协议包头长度的字节数包含多少个32位。由于IPv4的包头可能包含可变数量的可选项,所以这个字段可以用来确定IPv4数据报中数据部分的偏移位置。IPv4包头的最小长度是20个字节,因此IHL这个字段的最小值用十进制表示就是5 (5x4 = 20字节)。就是说,它表示的是包头的总字节数是4字节的倍数。
3 服务类型:定义IP协议包的处理方法,它包含如下子字段
-
- 过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
-
- 延迟字段:1位,取值:0(正常)、1(期特低的延迟)
-
- 流量字段:1位,取值:0(正常)、1(期特高的流量)
-
- 可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
-
- 成本字段:1位,取值:0(正常)、1(期特最小成本)
-
- 未使用:1位
4 总长度域:IP包的总长,以字节为单位
5 标识域:是源机赋予数据报的标识符,以便目的机进行分片的重组工作;
6 标志:是一个3位的控制字段,包含:
保留位(2):1位
不分段位(1):1位,取值:0(允许数据报分段)、1(数据报不能分段)
更多段位(0):1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)
7 段偏移量:当数据分组时,它和更多段位(MF, More fragments)进行连接,帮助目的主机将分段的包组合。偏移量是以8个字节为单位的;
8 TTL:表示数据包在网络上生存多久,每通过一个路由器该值减一,为0时将被路由器丢弃。
9 协议:8位,这个字段定义了IP数据报的数据部分使用的协议类型。常用的协议及其十进制数值包括ICMP(1)、TCP(6)、UDP(17)。
10 校验和:16位,是IPv4数据报包头的校验和。
11 源IP地址:为发送方的IP地址 4字节,0x0a0x080x7a0xfe 对应IP地址 10.8.122.254
12 目的地址:接收方IP地址
13 选项域:可有可无
// IP header
typedef struct _tagX_iphdr
{
unsigned char h_len:4; // IP报头长度 4位 5<<2 =20
unsigned char version:4; // 版本 4位 4
unsigned char tos; // 服务类型 8位 0
unsigned short total_len; // 总长度 16位 0042
unsigned short ident; // 标识 16位 410e
unsigned short frag_and_flags; // 报片标志偏移 4+12位 0000
unsigned char ttl; // 生存时间 8位 80
unsigned char proto; // 协议(TCP, UDP etc) 8位 01
unsigned short checksum; // 报头校验和 16位 d4d1
unsigned int sourceIP; //信源IP地址 32位 0a 00 08 7a
unsigned int destIP; //信宿IP地址 32位 0a 00 08 7a
}XIpHeader;
//TCP header
typedef struct _tcphdr
{
byte source_port[2]; //发送端端口号,16位
byte dest_port[2]; //接收端端口号,16位
byte sequence_no[4]; //32位,标示消息端的数据位于全体数据块的某一字节的数字
byte ack_no[4]; //32位,确认号,标示接收端对于发送端接收到数据块数值
byte offset_reser_con[2];//数据偏移4位,预留6位,控制位6为
byte window[2]; //窗口16位
byte checksum[2]; //校验码,16位
byte urgen_pointer[2]; //16位,紧急数据指针
byte options[3]; //选祥和填充,32位
}TCP_HEADER;