Contando la retransmisión TCP en pyshark


10

Hasta donde sé, pyshark es un envoltorio de Python para tshark, que es la versión de línea de comandos de Wireshark. Como Wireshark y tshark permiten detectar la retransmisión de TCP, me preguntaba cómo podría hacerlo usando pyshark. No he encontrado ninguna buena documentación, así que no estoy seguro de si no puedes hacer eso, o si no puedo encontrar la forma correcta. ¡Gracias!


Por "detectar transmisión TCP", ¿quiere decir simplemente si se ve un paquete TCP? ¿O quieres decir algo más específico como TCP, pero para hosts / posts remotos específicos?
Ross Jacobs

Mi conocimiento de los sistemas de telecomunicaciones está un poco oxidado. Me gustaría detectar (o estimar) la cantidad de paquetes perdidos en las direcciones salientes y entrantes. ¿Eso aclara?
user1315621

2
Puede usar el filtro de pantalla tcp.analysis.retransmission, que se puede usar tanto con Wireshark como con PyShark. De lo contrario, es posible que desee hacer su pregunta (con más contexto) en el Foro de Wireshark si desea ayuda para aprovechar Wireshark o Server Fault si desea ayuda para localizar la pérdida.
Ross Jacobs

Creo que tcp.analysis.retransmission probablemente funcionaría bien. Pero, ¿puedes darme un ejemplo en PyShark sobre cómo usarlo?
user1315621

Este artículo sobre cómo interactuar con Wireshark usando Pyshark es lo más cerca que pude encontrar a su pregunta.
Linny

Respuestas:


5

El siguiente código detecta retransmisiones TCP en 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)

Debería mostrar esto en los paquetes:

# 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

Si incluye only_summaries = True en LiveCapture , verá algo como esto:

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

También puede filtrar estos paquetes más específicamente aplicando el bpf_filter en LiveCapture para filtrar la retransmisión 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)

Aquí hay una forma de leer un pcap con 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: **********

¡Gracias! Estoy leyendo un archivo PCAP, así que con su código, debería leerlo dos veces: la primera vez para procesar los paquetes retransmitidos y la segunda vez para procesar todos los demás paquetes. ¿Hay alguna solución?
user1315621

Actualicé el código para leer un archivo pcap y filtrar las retransmisiones.
vida es compleja el

La cuestión es que si imprimo todos los paquetes (sin ningún filtro al leer), puedo encontrar algunos paquetes retransmitidos imprimiendo los paquetes. Por ejemplo, packet.summary_line, devuelve "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [retransmisión TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = 16383 Len = 21 ". Por lo tanto, supongo que debería haber un atributo del paquete que indique que es una posible retransmisión.
user1315621

Mi pcap los tiene bajo TCP Analysis Flags. ¿Está utilizando mi código de ejemplo para consultar su archivo?
vida es compleja el

1
@ user1315621 - Si su captura es crítica para la pregunta, debe editar su publicación para incluir un enlace a la captura y modificar su pregunta. De lo contrario, marcaría esta respuesta como aceptada porque responde a la pregunta que se publica actualmente .
Ross Jacobs
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.