版本(4bit) | 报头长度(4bit) | 优先级和服务类型(8bit) | 总长度(16bit) | |
标识(16bit) | 标志(3bit) | 分段偏移(13bit) | ||
存活期(8bit) | 协议(8bit) | 报头校验和(16bit) | ||
源IP地址(32bit) | ||||
目的IP地址(32bit) | ||||
选项(0或32bit,若有的话) | ||||
数据(可变) |
版本 IP版本号。
报头长度 32位字的报头长度(HLEN)。
优先级和服务类型 服务类型描述数据报将如何被处理。前3位表示优先级位。
总长度 包括报头和数据的数据包长度。
标识 唯一的IP数据包值。
标志 说明是否有数据被分段。
分段偏移 如果数据包在装人帧时太大,则需要进行分段和重组。分段功能允许在因特网上存在有大小不同的最大传输单元(MUT)。
存活期(TTL) 存活期是在数据包产生时建立在其内部的一个设置。如果这个数据包在这个TTL到期时仍没有到达它要去的目的地,那么它将被丢弃。这个设置将防止IP包在寻找目的地的时候在网络中不断循环。
协议 上层协议的端口(TCP是端口6;UDP是端口17(十六进制)) 。同样也支持网络层协议,如ARP和ICMP。在某些分析器中被称为类型字段。下面将给出这个字段更详细的说明。
报头校验和 只针对报头的循环冗余校验(CRC)。
源IP地址 发送站的32位IP地址。
目的IP地址 数据包目的方站点的32位IP地址。
选项 用于网络检测、调试、安全以及更多的内容。
数据 在IP选项字段后面的就是上层数据。
对应于Jpcap包中IPPacket类:看一下具体的文档,得到了对应的关系:
构造IPv4包的方法
Method Summary | |
---|---|
void | setIPv4Parameter(int priority, boolean d_flag, boolean t_flag, boolean r_flag, int rsv_tos, boolean rsv_frag, boolean dont_frag, boolean more_frag, int offset, int ident, int ttl, int protocol, java.net.InetAddress src, java.net.InetAddress dst) Sets the IPv4 parameters |
实例:ipp. setIPv4Par ameter ( 0, false, false, false,0, tr ue , tr ue , false, 4, 1, 255, 230, / / 230 未定义协议
new IPAddr ess( 110. 110. 17. 101) ,
new IPAddr ess( "210. 40. 7. 149") ) ;
version:v4/v6
priority:优先权 /** Priority (class) (v4/v6) */
public byte priority;
服务类型设置: d_flag - IP flag bit: [D]elay 表示要求有更低的时延
t_flag - IP flag bit: [T]hrough 表示要求有更高的吞吐量
r_flag - IP flag bit: [R] eliability 表示要求更高的可靠性
rsv_tos - Type of Service (TOS) 服务类型
数据偏移设置: rsv_frag - Fragmentation Reservation flag 有无碎片标识
dont_frag - Don't fragment flag 末尾碎片标识
more_frag - More fragment flag 尚有碎片表示
offset – Offset 数据块偏移
IP数据报识别标志:ident – Identifier 上层协议调用
offset:分段偏移
ttl:存活时间 Time To Live
protocol:协议(int类型)这个是源码中给出的协议类型号
/** Protocol number for ICMP */
public static final short IPPROTO_ICMP = 1;
/** Protocol number for IGMP */
public static final short IPPROTO_IGMP = 2;
/** Protocol number for IP in IP */
public static final short IPPROTO_IP = 4;
/** Protocol number for TCP */
public static final short IPPROTO_TCP = 6;
/** Protocol number for UDP */
public static final short IPPROTO_UDP = 17;
/** Protocol number for IPv6 */
public static final short IPPROTO_IPv6 = 41;
/** Protocol number for IPv6 hop-by-hop option */
public static final short IPPROTO_HOPOPT = 0;
/** Protocol number for routing header for IPv6 */
public static final short IPPROTO_IPv6_Route = 43;
/** Protocol number for fragment header for IPv6 */
public static final short IPPROTO_IPv6_Frag = 44;
/** Protocol number for IPv6 ICMP */
public static final short IPPROTO_IPv6_ICMP = 58;
/** Protocol number for no next header header for IPv6 */
public static final short IPPROTO_IPv6_NoNxt = 59;
/** Protocol number for destination option for IPv6 */
public static final short IPPROTO_IPv6_Opts = 60;
src:源IP
dst:目的IP
之后是基于IP 数据包的洪水攻击的原理:
用未定义协议字段构造IP 包进行洪水攻击构造一个IP 数据包, 在上层协议中用不属于任何已分配定义的协议类型表示此字段。目的IP 指向欲攻击主机, 源IP 采用伪
装, 服务类型字段选默认, 数据块偏移设为无碎片无偏移, T TL 设为最大值255, 协议字段填入任一未分配的协议类型, 最后在校验和处填入正确的校验码进行发送。注意此时
只进行了IP 数据报首部校验和的计算, 对IP 数据报的数据段可进行随意的构造。
由于IP 校验码无误, IP 数据包是合理的, 不会在传输过程中因协议字段的变化而丢弃。但是由于其上层协议是未知的, 所以到达目的主机后不能进行进一步的数据处理,
也不会像SYN 洪水攻击那样进行TCP 数据报校验和的检验。此时, 系统认为此数据包的协议没有连同数据包发送过来或是系统不支持此协议, 于是直接向发送此数据包的源IP
位置回执一个ICMP 包, 以通知对方IP 数据报的协议未能同时送达。
在这种情况下, 被攻击主机虽然没有建立一个连接, 也不会有等待延时, 但是大量的此种数据包发送出来进行攻击, 特别是形成DDoS 攻击时, 系统资源会消耗殆尽, 造成很
大的危害。
ICMP的回送类型:
3 | 2 | Protocol Unreachable——协议不可达 | x |