【问题标题】:tshark do not assembly TCP fragments into large packetstshark 不会将 TCP 碎片组装成大数据包
【发布时间】:2020-05-18 10:45:29
【问题描述】:

我有一个带有一些网络流量的简单 pcap,并且正在使用 tshark 从中获取一些标头信息:

我使用以下命令:

tshark -r ./capture-1-5 -Y "http2" -o tls.keylog_file:ssl-key.log \
-T fields -e frame.number -e _ws.col.Time -e ip.src -e tcp.srcport \
-e ip.dst  -e tcp.dstport -e _ws.col.Protocol -e frame.len \
-e _ws.col.Info -E header=y -E separator="," -E quote=d \ 
-E occurrence=f > desegmented.csv

我意识到,在这种情况下,所有片段都被重新组装,从而产生了巨大的数据包。但是,我不想要重新组装的数据包。所以,我给 tshark 添加了一个额外的选项:

tshark -r ./capture-1-5 -Y "http2" -o tls.keylog_file:ssl-key.log \ 
-T fields -e frame.number -e _ws.col.Time -e ip.src -e tcp.srcport \
-e ip.dst -e tcp.dstport -e _ws.col.Protocol -e frame.len \
-e _ws.col.Info -E header=y -E separator="," -E quote=d \
-E occurrence=f -o tcp.desegment_tcp_streams:FALSE > segmented.csv

我的直觉是,生成的disassembled.csv 文件应该更大,并且应该包含更多行,因为“MTU 之上的数据包”将显示为多个数据包。

但是,我观察到相反的情况。没有汇编的结果文件更小,行数几乎减半。

-rw-r--r-- 1 root root 210K May 18 18:21 desegmented.csv
-rw-r--r-- 1 root root  97K May 18 18:21 segmented.csv

# cat desegmented.csv |wc -l
2635
# cat segmented.csv |wc -l
1233

这是正常行为吗?由于双向通信(到处丢失数据包),我没有看到(手动)数据包开始消失的位置(以及为什么)或看到任何模式。 我假设可能,在 disassebmled.csv 的情况下,导致至少一个数据包高于 MTU 的每个数据包甚至整个数据包流都被完全丢弃。

我也尝试应用 ip.defragment:FALSE 但结果仍然相同。 谢谢

如需复制,可从here下载文件

【问题讨论】:

  • 同时,我已经确定了数百个 TCP 和 TLS 数据包,它们的有效负载值为“重组 PDU 的 TCP/TLS 段”,这些数据包肯定已从 disassembled.csv 中删除。然后,查看disassembled.csv 中的数据包大小,我发现大多数具有 4 位数大小的数据包也丢失了(约 200 个数据包)。尽管如此,我还是有很多丢失的数据包:S
  • 我或许可以提供帮助,但您需要提供问题中的文件(pcap/log 文件),以便其他人可以复制此文件(即MCVE)。您可能会遇到 tshark 行为,其中它会将有关数据的信息喷射到文本数据输出中。
  • 添加到正文中,谢谢。
  • 我手边没有使用 TLS 构建的 tshark 版本,因此无法复制。但是,请注意捕获中没有 IP 分段(如果 ip.flags.mf == 1 || ip.frag_offset > 0,则帧是 IP 分段,您可以在 wireshark 的过滤器中键入)。你的协议栈是 http2/TLS/TCP/IP/Ethernet II。您看到的“碎片”是 TLS 记录被拆分为多个 TCP 帧。为了解码 TLS 并查看 http2,您需要重新组装 TCP 段。如果不这样做,您将只能解码适合单个帧的 TLS 记录。

标签: csv tcp tls1.2 tshark


【解决方案1】:

谢谢@JimD。我已经得出了类似的结论! 数据包捕获本身必须被分段才能精确地做到这一点。

所以,试着往下一层,让数据包捕获本身被分段

ethtool -K eth0 gso off tso off gro off sg off tx off rx off

(只是为了确保)。

问题是数据包捕获是在 docker 容器中完成的,所以在多个地方,我必须发出这个命令才能完全工作。 这些地方包括容器内的docker0桥、eth0和主机上对应的vethXXXXXX,其中第二个需要特权容器,这会带来更多问题:)

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 2010-10-02
    • 2020-06-06
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2021-09-28
    相关资源
    最近更新 更多