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 身份运行。