【问题标题】:how to get IP ID, SEQ id, ACK id in python tcp socket?如何在 python tcp 套接字中获取 IP ID、SEQ id、ACK id?
【发布时间】:2013-10-21 14:42:39
【问题描述】:

Linux 中的 Python 套接字(bsd 套接字)

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('www.google.com', 80))
s.send('GET / HTTP/1.1\r\n\r\n')
s.recv(1024)

是否可以获得当前s对象的IP ID、SEQ id、ACK id?

  • 最好不要过多地篡改普通的 tcp 套接字内部结构。
  • 最好是实时跟踪。
  • 用原始数据包替换正常的 AF_INE/SOCK_STREAM 效率低下,因为您必须在用户空间中重新实现整个 TCP 堆栈。
  • 问题的目的是我正在添加诊断代码,将附加到现有项目,他们广泛使用普通 TCP 套接字。
  • 我尝试使用AF_PACKET 来捕获原始传入和传出数据包,但感觉非常难看。
  • 此外,如果多线程套接字在 TCP 中同时发送 same 请求,您无法分辨哪个捕获的数据包属于哪个,因为元组(srcip、srcport、dstip、dstport、 proto_num) 都是一样的。

另一种提问方式是如何在 Linux 上将数据包流元组(srcip、srcport、dstip、dstport、proto_num)标记为 inode/fd?

这可能吗?也许使用netlink?我确信内核某处的 inode 表有一个 seq/ack id 可能会被暴露。

在 Ubuntu 12.04 LTS + python 2.7 下当然是 root。

【问题讨论】:

  • 我相信您可以使用此处找到的 dpkg 库访问此信息:code.google.com/p/dpkt 不过我还没有深入研究这个 :)
  • @JamesMills 这需要你构建原始数据包,这与广泛使用普通套接字的现有代码不兼容。
  • (我没试过)——但是你不能从普通的 python 袜子中获取原始套接字数据并用 dpkt 解析它们吗?我记得这个类别中的另一个有用的库,但我这辈子都不记得叫什么了!
  • 我找到了! secdev.org/projects/scapy——我记得这在澳大利亚供应商的一些防火墙/监控应用程序中被广泛使用。你可能对这个库有更好的运气;)
  • @JamesMills Scapy 擅长制作数据包,而不是从现有数据包中提取信息。给定原始数据包流,例如对 ("google.com", 80) 的并发 100 次请求,您无法分辨哪个是哪个,因为 (srcaddr, srcport, dstaddr, dstport, proto_num) 都是一样的。

标签: python linux sockets tcp network-programming


【解决方案1】:

内部 TCP 状态通常可供应用程序使用。

您的选择是:

  • 修改内核以允许通过getsockopt()访问它
  • 使用在原始 IP 数据报之上实现的用户空间 TCP 库(也许 ioremap 虽然我从未使用过)
  • 找到一些方法来做你想做的事没有这些信息

我个人推荐最后一个。

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 2016-12-13
    • 1970-01-01
    • 2021-11-22
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多