【发布时间】: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