36

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

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

4

8 回答 8

15

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

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

真实系统在 Layer3、Layer2 和 Layer1(以太网和 CRC 校验片上固件、硬件 MAC)之间总是有明显的区别。您将无法进入操作系统,并且一些实现细节会让学生感到混乱和困惑。对于 Linux,您必须解释内核基础结构才能理解 TCP/IP 堆栈设计。

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

请注意,在单步执行 TCP/IP 堆栈时,您无法解决许多网络通信方面的问题。中间还有一个 MAC 芯片,用于管理介质访问、冲突等。在此之下,有一个 PHY 芯片,可以将所有内容转换为电/光信号,甚至还有一个协议来处理 MAC 和 PHY 之间的通信。此外,您没有看到与排队、并发、操作系统资源分配 ea 相关的所有方面。一张全貌应该包括所有这些方面,这些方面只能在网络模拟器中看到。

于 2012-01-05T13:19:53.987 回答
13

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

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

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

于 2012-01-03T08:23:25.187 回答
11

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

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

于 2011-12-29T18:36:23.957 回答
7

这不完全是您正在寻找的,但我希望这会有所帮助

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

只需并排浏览代码即可。几乎步入经验。史蒂文先生也解释了关键变量。太棒了。注意:代码可能在本书之后发生了变化,但仍然很棒。

于 2012-01-04T01:11:19.460 回答
6

可能lwIP 项目是您正在寻找的,因为它可以在没有操作系统的情况下运行

至于调试 Linux 内核,没有很简单但众所周知的方法。使用KGDB。在虚拟机或单独的机器上安装调试版本的 Linux 内核。并将 GDB 远程连接到这台机器。可能您想使用一些 GDB 前端而不是纯文本界面。如果您需要更多有能力的人提供有关内核调试的详细信息,只需在问题中添加“linux”标签即可。

于 2011-12-30T16:57:07.827 回答
3

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

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

我的观点在这里可能有偏见,但我认为在嵌入式平台中执行此操作是最好的方法。您正在尝试做的事情非常低级,而 PC 只会增加问题的复杂性。嵌入式芯片没有操作系统可以妨碍您。除此之外,很高兴看到一个简单的 8051 响应 ping 请求和 telnet 调用。

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

我不认为研究现有的实现是一个好主意。TCP/IP 实现往往会因与您的目标无关的代码而变得臃肿。

于 2012-01-05T18:27:32.347 回答
1

我在 TCP/IP 行业工作。在 BSD 和变体中,函数 tcp_input() 是探索 TCP 内部结构的理想起点。在这个函数上设置断点,在一个活的系统上单步执行,可以给很多启示。如果这很难,您可以简单地浏览源代码以大致了解它:

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

了解大局需要时间,至少要好几个星期。相当令人振奋。:-)

于 2012-01-18T20:31:42.467 回答
0

您可以在 Linux 或其他操作系统的用户空间中运行 NetBSD IP 堆栈,使用 gdb 或任何查看http://www.netbsd.org/docs/rump/https://github.com/anttikantee/buildrump.sh然后例如,将其馈送到 tun/tap 设备,这样您就可以看到电线上的内容。

于 2013-11-01T11:20:47.930 回答