Đếm truyền lại TCP trong pyshark


10

Theo như tôi biết thì pyshark là một trình bao bọc Python cho tshark, đây là phiên bản dòng lệnh của Wireshark. Vì Wireshark và tshark cho phép phát hiện truyền lại TCP, tôi đã tự hỏi làm thế nào tôi có thể sử dụng pyshark. Tôi không tìm thấy bất kỳ tài liệu tốt nào vì vậy tôi không chắc liệu bạn không thể làm điều đó hay tôi chỉ không thể tìm ra cách phù hợp. Cảm ơn bạn!


Bằng cách "phát hiện truyền TCP", bạn có nghĩa là chỉ xem liệu gói TCP có được nhìn thấy không? Hoặc bạn có nghĩa là một cái gì đó cụ thể hơn như TCP, nhưng đối với các máy chủ / bài đăng từ xa cụ thể?
Ross Jacobs

Kiến thức của tôi về hệ thống viễn thông là một chút gỉ. Tôi muốn phát hiện (hoặc ước tính) số lượng gói bị mất theo cả hai hướng đi và đến. Điều đó có làm rõ không?
dùng1315621

2
Bạn có thể sử dụng bộ lọc hiển thị tcp.analysis.retransmission, có thể được sử dụng với cả Wireshark và PyShark. Không thành công, bạn có thể muốn đặt câu hỏi của mình (với nhiều ngữ cảnh hơn) trên Diễn đàn của Wireshark nếu bạn muốn trợ giúp tận dụng Wireshark hoặc Server Fault nếu bạn muốn giúp theo dõi tổn thất.
Ross Jacobs

Tôi nghĩ rằng tcp.analysis.retransmission có thể sẽ hoạt động tốt. Nhưng bạn có thể cung cấp cho tôi một ví dụ trong PyShark về cách sử dụng nó không?
dùng1315621

Bài viết này về tương tác với Wireshark bằng Pyshark là về câu hỏi gần nhất tôi có thể tìm thấy cho câu hỏi của bạn.
Linny

Câu trả lời:


5

Mã dưới đây phát hiện truyền lại TCP trong 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)

Nó sẽ hiển thị điều này trong các gói:

# 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

Nếu bạn bao gồm only_summaries = True trong LiveCapture, bạn sẽ thấy một cái gì đó như thế này:

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

Bạn cũng có thể lọc các gói này cụ thể hơn bằng cách áp dụng bpf_filter trong LiveCapture để lọc truyền lại 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)

Đây là một cách để đọc một pcap với 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: **********

Cảm ơn bạn! Tôi đang đọc tệp PCAP vì vậy với mã của bạn, tôi nên đọc nó hai lần: lần đầu tiên để xử lý các gói được truyền lại và lần thứ hai để xử lý tất cả các gói khác. Có một giải pháp?
dùng1315621

Tôi đã cập nhật mã để đọc tệp pcap và lọc truyền lại.
Cuộc sống phức tạp

Vấn đề là nếu tôi in tất cả các gói (không có bất kỳ bộ lọc nào khi đọc), tôi có thể tìm thấy một số gói được truyền lại bằng cách in các gói. Chẳng hạn, pack.summary_line, trả về "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [Truyền lại TCP] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH, ACK] Seq = 1 Ack = 1 Win = 16383 Len = 21 ". Do đó, tôi cho rằng nên có một thuộc tính của gói cho biết rằng đó là một sự truyền lại có thể.
dùng1315621

Pcap của tôi có những cái này dưới TCP Phân tích cờ. Bạn đang sử dụng ví dụ mã của tôi để truy vấn tệp của bạn?
Cuộc sống phức tạp

1
@ user1315621 - Nếu bản chụp của bạn rất quan trọng đối với câu hỏi, bạn nên chỉnh sửa bài đăng của mình để bao gồm một liên kết đến bản chụp và sửa đổi câu hỏi của bạn. Nếu không, tôi sẽ đánh dấu câu trả lời này là được chấp nhận vì nó trả lời câu hỏi hiện đang được đăng .
Ross Jacobs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.