逐步通过TCP / IP协议栈

我当时是一名专有embedded式操作系统的QA工程师。 他们build立了自己的ATN协议栈 ,然后通过debugging器进行debugging,这是我与networking开发人员最开放的经验。 看着堆栈的每一层build立他们的包的一部分是惊人的。 然后最后能够看到在电线上build立的数据包有更多的意义。

作为一名教育工作者,我想与其他人分享这个经验。 有谁知道一个简单的方法,通过TCP / IP协议栈吗? 理想情况下,我希望比debugging一个* BSD或Linux内核容易一些,但如果这是唯一的select,那么这个过程的一些技巧和窍门将是很好的。 用C / C ++编写的可以在用户模式下用Visual Studio或Eclipse运行的参考栈是理想的。

这一切都取决于你想要关注什么。 从你的问题来看,你最感兴趣的是不同层次的数据stream(用户空间stream – >电缆上的电压)。

为此,我build议您使用http://www.csse.uwa.edu.au/cnet/ ,这是一个完整的networking模拟器。 它可以让你跨越堆栈的各个层面。

真正的系统将始终在Layer3,Layer2和Layer1(以太网和CRC校验固件,硬件MAC)之间有明确的区别。 您将无法进入操作系统,一些实施细节将混乱和混乱的学生。 对于Linux,您必须说明内核基础结构,以了解TCP / IP堆栈devise。

如果您只对TCP / IP部分感兴趣,我build议您使用像http://www.sics.se/~adam/lwip/这样的embedded式TCP / IP协议栈。 您可以将其纳入一个简单的用户空间程序,并完全构buildTCP / IP数据包。

请注意,在进行TCP / IP协议栈时,有许多networking通信方面无法解决。 在它之间还有一个MAC芯片,用于调节介质访问,碰撞等等。在这之下,有一个PHY芯片可以把所有东西都转换成电/光信号,甚至还有一个处理MAC和PHY通信的协议。 此外,您没有看到与排队,并发,操作系统资源分配相关的所有方面。 一张完整的图片应该包括所有这些方面,只能在networking模拟器中看到。

我会在虚拟机中运行Minix并debugging它。 这是完美的。

Minix是一个完整的操作系统与TCP / IP协议栈,所以你有你需要的代码。 然而,与Linux / BSD不同,它的根源和devise目标是成为一种教学工具,所以它避开了一定程度的复杂性而偏爱清晰。 事实上,这就是Linus Torvalds在开始使用Linux的时候开始黑客攻击:-)

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

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

http://www.crynwr.com/有一堆开源的包驱动程序。; 使用源代码进行debugging应该更容易一些。

这不正是你正在寻找,但我希望这可以帮助

1995年 – TCP / IP画报,第2卷:实施(与加里·赖特) – 国际标准书号0-201-63354-X

只是并排浏览代码。 接近逐步的经验。 史蒂芬先生也解释了关键变数。 真棒。 注意:自从本书后,代码可能已经改变,但仍然很棒。

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

至于debuggingLinux内核,并不是很简单,而是众所周知的做法。 使用KGDB 。 在虚拟机或单独的盒子上安装Linux内核的debugging版本。 并将GDB远程连接到本机。 可能你想使用一些GDB前端而不是纯文本接口。 如果您需要更多有能力的人的内核debugging的更多细节,只需在问题中添加“linux”标签即可。

实际上我曾经在8051中写过一个TCP / IP协议栈的一个小子集,这是一个非常有启发性的经验。

我相信学习的最好方法就是这样做。 一旦你完成你的任务,去与其他开发人员反馈,并与其他现有的实施进行比较。

我的意见可能会有所偏差,但我认为在embedded式平台上这样做是最好的select。 你试图做的是非常低的水平,而个人电脑只会给问题增加更多的复杂性。 embedded式芯片没有任何操作系统妨碍您的工作。 除此之外,看到一个简单的8051响应ping请求和telnet调用是非常令人满意的。

他们的关键是从小处着手,不要一下子创build一个完整的TCP / IP协议栈。 编写代码先处理MAC,然后是IP,Ping,UDP,最后是TCP。

我不认为研究现有的实施是一个好的理想。 TCP / IP实现往往会与您的目标无关的代码臃肿。

我在TCP / IP行业工作。 在BSD和变种中,函数tcp_input()是探索TCP内部的理想起点。 在这个函数上设置一个断点并在一个实时系统上进行切换可以给你很多启发。 如果这很难,你可以简单地浏览源代码,以获得广泛的感受:

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

至less要花几个星期的时间才能理解大局。 相当令人振奋。 🙂

您可以在Linux或其他操作系统的用户空间中运行NetBSD IP堆栈,使用gdb或其他任何方法,请参阅http://www.netbsd.org/docs/rump/和https://github.com/anttikantee/buildrump.sh ,然后例如将其馈送到tun / tap设备,以便您可以看到线路上有什么。