我在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
我尝试了以下所有方法:
但没有人解决问题。
答案 0 :(得分:1)
当您使用原始套接字时,您的操作系统并不知道存在连接,因为您实际上已经实现了自己的TCP / IP堆栈并绕过了操作系统。
您的操作系统会看到一个未经请求的数据包,并以RST
响应,表示主动拒绝响应您使用原始套接字发送的数据包的远程系统。
要解决此问题,请使用路由到您所在的子网的IP地址,但使用原始套接字在计算机上分配 ,以便操作系统不响应然后从它传输并以某种混杂的模式听取响应&#34;。您的网卡应支持观察未发往其的数据包,因此您可以监控正确路由的流量。