gpt4 book ai didi

linux - 如何测试用户空间的 tcp/ip 堆栈?

转载 作者:可可西里 更新时间:2023-11-01 02:51:59 26 4
gpt4 key购买 nike

我正在研究用户空间的 tcp 堆栈(主要是为了好玩),但我在针对 unix tcp 堆栈进行测试时遇到了一些问题。目前唯一的测试形式是通过单元测试完成的。但是,我想针对真实的内核 tcp 堆栈测试我的 tcp 堆栈。我尝试了以下设置但没有成功。

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

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

注意:我使用的是 ubuntu 12.04。

最佳答案

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

iptables -t raw -A PREROUTING -p tcp --port 8080 -j NOTRACK

尝试在tun/tap 设备 上使用tcpdumpiptables 计数以查看包被丢弃的位置。我也会尝试使用 tun 设备,这样您只需担心第 3 层。

关于linux - 如何测试用户空间的 tcp/ip 堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24338985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com