Diferença entre o TCP ping e o Socket Connection

2

Eu escrevi um código de descoberta de rede para descobrir os dispositivos na rede. O código deve descobrir os dispositivos na rede mesmo se a resposta do eco icmp estiver desativada. Eu li sobre o tcp ping do nmap onde ele envia pacote TCP SYN e cria uma conexão meio aberta para o dispositivo remoto para verificar se ele é detectável. da função connect da biblioteca de soquetes do windows para verificar se o host é capaz de descobrir ou não, estabelecendo uma conexão de soquete na porta 80.

Desabilitei o ping em uma das máquinas de teste que executam o Windows 7 seguindo o link para verificar se a máquina é capaz de descobrir ou não, mas surpreendentemente a conexão do soquete falhou com o erro de conexão recusada. No entanto, nmap poderia descobrir o dispositivo através da opção TCP ping (que é através da porta padrão 80).

Então, minhas perguntas:

  1. Qual é a diferença exata entre os dois?

  2. Quais são outras formas alternativas de descobrir os dispositivos na rede.

Este é apenas um exemplo de código para estabelecer uma conexão de soquete.

  #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;
 } 
    
por Santhosh Pai 07.08.2013 / 11:39

1 resposta

4

Is what is the exact difference between both of them

Entre o que desculpe? Ping ICMP e ping TCP? - Bem, um usa o eco ICMP e responde a mensagens que eu acredito que você já sabe, o outro tenta jogar na negociação de um handshake TCP de 3 vias.

Se você quer dizer qual é a diferença entre o TCP Ping em seu código e o nmap, você teria que ler o código nmap para isso. Ou outra ideia seria executar algo como link veja o que o aplicativo envia abaixo da ligação e o que o nmap está enviando pelo fio, e comparar os resultados.

What are other alternate ways to discover the devices on the network.

Olhe através de todas as opções do nmap e leia alguns tutoriais nmap, existem algumas opções de descoberta diferentes (pesquisa sobre como eles funcionam). Um bom método é tentar se conectar à porta TCP 0 nas máquinas. Máquinas diferentes reagem de maneiras diferentes, já que esta é uma tomada inutilizável (reservada). Isso é freqüentemente usado na identificação do sistema operacional (alguns sistemas operacionais descartam o pacote, outros enviam RST de volta, etc., para que você possa adivinhar qual sistema operacional pode ser atribuído a esse IP).

Nenhum método é à prova de erros para a descoberta de hosts. Você pode configurar firewalls para reagir de várias maneiras (descartar pacotes de forma silenciosa, responder com um pacote RST , enviar pacotes proibidos de ICMP e assim por diante). Assim, considerando isso, a descoberta de hosts pode ser muito difícil quando há firewalls envolvidos. Se você estiver na mesma LAN que um host, poderá brincar com arpping , RARPs, etc, ARPs gratuitos, para tentar obter o MAC do host e, possivelmente, o IP. Isso pode funcionar mesmo se eles não responderem a pings, etc. Você também pode jogar com o envio de pacotes IP para um endereço de broadcast (255.255.255.255) e endereços multicast (isso inclui tráfego de camada 2 FF: FF: FF: FF: FF: FF etc).

É um assunto longo, que não é super fácil, então boa sorte!

UPDATE - difference between TCP connection and TCP ping

O "TCP ping" aqui é apenas enviar um pacote TCP SYN para o host de destino. Ele apenas executa a primeira parte do handshake TCP 3, você pode ver isso na página da Wikipédia para TCP aqui . Uma conexão TCP pode ser filtrada por um firewall, ou seja, um pacote SYN pode ser acessado, um SYN-ACK retornado e, em seguida, antes do ACK final ser filtrado, para impedir que uma conexão TCP atinja o estado CONNECTED . Ele está rastreando o estado das conexões TCP. Se você enviar um pacote SYN por conta própria, um firewall pode não reconhecer isso.

O TCP SYN, e várias outras técnicas de varredura são encontradas na página da Wikipédia aqui . A página do Wiki descreve de forma mais sucinta do que eu, então vou citar isso diretamente:

SYN scan is another form of TCP scanning. Rather than use the operating system's network functions, the port scanner generates raw IP packets itself, and monitors for responses. This scan type is also known as "half-open scanning", because it never actually opens a full TCP connection. The port scanner generates a SYN packet. If the target port is open, it will respond with a SYN-ACK packet. The scanner host responds with a RST packet, closing the connection before the handshake is completed. If the port is closed but unfiltered, the target will instantly respond with a RST packet.

    
por 07.08.2013 / 12:29