Use o WireShark para capturar pacotes e analisar o protocolo TCP_IP

prefácio

O protocolo TCP/IP é um conjunto de protocolos usados ​​para comunicação na Internet. Consiste em dois protocolos principais: Transmission Control Protocol ( TCP ) e Internet Protocol ( IP ). O protocolo TCP/IP é um dos protocolos mais comumente usados ​​na Internet, que permite que diferentes tipos de computadores e dispositivos de rede se comuniquem entre si.

  • O TCP é responsável por dividir os dados em pacotes e garantir sua entrega na rede.
  • O IP é responsável por rotear pacotes do endereço de origem para o endereço de destino.

No livro Computer Network (editado por Xie Xiren), as camadas envolvidas na transmissão da rede TCP/IP e o significado de cada bit são apresentados em detalhes. Neste artigo, usaremos o Wireshark para capturar pacotes e analisar o protocolo TCP/IP, e usaremos a prática para verificar a teoria.


  • O Wireshark é um analisador de protocolo de rede que pode ajudá-lo a capturar e analisar pacotes de rede. É um software de código aberto que pode ser executado em vários sistemas operacionais .
  • A versão mais recente do Wireshark pode ser baixada em https://www.wireshark.org .

1. Protocolo TCP/IP

1.1 Camadas OSI

OSI é a abreviação de OSI/RM (Open Systems Interconnection Reference Model), que foi formulado pela ISO em 1983 e formou um documento formal.

OSI Layering é um modelo de arquitetura de rede que divide a comunicação de rede em sete camadas distintas. Cada nível tem seus próprios recursos e tarefas. A seguir, uma breve introdução a cada nível, de cima para baixo:

número de série nível nome
1 camada de aplicação Responsável por fornecer vários aplicativos, como e-mail, transferência de arquivos e login remoto.
2 camada de apresentação Responsável por converter dados em um formato que os aplicativos possam entender, define como trocar dados entre diferentes sistemas.
3 camada de sessão Responsável por estabelecer, gerenciar e encerrar sessões, define como uma conexão é estabelecida entre dois nós.
4 camada de transporte Responsável por dividir os dados em pacotes e garantir sua transmissão na rede. Ele também fornece um serviço de transporte confiável de ponta a ponta.
5 Camada de rede Responsável por rotear pacotes de dados dos endereços de origem aos endereços de destino, define como transmitir pacotes de dados entre diferentes redes.
6 camada de enlace de dados Responsável pela transmissão de pacotes de um nó para outro, define como os pacotes são transmitidos no meio físico.
7 camada física Responsável pela transferência de dados de um nó para outro, define as especificações das interfaces elétrica, óptica e mecânica.

Embora o padrão tenha sido estabelecido, devido a alguns defeitos, a maior Internet que cobre o mundo hoje não usa o padrão OSI, mas usa o padrão TCP/IP.

1.2 Camadas TCP/IP

Comparado com o modelo OSI de 7 camadas, o protocolo TCP/IP possui apenas 4 camadas, que mescla algumas camadas.

De um modo geral, o protocolo TCP/IP refere-se ao cluster de protocolo TCP/IP, que pode ser dividido nas seguintes partes de acordo com as camadas

nível nome do protocolo
camada de aplicação HTTP, FTP, SMTP, POP3, IMAP, Telnet, SSH, DNS
camada de transporte TCP、UDP
Camada de rede IP、ICMP、ARP、RARP
camada de interface de rede Ethernet, Token Ring, FDDI, PPP

O WireShark usado para captura de pacotes abaixo usa o padrão TCP/IP.

2. Capturar pacotes

2.1 Código do soquete

Use Java para escrever códigos de servidor e cliente e realize a comunicação entre os dois chamando a API Socket.

Socket é um soquete, que é uma camada intermediária de abstração de software para comunicação entre a camada de aplicativo e TCP/IPa família de protocolos. É representado como uma interface de programação (API) que encapsula o cluster de protocolo TCP/IP. ServerSocket usa o protocolo TCP. Se você quiser usar o protocolo UDP, você pode usar DatagramSocket.

O WireShark precisa ser iniciado com privilégios de administrador. Por padrão, ele não pode visualizar o loopback que não usa a placa de rede e precisa do próximo npcap.

  1. servidor.java

    public class Server {
          
          
        public static void main(String[] args) throws IOException {
          
          
            ServerSocket server = new ServerSocket(10007);
            System.out.println("服务器已启动,等待客户端连接...");
            Socket socket = server.accept();
            System.out.println("客户端已连接!");
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str = br.readLine();
            System.out.println("客户端说:" + str);
            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            pw.println("欢迎您!");
            pw.flush();
            socket.close();
        }
    }
    
  2. Cliente.java

    public class Client {
          
          
        public static void main(String[] args) throws IOException, InterruptedException {
          
          
            Socket socket = new Socket("localhost", 10007);
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = br.readLine();
            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            pw.println(str);
            pw.flush();
            BufferedReader br2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str2 = br2.readLine();
            System.out.println("服务器说:" + str2);
            socket.close();
        }
    }
    

2.2 Pacote de filtro

  1. Inicie o Wireshark com privilégios de administrador

  2. Selecione a interface da placa de rede correspondente
    loopback.png

  3. filtro aberto

    tcp_10007.png

  4. Inicie o servidor, inicie o cliente e envie olá

  5. pacotes filtrados

    tcp_10007_after.png

3. Análise

3.1 cabeçalho TCP

O cabeçalho TCP fica assim:

3.2 Análise do Combate Real

  1. Porta de origem e porta de destino, cada uma ocupando 2 bytes

    tcp_ip_01.png

  2. Número de série, ocupando 4 bytes

    tcp_ip_02.png

  3. Número de confirmação, ocupando 4 bytes

    tcp_ip_03.png

  4. Deslocamento de dados, ocupando 4 bits, meio byte

    tcp_ip_04_data offset.png

  5. Reservado, 6 dígitos

    tcp_ip_05_reservado.png

  6. Bit de controle de sinalizador: URG/ACK/PSH/RST/SYN/FIN, ocupando 6 bits

    tcp_ip_06_flag bit.png

  7. janela, ocupando 2 bytes

    tcp_ip_07_window.png

  8. soma de verificação, 2 bytes

    tcp_ip_08_checksum.png

  9. Ponteiro urgente, ocupando 2 bytes

    tcp_ip_09_emergency pointer.png

  10. Opção, o número de bytes não é fixo, o seguinte é 12 bytes

    tcp_ip_10_options.png

3.3 Aperto de mão triplo

Os três primeiros pacotes do estabelecimento da conexão TCP são os três pacotes do handshake. A seguir, analisaremos o processo específico do handshake de três vias a partir da teoria combinada com a captura real do pacote

  1. Cliente envia para servidor

    Quando o cliente estabelece uma conexão TCP, ele habilitará um número de série aleatório e armazenará seu valor no campo de número de série do cabeçalho TCP do primeiro segmento de mensagem trocado entre si e o valor do campo de número de série do segmento de mensagem TCP subseqüente será incrementado sequencialmente

    No processo de captura de pacotes a seguir, pode-se descobrir que 0x4cf2bfaa é o número de sequência aleatória do primeiro pacote e o wireshark marcou o número de sequência relativo Seq como 0, que é o primeiro pacote.

    Além disso, o cliente TCP precisa definir SYN como 1 ao enviar, e o cliente entra no estado SYN-SENT neste momento

    tcp_ip_11_estabelecer conexão.png

  2. Servidor envia para cliente

    Depois de receber a mensagem, o servidor concorda em estabelecer uma conexão e enviar uma mensagem de confirmação para o cliente. Esta mensagem precisa definir SYN e ACK como 1, confirmar o seq+1 enviado e habilitar um número de sequência aleatória para si mesmo, na mensagem, pode-se descobrir que o número de sequência aleatória é 0x890b1b78 e o servidor entra no estado SYN-RCVD neste momento

    tcp_ip_11_estabelecer conexão 2.png

  3. Cliente envia para servidor

    Após o cliente receber, ele precisa confirmar e enviar a mensagem novamente, desta vez, a mensagem define o ACK como 1, o número de série como seu próprio número de série + 1 = 0x4cf2bfab e o ACK como o número de série enviado pelo server + 1 = 0x890b1b79. Ao ser enviado, entrará no estado ESTABLISHED, e o servidor também entrará no estado ESTABLISHED após recebê-lo

    tcp_ip_11_estabelecer conexão 3.png

