3

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 中并发发送相同的请求,您无法分辨哪个捕获的数据包属于哪个,因为元组 (srcip, srcport, dstip, dstport, proto_num) 都是相同的。

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

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

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

4

1 回答 1

1

内部 TCP 状态通常对应用程序不可用。

您的选择是:

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

就个人而言,我推荐最后一个。

于 2015-04-25T12:43:36.810 回答