如何在python tcp socket中获取IP ID,SEQ id,ACK id?

时间:2013-10-14 04:02:46

标签: python linux sockets tcp network-programming

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?我确信在内核的某个地方有一个可以暴露的inode表的seq / ack id。

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

1 个答案:

答案 0 :(得分:1)

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

您的选择是:

  • 修改内核以允许通过getsockopt()
  • 访问此内容
  • 使用在原始IP数据报之上实现的用户空间TCP库(可能是ioremap,但我从未使用过它)。
  • 找到一些方法来做你想要的,不用这个信息

我个人推荐最后一个。