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
?我确信在内核的某个地方有一个 seq/ack id 到 inode 表,它可能会被暴露。
在 Ubuntu 12.04 LTS + python 2.7 下当然是 root。