TCP ping和Socket连接的区别

我写了一个networking发现代码来发现networking上的设备。即使icmp回应响应被禁用,代码也应该发现networking上的设备。 我从nmap里读到了关于tcp ping的地方,它发送了TCP SYN数据包,并且创build了一个到远程设备的半开放连接来检查它是否是可发现的。在代码中,我使用了来自windows套接字库的connect函数来检查主机是否通过在端口80上build立一个套接字连接发现是否能够。

我禁用ping的运行Windows 7的testing机器之一,通过链接来检查机器是否发现,但令人惊讶的套接字连接也失败,连接拒绝错误。 但是, nmap可以通过TCP ping选项(通过默认端口80)来发现设备。

所以我的问题:

  1. 他们之间的确切区别是什么?

  2. 还有什么其他的方式来发现networking上的设备。

这只是一个build立套接字连接的示例代码。

  #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; } 

  • 升级到千兆位 - 值得吗?
  • build立一个Officenetworking
  • ping和tracert有什么区别?
  • Windows 7 Pro上的同一networking连接速度较快,Windows 2000服务器上的连接速度较慢
  • 如何设置开发,分期,生产和质量保证环境
  • ISP级代理
  • One Solution collect form web for “TCP ping和Socket连接的区别”

    两者之间有什么确切的区别?

    在什么对不起? ICMP ping和TCP ping? – 那么一个人使用我相信你已经知道的ICMP回显和回复消息,另一个尝试在3路TCP握手的谈判中发挥作用。

    如果你的意思是你的代码和nmap中的TCP Ping有什么区别,你必须阅读nmap代码。 或者另一个想法是运行诸如http://www.wireshark.org/的东西来看看你的应用程序发送什么线,以及nmap发送什么线,并比较结果&#x3002;

    还有什么其他的方式来发现networking上的设备。

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

    没有办法是愚蠢的,但主机发现。 您可以configuration防火墙以各种方式作出反应(静默丢弃数据包,响应RST数据包,发送禁止ICMP的数据包等)。 所以考虑到这一点,涉及防火墙的主机发现可能会非常困难。 如果你和主机在同一个局域网上,你可以使用arpping ,RARP等免费ARP来尝试获取主机的MAC地址,甚至IP地址。 即使他们不响应ping等,也可以工作。您还可以发送IP数据包到广播地址(255.255.255.255)和多播地址(包括第2层stream量FF:FF:FF:FF:FF: FF等)。

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

    更新difference between TCP connection and TCP ping

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

    TCP SYN扫描和其他各种扫描技术可以在这里的 Wikipedia页面find 。 维基页面比我更简洁地描述它,所以我会直接引用:

    SYN扫描是TCP扫描的另一种forms。 端口扫描器不是使用操作系统的networkingfunction,而是自己生成原始IP数据包,并监视响应。 这种扫描types也被称为“半开放扫描”,因为它实际上从来没有打开完整的TCP连接。 端口扫描器生成一个SYN数据包。 如果目标端口是打开的,它将用一个SYN-ACK数据包进行响应。 扫描器主机响应一个RST数据包,在握手完成之前closures连接。 如果端口closures但未经过滤,则目标将立即以RST包进行响应。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.