一种解决此问题的方法是,在TCP头部中添加一些信息以避免重传被视为伪造的ACK。以下是代码示例:
struct tcp_ackhdr {
u32 seq;
u32 ack_seq;
u16 window;
u16 flags;
u16 optlen;
u16 padding;
};
struct tcp_opt_hdr {
u8 kind;
u8 len;
u8 pad[6];
};
struct tcp_ack_packet {
struct iphdr iph;
struct tcphdr tcph;
struct tcp_ackhdr tpa;
struct tcp_opt_hdr opt;
};
struct tcp_ack_packet* create_tcp_ack_packet(...) {
// Fill in the TCP ACK packet structure
struct tcp_ack_packet* pkt = (struct tcp_ack_packet*) malloc(sizeof(struct tcp_ack_packet));
...
pkt->tpa.flags = ACK; // Set the TCP ACK flag
pkt->opt.kind = 1; // Set the TCP NOP option
pkt->opt.len = 1; // Set the length of the option to 1 byte
...
return pkt;
}
在这个示例中,我们使用了自定义的TCP ACK数据包结构中的opt选项进行TCP ACK包的伪造。使用此选项,我们可以避免ACK被视为重传,因为每个包都包含一个唯一的数据,以表明这不是一个伪造的ACK。