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



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.1rnrn')
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 下,当然有根。

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

您的选择是:

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

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

最新更新