繁体   English   中英

服务器未收到TCP SYN数据包

[英]Server not receiving TCP SYN packets

我正在使用WinPcap对TCP syn Flooder进行编程(出于教育目的),但是当我发送精心制作的数据包时,服务器未收到任何信息。 我目前正在本地主机上测试我的程序,但我也在Internet上使用Wireshark监视我的网络流量来尝试了该程序,根据Wireshark数据包是正确的,但服务器仍未收到任何信息。

这是我的以太网/ IP / TCP标头结构:

#ifdef _MSC_VER
#pragma pack(push, 1)
#else
#pragma pack(1)
#endif
struct ethernet_header {
        u8 dst_mac[6];
        u8 src_mac[6];
        u16 type;
};

struct ipv4_header {
        u8 ver_ihl;
        u8 tos;
        u16 length;
        u16 id;
        u16 flags_fo;
        u8 ttl;
        u8 protocol;
        u16 checksum;
        u32 src_ip;
        u32 dst_ip;
};

struct tcp_header {
        u16 src_port;
        u16 dst_port;
        u32 seq_num;
        u32 ack_num;
        u16 off_flags;
        u16 window_size;
        u16 checksum;
        u16 urgent_ptr;
        struct {
                struct {
                        u8 id;      /* 0x02 = MSS */
                        u8 len;     /* 0x04 */
                        u16 data;   /* MSS value (1460) */
                } mss;
                u8 nop;         /* 0x01 */
                struct {
                        u8 id;      /* 0x03 = Window Scale */
                        u8 len;     /* 0x03 */
                        u8 data;    /* Window Scale value (8) */
                } window_scale;
                u8 nop2;        /* 0x01 */
                u8 nop3;        /* 0x01 */
                struct {
                        u8 id;      /* 0x04 = SACK */
                        u8 data;    /* 0x02 */
                } sack;
        } options;
};
#ifdef _MSC_VER
#pragma pack(pop)
#else
#pragma pack(0)
#endif

这就是我初始化它们的方式:

    /* set ethernet header */
    memcpy(ethhdr.dst_mac, dst_mac_address, 6);
    memcpy(ethhdr.src_mac, src_mac_address, 6);
    ethhdr.type = htons(ETHERTYPE_IPV4);

    /* set ipv4 header */
    ipv4hdr.ver_ihl |= 0x40;    /* version is IPv4 */
    ipv4hdr.ver_ihl |= 0x5;     /* header size is 20 bytes */
    ipv4hdr.tos = 0;
    ipv4hdr.length = htons(sizeof(ipv4hdr) + sizeof(tcphdr));
    ipv4hdr.id = 0;
    ipv4hdr.flags_fo |= IP_CONTROL_FLAG_DF;
    ipv4hdr.ttl = 128;
    ipv4hdr.protocol = IPPROTOCOL_TCP;
    ipv4hdr.checksum = 0;
    ipv4hdr.src_ip = spoof_ip_address();
    ipv4hdr.dst_ip = inet_addr("127.0.0.1");

    /* calculate the checksum of a IP header */
    ipv4hdr.checksum = calculate_checksum(&ipv4hdr,
                        sizeof(ipv4hdr));

    /* set tcp header */
    tcphdr.src_port = htons(60450);
    tcphdr.dst_port = htons(32600);
    tcphdr.seq_num = 0;
    tcphdr.ack_num = 0;
    tcphdr.off_flags |= 0x80; /* header size is 32 bytes */
    tcphdr.off_flags |= TCP_CONTROL_FLAG_SYN;
    tcphdr.window_size = htons(8192);
    tcphdr.checksum = 0;
    tcphdr.urgent_ptr = 0;

    /* set TCP options */
    tcphdr.options.mss.id = 0x02;
    tcphdr.options.mss.len = 0x04;
    tcphdr.options.mss.data = htons(1460);
    tcphdr.options.nop = 0x01;
    tcphdr.options.window_scale.id = 0x03;
    tcphdr.options.window_scale.len = 0x03;
    tcphdr.options.window_scale.data = 2;
    tcphdr.options.nop2 = 0x01;
    tcphdr.options.nop3 = 0x01;
    tcphdr.options.sack.id = 0x04;
    tcphdr.options.sack.data = 0x02;

    /* calculate the checksum of a TCP header + options */
    tcphdr.checksum = calculate_checksum(&tcphdr, sizeof(tcphdr));

src_mac_addressdst_mac_address设置为相同的值,即我正在使用的网络接口适配器的MAC地址。 spoof_ip_address()函数以网络字节顺序返回随机的IPv4地址。 根据Wireshark,其他字段(校验和,TCP选项等)似乎是正确的。

我知道我的路由器在发送发往另一个网段的数据包时会将MAC和IP地址字段覆盖为其自己的MAC和IP地址,这样我的IP欺骗是无用的,但是我正在运行测试积压值为1的TCP服务器环回地址,但不接收SYN数据包。 我究竟做错了什么?

提前致谢。

TCP握手完成后,用户空间服务器应用程序将仅接收新连接(TCP / IP堆栈不会仅从SYN数据包的accept()调用返回)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM