Diretório de artigos
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/IP
a 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.
-
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(); } }
-
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
-
Inicie o Wireshark com privilégios de administrador
-
Selecione a interface da placa de rede correspondente
-
filtro aberto
-
Inicie o servidor, inicie o cliente e envie olá
-
pacotes filtrados
3. Análise
3.1 cabeçalho TCP
O cabeçalho TCP fica assim:
3.2 Análise do Combate Real
-
Porta de origem e porta de destino, cada uma ocupando 2 bytes
-
Número de série, ocupando 4 bytes
-
Número de confirmação, ocupando 4 bytes
-
Deslocamento de dados, ocupando 4 bits, meio byte
-
Reservado, 6 dígitos
-
Bit de controle de sinalizador: URG/ACK/PSH/RST/SYN/FIN, ocupando 6 bits
-
janela, ocupando 2 bytes
-
soma de verificação, 2 bytes
-
Ponteiro urgente, ocupando 2 bytes
-
Opção, o número de bytes não é fixo, o seguinte é 12 bytes
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
-
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
-
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
-
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
O processo acima pode ser resumido da seguinte forma, no exemplo acima x é realmente 0x4cf2bfaa, y é realmente 0x890b1b78
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.
-
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
-
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.
-
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
-
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)
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
referência
- Rede de Computadores (6ª Edição, editado por Xie Xiren)
- Modelo OSI de sete camadas
- Especificação da camada de transferência do protocolo TCP
- Handshake de três vias e onda de quatro vias do TCP