如何测试用户空间tcp / ip stack?

时间:2014-06-21 06:29:17

标签: linux networking tcp tap tun

我正在处理用户空间tcp堆栈(主要是为了好玩)而且我在针对unix tcp堆栈测试时遇到了一些麻烦。目前,唯一的测试形式是通过单元测试完成的。但是,我想针对真正的内核tcp堆栈测试我的tcp堆栈。我尝试了以下设置但没有取得多大成功。

  • 使用原始套接字:我编写了一个简单的echo tcp服务器,它使用内核tcp套接字接受连接。 tcp服务器侦听localhost上的端口8080。我的tcp客户端使用用户空间tcp堆栈。但是,只要客户端向服务器发送syn,内核就会发送tcp rst。在修改iptable以丢弃所有tcp rst数据包后,它有点工作。但是,即使建立了3路syn,syn + ack,ack握手,服务器也无法收回客户端发送的任何数据包。我最终放弃了原始套接字。

  • 使用tun / tap:类似地,echo服务器使用内核tcp套接字并侦听localhost端口8080.客户端打开一个tap设备。 tap设备的ip为10.0.0.1,我的客户端假设ip为10.0.0.2。我可以从我的电脑ping 10.0.0.2。但是,当我的客户端通过tap设备向tcp服务器发送syn时,服务器不响应。

注意:我使用的是ubuntu 12.04。

1 个答案:

答案 0 :(得分:1)

您可以使用conntrack工具尝试获取有关使用原始套接字的原因的更多信息。如果由于某种原因内核对tcp连接的状态感到困惑,可能会决定重置它。您可以尝试通过在原始表中设置notrack规则来告诉内核不要跟踪连接来排除这种情况。像

这样的东西
iptables -t raw -A PREROUTING -p tcp --port 8080 -j NOTRACK

尝试在 tun / tap设备tcpdump计数上使用iptables来查看数据包被丢弃的位置。我也会试试tun设备,所以你只需要担心第3层。