在linux平台上做,发包利用rawsocket,收包用libipq(见www.netfilter.org)。之所以不用rawsocket收包,是因为rawsocket在接收非icmp的报文时,对该报文进行了复制,也就是说如果是TCP报文的话,除了 rawsocket可以得到它,内核的tcp协议栈也能得到它,这样tcp协议栈会发出一些我们不想看到的rst报文。你得到它了吗?;)
这个小小的实现目前只能完成建立连接,断开连接、收发报文等功能,流量控制、拥塞控制都没有做。不过用来模拟各种TCP状态机的异常情况,发送病态报文,已经足够了。
为了使得模拟异常情况的代码容易编写,该实现在每个事件点(如收到报文、发送报文、超时)调用回调函数。也就是说模拟异常情况的代码只需要写回调函数并将其注册在合适的事件点上就可以了。在回调函数里可以修改TCP状态,修改报文或者干脆不让该报文被发送或接收。
没有评论:
发表评论