如何在Python TCP套接字中获取IP ID、SEQ ID和ACK ID?

3

Python在Linux中的套接字(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_INET/SOCK_STREAM 是低效的,因为你必须在用户空间重新实现整个 TCP 栈。
  • 问题的目的是我正在添加诊断代码,将附加到现有项目上,他们广泛使用普通的 TCP 套接字。
  • 我尝试使用 AF_PACKET 捕获原始的传入和传出数据包,但感觉非常丑陋。
  • 此外,如果多线程套接字同时在 TCP 中发送相同的请求,则无法确定哪个捕获的数据包属于哪个套接字,因为元组(srcip、srcport、dstip、dstport、proto_num)都是相同的。

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

这种可能吗?也许可以使用 netlink?我确信内核中有一个序列/确认 ID 到 inode 表,可以被暴露出来。

在 Ubuntu 12.04 LTS + Python 2.7 下,需要以 root 身份运行。


我相信你可以使用在这里找到的dpkg库来访问这些信息:https://code.google.com/p/dpkt/ 不过我还没有深入研究 :) - James Mills
(我没有尝试过)- 但是你不能从普通的Python套接字中获取原始套接字数据并使用dpkt解析吗?我记得在这个类别中还有另一个有用的库,但是我死活想不起来它叫什么了! - James Mills
我找到了!http://www.secdev.org/projects/scapy/ -- 我记得这个库被一家澳大利亚供应商广泛用于一些防火墙/监控设备中。你可能会更幸运地使用这个库 ;) - James Mills
@JamesMills Scapy擅长制作数据包,但不擅长从现有数据包中提取信息。给定原始数据包流,例如对(“google.com”,80)的并发100x请求,您无法区分哪个是哪个,因为(srcaddr,srcport,dstaddr,dstport,proto_num)都是相同的。 - est
@JamesMills 的意思是,你能否将数据包流中的元组(srcaddr、srcport、dstaddr、dstport、proto_num)标记为 fd/inode? - est
显示剩余10条评论
1个回答

1

通常情况下,应用程序无法获得内部TCP状态信息。

您的选择是:

  • 修改内核以通过getsockopt()访问此信息
  • 使用基于原始IP数据报的用户空间TCP库进行实现(也许ioremap,但我从未使用过)
  • 找到一种不需要此信息就可以完成您想要的操作

个人建议选择最后一种。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接