在握手过程的第三步中RST而不是ACK

时间:2014-09-08 16:13:43

标签: networking tcp raw-sockets

我在Ubuntu上编写了c / c ++代码,模拟了握手过程。

//Create a raw socket
int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
//some address resolution
strcpy(source_ip , "192.168.1.9");
sin.sin_family = AF_INET;
sin.sin_port = htons(1235);
sin.sin_addr.s_addr = inet_addr ("192.168.1.6");



if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
{
    perror("Error setting IP_HDRINCL");
    exit(0);
}



 {
    //Send the packet
    if (sendto (s, datagram, iph->tot_len ,  0, (struct sockaddr *) &sin, sizeof (sin)) < 0)
    {
        perror("sendto failed");
    }
    //Data send successfully
    else
    {
        printf ("Packet Send. Length : %d \n" , iph->tot_len);
    }
}

int l;
if( recvfrom(s,buffer,4096,0, (struct sockaddr *) &sin, &l)<0)
{
    perror("sendto failed");
}
//Data send successfully
else
{
    printf ("Packet recv. ");
}
printf ("Enter number to end: ");


int numm=getchar();
close(s);
return 0;

代码首先将SYN数据包发送到在Windows上运行的192.168.1.6:1235。

SYN数据包正确到达192.168.1.6:1235。

SYN-ACK正确到达Ubuntu(192.168.1.9:1234)。

但是在Wireshark中显示RST而不是ACK。

我在192.168.1.6上运行netcat -l -p 1235

我尝试了以下所有方法:

  • 在源计算机(ubuntu)中使用netcat打开我发送SYN时使用的相同端口(1234)。
  • 默认情况下禁用ubuntu中的防火墙。
  • 我写了一个小代码,让这台机器成为我在SYN中使用的同一端口(1234)上的服务器。
  • 我更新了发送SYN数据包的代码以取消套接字,除非我插入一些字符。

但没有人解决问题。

1 个答案:

答案 0 :(得分:1)

当您使用原始套接字时,您的操作系统并不知道存在连接,因为您实际上已经实现了自己的TCP / IP堆栈并绕过了操作系统。

您的操作系统会看到一个未经请求的数据包,并以RST响应,表示主动拒绝响应您使用原始套接字发送的数据包的远程系统。

要解决此问题,请使用路由到您所在的子网的IP地址,但使用原始套接字在计算机上分配 ,以便操作系统不响应然后从它传输并以某种混杂的模式听取响应&#34;。您的网卡应支持观察未发往其的数据包,因此您可以监控正确路由的流量。