标识符(Identifier):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don‘t Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。
生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。
协议(Protocol):长度8比特。标识了上层所使用的协议。
以下是比较常用的协议号:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF
头部校验(Header Checksum):长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
Seq number:TCP连接建立时选择随机数作为初始值,通过SYN包传给接收端主机(SYN cookies采用基于时间种子的随机算法,且发送SYN+ACK后清空资源,收到ACK后通过cookie算法鉴定与SYN+ACK是否匹配);每发送一次数据,就累加一次数据字节数;
Ack number:发送端收到此序号表明之前的数据都已被成功接受,其值为收到的报文段序号+1;
Header length:标识该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。
Flags:
1 URG,为1表明有应急指针
2 ACK,除了SYN包外都为1,确认应答字段有效
3 PSH,为1表明将接受的数据立即传给上层协议,0则先进行缓存
4 RST,1=强制断开连接
5 SYN,1=建立连接
6 FIN,1=断开连接
Window size: 指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
Checksum:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分
Urgent:紧急指针,从数据首位到此指针位置;多用于中断通信,如telent输入ctrl+c
一个TCP/IP数据报至少有多大?
攻击程序在填充包头时,IP首部和TCP首部都不填充可选的字段,因此IP首部长度恰好是20字节,TCP首部也是20字节,共40字节。
对于以太网来说,最小的包长度数据段必须达到46字节,而攻击报文只有40字节,因此,网卡在发送时,会做一些处理,在TCP首部的末尾,填充6个0来满足最小包的长度要求。这个时候,整个数据包的长度为14字节的以太网头,20字节的IP头,20字节的TCP头,再加上因为最小包长度要求而填充的6个字节的0,一共是60字节。
以太网在传输数据时,还有CRC检验的要求。网卡会在发送数据之前对数据包进行CRC检验,将4字节的CRC值附加到包的最后面。这个时候,数据包长度已不再是40字节,而是变成64字节了,这就是常说的SYN小包攻击,数据包结构如下:
|14字节以太网头部|20字节IP头部|20字节TCP|6字节填充|4字节检验||目的MAC|源MAC|协议类型| IP头 |TCP头|以太网填充 | CRC检验 |
参考资料
http://www.51testing.com/html/66/138366-216709.html
http://blog.aliyun.com/232?spm=0.0.0.0.ARsJ5LIJ
TCP/IP header字段注释
原文:http://blog.itpub.net/15480802/viewspace-1334334/