Contando a retransmissão TCP no pyshark

10

Até onde eu sei, o pyshark é um wrapper Python para o tshark, que é a versão de linha de comando do Wireshark. Como o Wireshark e o tshark permitem detectar a retransmissão TCP, fiquei pensando como poderia fazê-lo usando o pyshark. Não encontrei uma boa documentação, portanto, não tenho certeza se você não pode simplesmente fazer isso ou se não consigo encontrar o caminho correto. Obrigado!

user1315621
fonte
Por "detectar transmissão TCP", você quer apenas ver se um pacote TCP é visto? Ou você quer dizer algo mais específico como o TCP, mas para hosts / posts remotos específicos?
Ross Jacobs
Meu conhecimento dos sistemas de telecomunicações está um pouco enferrujado. Gostaria de detectar (ou estimar) o número de pacotes perdidos nas direções de saída e de entrada. Isso esclarece?
user1315621
2
Você pode usar o filtro de exibição tcp.analysis.retransmission, que pode ser usado com o Wireshark e o PyShark. Caso contrário, você pode fazer sua pergunta (com mais contexto) no Fórum do Wireshark, se desejar ajuda para alavancar o Wireshark ou a Falha do servidor, se desejar ajudar a rastrear a perda.
101319 Ross Jacobs
Eu acho que tcp.analysis.retransmission provavelmente funcionaria bem. Mas você pode me fornecer um exemplo no PyShark sobre como usá-lo?
user1315621
Este artigo sobre como interagir com o Wireshark usando o Pyshark é o mais próximo que pude encontrar da sua pergunta.
Linny

Respostas:

5

O código abaixo detecta retransmissões TCP no pyshark

import pyshark

###################################################
# these filters can be applied under LiveCapture
# display_filter: A display (wireshark) filter to apply on the cap before reading it.
# display_filter='tcp.analysis.fast_retransmission'
# display_filter='tcp.analysis.retransmission'
###################################################
capture = pyshark.LiveCapture(interface='en1', display_filter='tcp.analysis.fast_retransmission')
capture.sniff(timeout=50)

for packet in capture.sniff_continuously(packet_count=5):
  print ('Just arrived:', packet)

Ele deve exibir isso nos pacotes:

# display_filter='tcp.analysis.retransmission'
TCP Analysis Flags
Expert Info (Note/Sequence): This frame is a (suspected) retransmission
This frame is a (suspected) retransmission

# display_filter='tcp.analysis.fast_retransmission'
TCP Analysis Flags
This frame is a (suspected) fast retransmission
This frame is a (suspected) retransmission
Expert Info (Note/Sequence): This frame is a (suspected) fast retransmission
Expert Info (Note/Sequence): This frame is a (suspected) retransmission

Se você incluir o only_summaries = True no LiveCapture , verá algo assim:

Just arrived: 223 71.890878 fe80::cabc:c8ff:feec:d46d fe80::1416:1ca1:307c:b0e6 TCP 86 [TCP Spurious Retransmission] 59005 \xe2\x86\x92 49373 [FIN, ACK] Seq=1855 Ack=2365 Win=4096 Len=0 TSval=930665353 TSecr=692710576

Just arrived: 371 121.293913 fe80::1416:1ca1:307c:b0e6 fe80::cabc:c8ff:feec:d46d TCP 98 [TCP Retransmission] 62078 \xe2\x86\x92 59012 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1440 WS=64 TSval=692717653 TSecr=930714614 SACK_PERM=1

Você também pode filtrar esses pacotes mais especificamente aplicando o bpf_filter no LiveCapture para filtrar a retransmissão TCP.

import pyshark

capture = pyshark.LiveCapture(interface='en1', bpf_filter='ip and tcp port 443', display_filter='tcp.analysis.retransmission')
capture.sniff(timeout=50)

for packet in capture.sniff_continuously(packet_count=5):
  print ('Just arrived:', packet)

Aqui está uma maneira de ler um pcap com o pyshark:

capture = pyshark.FileCapture('test.pcap', display_filter='tcp.analysis.retransmission')
counter = 0
for packet in capture:
  counter +=1
  print ('*' * 10, f'Retransmission packet {counter}:', '*' * 10)
  # output 
  ********** Retransmission packet 1: **********
  ********** Retransmission packet 2: **********
  ********** Retransmission packet 3: **********
  ********** Retransmission packet 4: **********
  ********** Retransmission packet 5: **********
A vida é complexa
fonte
Obrigado! Estou lendo um arquivo PCAP, portanto, com seu código, devo lê-lo duas vezes: a primeira vez para processar os pacotes retransmitidos e a segunda para processar todos os outros pacotes. Há uma solução?
user1315621
Atualizei o código para ler um arquivo pcap e filtrar as retransmissões.
vida é complexa
O fato é que, se eu imprimir todos os pacotes (sem filtro ao ler), posso encontrar alguns pacotes retransmitidos imprimindo-os. Por exemplo, packet.summary_line, retorna "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [Retransmissão TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Confirmação = 1 vitória = 16383 Len = 21 ". Portanto, suponho que deva haver um atributo do pacote que diga que é uma possível retransmissão.
user1315621
Meu pcap possui estes em Sinalizadores de Análise TCP. Você está usando meu exemplo de código para consultar seu arquivo?
vida é complexa
11
@ user1315621 - Se sua captura for crítica para a pergunta, edite sua postagem para incluir um link para a captura e modifique sua pergunta. Caso contrário, eu marcaria esta resposta como aceita, porque responde à pergunta que está atualmente publicada .
Ross Jacobs