单步执行TCP / IP堆栈

时间:2011-12-27 16:13:27

标签: debugging networking tcp-ip

我是一名专有嵌入式操作系统的QA工程师。他们建立了自己的ATN stack并且使用调试器踩踏它是我在网络方面最开眼界的体验。看着堆栈的每一层构建他们的数据包的一部分是惊人的。然后最终能够看到线上构建的数据包有更多的意义。

作为一名教育工作者,我想与他人分享这种经历。有谁知道通过TCP / IP堆栈踩一个直接的方法?理想情况下,我想比调试* BSD或Linux内核更容易,但如果这是唯一的选择,那么这个过程的一些提示和技巧会很好。用C / C ++编写的参考堆栈可以用Visual Studio或Eclipse在用户模式下运行,这是理想的。

8 个答案:

答案 0 :(得分:15)

这一切都取决于你想要关注的内容。根据您的问题,您最感兴趣的是整个不同层的数据流(用户空间流 - >电缆上的电压)。

为此,我建议您使用http://www.csse.uwa.edu.au/cnet/,这是一个完整的网络模拟器。它允许您逐步遍历堆栈的所有级别。

真实系统将始终明确区分Layer3,Layer2和Layer1(片上以太网和CRC校验固件,硬件MAC)。您将无法进入操作系统,并且一些实施细节将使学生感到混乱和困惑。对于Linux,您必须解释内核基础结构以理解TCP / IP堆栈设计。

如果您只对TCP / IP部分感兴趣,我建议您使用http://www.sics.se/~adam/lwip/之类的嵌入式TCP / IP堆栈。您可以将其合并到一个简单的用户空间程序中,并完全构造TCP / IP数据包。

请注意,在单步执行TCP / IP堆栈时,您无法解决许多网络通信问题。在它们之间仍然存在MAC芯片,其调节介质访问,冲突等。在此之下,存在将所有内容转换为电/光信号的PHY芯片,并且甚至存在处理MAC和PHY之间的通信的协议。此外,您没有看到与排队,并发,操作系统资源分配相关的所有方面。完整的图片应该包括所有这些方面,只能在网络模拟器中看到。

答案 1 :(得分:13)

我会在虚拟机中运行Minix并进行调试。这是完美的。

Minix是一个带有TCP / IP堆栈的完整操作系统,因此您可以获得所需的代码。然而,与Linux / BSD不同,它的根源和设计目标是成为一种教学工具,因此它避免了某种程度的复杂性,有利于明确。事实上,这是操作系统Linus Torvalds在开始使用Linux时开始入侵: - )

您可以在VirtualBox或VMware等虚拟机中运行minix并进行调试。网站上有说明:http://www.minix3.org/

答案 2 :(得分:11)

我个人使用DOS和SoftICE学习TCP / IP堆栈(哎呀,泄露我是一个老家伙)。在虚拟机上使用DOS并通过TCP / IP驱动程序进行调试将更加简单,因为您的目标是了解TCP / IP的工作原理。现代操作系统在网络I / O上进行了大量优化,并且调试起来并不容易。

http://www.crynwr.com/有一堆开源数据包驱动程序。使用源代码进行调试应该会更容易一些。

答案 3 :(得分:7)

这不完全是你想要的,但我希望这有帮助

1995 - TCP / IP Illustrated,第2卷:实施(与Gary R. Wright合作) - ISBN 0-201-63354-X

只需并排浏览代码即可。靠近经验。史蒂文先生也解释了关键变量。真棒。注意:自本书以来,代码可能已经发生了变化,但仍然很棒。

答案 4 :(得分:6)

您正在寻找lwIP project,因为它可能是run without an operating system

至于调试Linux内核,没有非常简单但众所周知的方法。使用KGDB。在虚拟机或单独的框中安装Linux内核的调试版本。并将GDB远程连接到此计算机。可能你想使用一些GDB前端而不是纯文本界面。如果您需要更多有能力的人员进行内核调试的更多细节,只需在问题中添加“linux”标签即可。

答案 5 :(得分:3)

我实际上在8051中写了一小部分TCP / IP堆栈,这是一次非常有启发性的经历。

我相信学习的最好方法就是做到这一点。完成任务后,请与其他开发人员一起获取反馈,并将您的实施与其他现有开发人员进行比较。

我的观点可能有偏见,但我认为在嵌入式平台上这样做是最好的方法。你要做的是非常低的水平,而PC只会增加问题的复杂性。嵌入式芯片没有操作系统可以妨碍您。除此之外,看到简单的8051响应ping请求和telnet呼叫是非常令人满意的。

他们的关键是从小做起,不要试图一次创建一个完整的TCP / IP堆栈。编写代码首先处理MAC,然后写入IP,Ping,UDP,最后是TCP。

我不认为研究现有的实施是一个很好的意识形态。使用与您的目标无关的代码,TCP / IP实现往往会膨胀。

答案 6 :(得分:1)

我在TCP / IP行业工作。在BSD和变体中,函数tcp_input()是探索TCP内部的理想起点。在这个函数上设置断点并在实时系统上单步执行可以给出很多启示。如果这很难,您只需浏览源代码即可获得广泛的感受:

http://fxr.watson.org/fxr/source/netinet/tcp_input.c

至少需要几周的时间来了解大局。相当令人振奋。 : - )

答案 7 :(得分:0)

您可以在Linux或其他操作系统的用户空间中运行NetBSD IP堆栈,使用gdb或其他任何内容http://www.netbsd.org/docs/rump/https://github.com/anttikantee/buildrump.sh,然后将其提供给tun / tap设备,以便查看最新信息在电线上。