pysharkでのTCP再送信のカウント


10

私の知る限り、pysharkはWiresharkのコマンドラインバージョンであるtsharkのPythonラッパーです。WiresharkとtsharkはTCPの再送信を検出できるので、pysharkを使用してそれを行うにはどうすればよいか疑問に思っていました。良いドキュメントが見つからないので、それができないのか、適切な方法が見つからないのかはわかりません。ありがとうございました!


「TCP送信を検出する」とは、TCPパケットがまったく表示されていないかどうかを確認することですか?それとも、TCPのようなより具体的なものを意味しますが、特定のリモートホスト/ポストを意味しますか?
ロスジェイコブス

通信システムに関する私の知識は、少しさびしいです。発信方向と着信方向の両方で失われたパケットの数を検出(または推定)したいと思います。それは明確ですか?
user1315621

2
tcp.analysis.retransmissionWiresharkとPySharkの両方で使用できるディスプレイフィルターを使用できます。それが失敗した場合、Wiresharkまたはサーバー障害の活用を支援したい場合、Wiresharkのフォーラムで質問を(より多くのコンテキストで)質問して、損失の追跡を支援することができます。
ロスジェイコブス

tcp.analysis.retransmissionはおそらく正常に動作すると思います。しかし、PySharkでの使用例を教えていただけますか?
user1315621

Pysharkを使用したWiresharkの操作に関するこの記事は、あなたの質問に最も近いものを見つけることができます。
Linny、

回答:


5

以下のコードはpysharkでの TCP再送信を検出します

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)

これはパケットでこれを表示するはずです:

# 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

only_summaries = TrueLiveCaptureに含めると、次のようになります。

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

また、LiveCapturebpf_filterを適用して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)

pysharkでpcapを読み取る方法の1つは次のとおりです。

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: **********

ありがとうございました!私はPCAPファイルを読み取っているので、コードを使用して2回読み取る必要があります。1回目は再送信されたパケットを処理し、2回目は他のすべてのパケットを処理します。解決策はありますか?
user1315621

コードを更新してpcapファイルを読み取り、再送信をフィルタリングしました。
人生は複雑

問題は、すべてのパケットを(読み取り時にフィルターなしで)印刷すると、パケットを印刷することによって再送信されたパケットを見つけることができるということです。たとえば、packet.summary_lineは "2 4.1e-05 175.45.176.3 149.171.126.16 TCP 77 [TCP Retransmission] 22592 \\ xe2 \\ x86 \\ x92 143 [PSH、ACK] Seq = 1 Ack = 1 Win =を返します16383 Len = 21 "。したがって、再送信の可能性があることを通知するパケットの属性があるはずです。
user1315621

私のpcapには、TCP分析フラグの下にこれらがあります。私のコード例を使用してファイルをクエリしていますか?
人生は複雑

1
@ user1315621-キャプチャが質問にとって重要である場合、キャプチャへのリンクを含めるように投稿を編集し、質問を変更する必要があります。それ以外の場合は、現在投稿されている質問に回答するためこの回答を承認済みとしてマークします。
ロスジェイコブス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.