【问题标题】:TCP packet segment pythonTCP数据包段python
【发布时间】:2013-11-25 14:19:46
【问题描述】:

我正在处理 TCP 数据包。此应用程序充当嗅探器并构建 SIP 数据包。一些 TCP SIP 数据包碎片化,因此我需要重新组装它们。

我所做的是最初我使用以下方式处理第一个 TCP 连接:

packet = s.recvfrom(sipLocatorConfig.NETWORK_MAX_SIZE)

之后我获得数据,然后如果碎片化我得到其余的但使用.recv:

socket.recv(sipLocatorConfig.NETWORK_TCP_MAX_SIZE)

当我获得第二个片段时,我在使用.recv时得到了乱码,我假设是ETH,IP,TCP信息:

M*?
M*?@{
QyE

如何删除此 ETH、IP 和 TCP 标头信息并仅从数据包中提取数据? 谢谢

【问题讨论】:

  • 旁注:你应该用十六进制打印你的garbeldy gook。对数据包数据使用binascii.hexlify。
  • 如果您知道它们占用了多少字节,您可以从数据中跳过该字节数。
  • 由于我能使用该模块,现在我可以看到在HEX ETH,IP和TCP报头信息,0a4d2ac000030a4d2acf407b0800 4500033017bd40004006a9e8ac1f2e380c478f84 81b013c4c30e71fbc8d7d65b8018073c794500000101080a09e2e0c893db873e,从使用.recv接收的分组如何删除ETH,IP和TCP信息功能?类似这样的东西:binarytides.com/python-packet-sniffer-code-linux
  • 字节可能因不同的数据包而异。
  • 我能够通过将 socket.recv() 处理为字符串来获取有效负载数据。 socket.recvfrom() 返回一个元组。因此,我刚刚评论了 packet=packet[0] 行,现在可以完美运行。

标签: python sockets tcp


【解决方案1】:

您可以将数据包解析为:

  • 前 14 个字节是以太网标头
  • 接下来的 20 个字节可能是 ip header
  • 类似地,从 ip 头中,我们可以提取我们正在使用的协议和 终于看到了从中解析数据的协议参考

例如。 TCP 连接数据包为:eth_header+IP_header+TCP_Header+payload(data) 每个标头都有其特定的长度,从标头中提取信息需要您在 python 中使用结构模块(请参阅 struct.unpack("",""))。提取标头信息还需要了解标头的结构。最后可以计算出payload的位置,最后提取出来。

具体而言,请参阅此link 了解更多信息。希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2018-10-17
    • 2020-06-10
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多