O processo acima pode ser resumido da seguinte forma, no exemplo acima x é realmente 0x4cf2bfaa, y é realmente 0x890b1b78

客户端 服务器 CLOSED CLOSED LISTEN 发送SYN=1,seq=x SYN-SENT 返回SYN=1,ACK=1,seq=y,ack=x+1 SYN-RCVD 回复ACK=1,seq=x+1,ack=y+1 ESTABLISHED ESTABLISHED 客户端 服务器 TCP三次握手

3.4 Quatro ondas

O diagrama que pode ser obtido na página 226 do livro é o seguinte:

Tanto o servidor quanto o cliente que estabeleceram a conexão podem liberar a conexão. Ambas as partes precisam acenar com as mãos quatro vezes. O código java acima é considerado o servidor que libera a conexão primeiro.

  1. O servidor envia uma mensagem FIN

    Envie FIN=1, ACK=1, seq=u (a captura do pacote u é, na verdade, 0x91dd5af1 desta vez).

    Está registrado no livro que u é o número de série do último byte dos dados enviados anteriormente mais 1. Isso não está claro e o ACK real também é definido como 1. É necessário? estudo de acompanhamento

    conexão tcp_ip_12_release 1.png

  2. O cliente envia ACK=1, seq=v (o seq real desta captura de pacote é 0x6a067550) e o ACK é u+1 (a captura de pacote real é 0x91dd5af2 desta vez)

    v é o número de sequência do último byte dos dados enviados anteriormente mais 1.

    conexão tcp_ip_12_release 2.png

  3. O cliente então envia FIN=1, ACK=1, seq=w (desta vez o pacote capturado é realmente 0x6a067550), ack=u+1 (desta vez o pacote capturado é realmente 0x91dd5af2)

    O w aqui realmente captura o pacote e descobre que w é o mesmo que v

    conexão tcp_ip_12_release 3.png

  4. O servidor envia ACK=1, seq=u+1 (desta vez o pacote capturado é realmente 0x91dd5af2), ack=w+1 (desta vez o pacote capturado é realmente 0x6a067551)

    conexão tcp_ip_12_release 4.png

O processo acima pode ser resumido da seguinte forma: como tanto o cliente quanto o servidor podem enviar pacotes FIN para liberar a conexão, o gráfico a seguir libera a conexão do cliente

客户端 服务器 ESTABLISHED ESTABLISHED 发送FIN=1,seq=u FIN-WAIT-1 返回 ACK=1,seq=v,ack=u+1 FIN-WAIT-2 CLOSE-WAIT 返回 FIN=1,ACK=1,seq=w,ack=u+1 LAST-ACK 回复ACK=1,seq=u+1,ack=w+1 CLOSED TIME-WAIT 等待2MSL后,CLOSED 客户端 服务器 TCP四次挥手

referência

  1. Rede de Computadores (6ª Edição, editado por Xie Xiren)
  2. Modelo OSI de sete camadas
  3. Especificação da camada de transferência do protocolo TCP
  4. Handshake de três vias e onda de quatro vias do TCP

Acho que você gosta

Origin blog.csdn.net/qq_23091073/article/details/130382623
Recomendado
Clasificación