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,尽管我从未使用过它)
- 找到一些方法在没有这些信息的情况下做你想做的事情
就个人而言,我推荐最后一个。