调试uip网络协议栈之-tun虚拟设备模拟IP数据包

来源:互联网 发布:hostease端口 编辑:程序博客网 时间:2024/05/16 08:20

背景:

开发0ip tcp/ip网络协议栈

开发过程中需要测试每个协议层的正确性,我先写了最简单的传输层协议UDP。手上没有方便使用的以太网设备做数据包收发,而TAP/TUN分别是可以模拟以太网数据(ETH层),网络层数据(IP层),一般用于类Unix系统中。正好虚拟机中装有Debian Linux系统,内核也有 /dev/net/tun 虚拟设备驱动。如果你的系统没有,那就得将TUN/TAP内核模块选上,重新编译内核。或者应该有什么办法直接 insmod 进去(没有实际操作过)。

正文:

参考 uip 协议栈,在网络协议栈对应的 ip 层,写一个 tun 应用,即虚拟一个 ip 层。然后用测试工具,ping 对应的 ip ,让 uip 协议栈去处理这个 ip 包,并再通过 tun 应用传到 ping 这段。由此完成一轮 app->ip->app层的测试。

uip是原作者亚当在十年前开发的,他使用的bsd系统,到linux系统上需要一些变动。我将此项目fork到自己的帐号上,方便学习之用。也好让大家参考参考。

编译后, sudo ./uip 启动 uip 协议栈。大家可以通过 ifconfig 命令查看虚拟出的网络接口 tun0 。

$ sudo ifconfig
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.0.1 P-t-P:192.168.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:4088 (3.9 KiB)

$ ping 192.168.0.2
— tun_dev: tundev_read: read 88 bytes
0 0 8 0 45 0 0 54 86 cf 40 0 40 1 32 86 c0 a8 0 1
— tun_dev: tundev_read: read 88 bytes
0 0 8 0 45 0 0 54 87 9b 40 0 40 1 31 ba c0 a8 0 1

原本是用 putty登录到虚拟机,发现启动 uip 后整个 puty 就接近崩溃了。关掉 putty 后,却再也登录不进去。直接操作虚拟机,启动不了 uip ,提示 bad file descriptor。可能是这个文件描述被占用。具体原因还不清楚。


1, Linux TUN/TAP
2, Tesing tun/tap interfaces

1 0