TCP ping 与 Socket 连接的区别

TCP ping 与 Socket 连接的区别

我编写了一个网络发现代码来发现网络上的设备。即使禁用了 ICMP 回显响应,该代码也应该能够发现网络上的设备。我读到tcp ping来自 nmap 发送TCP SYN 数据包并创建与远程设备的半开放连接以检查它是否可发现。在代码中我使用了连接来自 Windows 套接字库的函数通过在端口 80 上建立套接字连接来检查主机是否可以发现。

我按照以下步骤禁用了其中一台运行 Windows 7 的测试机器上的 ping关联检查机器是否可以被发现,但令人惊讶的是套接字连接也失败,出现连接被拒绝错误。但是nmap可以通过 TCP ping 选项(通过默认端口 80)发现设备。

我的问题是:

  1. 它们两者之间究竟有什么区别?

  2. 还有哪些其他方法可以发现网络上的设备。

这只是建立套接字连接的示例代码。

  #ifndef UNICODE
  #define UNICODE
  #endif

  #define WIN32_LEAN_AND_MEAN

  #include <winsock2.h>
  #include <ws2tcpip.h>
  #include <stdio.h>

 // Need to link with Ws2_32.lib
 #pragma comment(lib, "ws2_32.lib")

 int wmain()
 {

   // Initialize Winsock
    WSADATA wsaData;
    int i=0;
    char ip[20];
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
    wprintf(L"WSAStartup function failed with error: %d\n", iResult);
    return 1;
    }

    SOCKET ConnectSocket;
    sockaddr_in clientService;

do{

     // Create a SOCKET for connecting to server

      ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ConnectSocket == INVALID_SOCKET) {
       wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
       WSACleanup();
       return 1;
     }

     // The sockaddr_in structure specifies the address family,
      // IP address, and port of the server to be connected to.

     printf("\n Enter the Ip Address : ");
     scanf("%s",ip);
     clientService.sin_family = AF_INET;
     clientService.sin_addr.s_addr = inet_addr(ip);
     clientService.sin_port = htons(80);

     // Connect to server

     iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));

    if (iResult == SOCKET_ERROR) {
    wprintf(L"connect function failed with  machine number %d  with error: %ld\n",i, WSAGetLastError());

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR)
        wprintf(L"closesocket function failed with  machine %d error: %ld\n",i, WSAGetLastError());
        return 1;
    }
    wprintf(L"\n Connected to  machine  %d : ",i);

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
    wprintf(L"closesocket function failed with  machine %d error: %ld\n",i, WSAGetLastError());
    WSACleanup();
    return 1;
   }
   i++;

}while(i<2);
   WSACleanup(); 
   return 0;
 } 

答案1

它们之间到底有什么区别

抱歉,在什么之间?ICMP ping 和 TCP ping?——嗯,一个使用 ICMP 回显和回复消息,我相信您已经知道了,另一个尝试在三次 TCP 握手的协商上发挥作用。

如果你想知道代码中的 TCP Ping 和 nmap 有什么区别,那么你必须阅读 nmap 代码。或者另一个想法是运行类似http://www.wireshark.org/to查看您的应用程序通过网络发送的内容以及 nmap 通过网络发送的内容,然后比较结果。

还有哪些其他方法可以发现网络上的设备。

查看 nmap 中的所有选项并阅读一些 nmap 教程,那里有几个不同的发现选项(研究它们的工作原理)。一个好方法是尝试连接到机器上的 TCP 端口 0。不同的机器以不同的方式做出反应,因为这是一个不可用的套接字(保留)。这通常用于操作系统识别(某些操作系统会丢弃数据包,其他操作系统会发回数据包RST等,因此您可以猜测可能为该 IP 分配了哪个操作系统)。

但是对于主机发现来说,没有一种方法是万无一失的。您可以配置防火墙以各种方式做出反应(悄悄丢弃数据包、用数据包响应RST、发回 ICMP 禁止的数据包等等)。因此,考虑到这一点,当涉及防火墙时,主机发现会非常困难。如果您与主机位于同一 LAN 上,您可以尝试使用arppingRARP 等免费 ARP,尝试获取主机的 MAC 以及可能的 IP。即使它们不响应 ping 等,这种方法也可以奏效。您还可以尝试将 IP 数据包发送到广播地址(255.255.255.255)和多播地址(这包括第 2 层流量 FF:FF:FF:FF:FF:FF 等)。

这是一个很长的主题,不是特别容易,所以祝你好运!

更新-difference between TCP connection and TCP ping

这里的“TCP ping”只是向目标主机发送一个 TCP SYN 数据包。它只是运行 TCP 三次握手的第一部分,你可以在 Wikipedia 的 TCP 页面上看到这一点这里。防火墙可以过滤 TCP 连接,也就是说,它可能会看到 SYN 数据包通过,然后返回 SYN-ACK,然后在传递最终 ACK 之前对其进行过滤,以阻止 TCP 连接达到该CONNECTED状态。它正在跟踪 TCP 连接的状态。如果您自己发送 SYN 数据包,防火墙可能无法识别它。

TCP SYN 扫描,以及各种其他扫描技术可在维基百科页面找到这里维基百科页面对此的描述比我更简洁,因此我将直接引用:

SYN 扫描是 TCP 扫描的另一种形式。端口扫描器不使用操作系统的网络功能,而是自己生成原始 IP 数据包并监视响应。这种扫描类型也称为“半开扫描”,因为它实际上从未打开完整的 TCP 连接。端口扫描器生成 SYN 数据包。如果目标端口已打开,它将以 SYN-ACK 数据包进行响应。扫描器主机以 RST 数据包进行响应,在握手完成之前关闭连接。如果端口已关闭但未过滤,目标将立即以 RST 数据包进行响应。

相关内容