关于用户态 TCP/IP 协议栈的一个项目研究

——TCP/IP协议栈开源项目level-ip在ubuntu12.04运行

很久之前的工作中研究过arm 平台下的linux 网络驱动,结合外围电路以及网络芯片的datasheet理清了一个网络驱动的架构以及实现接口,至于到达网卡的数据包如何传递给linux应用层也有一点涉猎,阅读过 《追踪linux TCP/IP 代码运行 ——基于2.6内核》 秦建著,但关于linux 内核态的tcp/ip协议栈 的源码颇为庞大,读懂以及读透彻需要花费不少时间,闲暇时断断续续翻翻书本以及源码,工作中使用一些 socket 接口,具备进行应用层网络编程的知识,对tcp/ip相关知识也有所了解,使用过wireshark以及tcpdump等抓包工具诊断过工作出现的关于网络通信相关问题,但始终对于 tcp/ip 协议栈的实现缺乏全面系统的了解。
这次在网上查阅相关 tcp/ip 协议栈知识,发现了不少关于在用户态实现的tcp/ip协议栈的开源项目,而且源码不像内核那样庞大,于是就准备开始从应用层实现的tcp/ip栈项目入手。
先附上项目介绍出处:自己动手写一个小型的TCP/IP协议
https://blog.csdn.net/clrmas/article/details/52843350
按照连接博客关于项目的介绍很详细,个人觉得很有研究价值,附上源码地址 https://github.com/jeremy505/level-ip

关于此项目运行平台信息如下:
X86
ubuntu 12.04 (运行与虚拟机中)
kernel版本3.2.79
gcc-5.4

创建tcp-ip目录。使用 git clone下载源码(也可以下载源码包后解压)
git clone https://github.com/jeremy505/level-ip.git
关于用户态 TCP/IP 协议栈的一个项目研究
可以看到以及下载了完整源码包,接下进行编译安装步骤。
项目附带有相关文档说明,源码编译过程中遇到了几个问题,下面给出解决方案。

1.make all 出现如下错误
关于用户态 TCP/IP 协议栈的一个项目研究
借助网络的力量,以下链接给出解决方案:
https://blog.csdn.net/buyicn/article/details/80635762
安装 libcap-dev——sudo apt-get install libcap-dev
2.低版本 gcc (4.8)可能会出现如下错误,如gcc4.6版本编译(5.4版本不存在问题):
关于用户态 TCP/IP 协议栈的一个项目研究
查看 socket.h 第49行:
关于用户态 TCP/IP 协议栈的一个项目研究
并无语法错误,但是 变量addr 前面被 restrict 修饰 ,这个东西我还是第一次看到,猜测可能是关键字抑或有其他特出意义,网上给出的定义如下:
restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。
现在来去掉报错信息,修改 Makefile ,加上 -std=c99
关于用户态 TCP/IP 协议栈的一个项目研究

再次编译,又出现错误
关于用户态 TCP/IP 协议栈的一个项目研究

include/socket.h:70:5: error: unknown type name ‘pthread_rwlock_t’
pthread_rwlock_t 是线程读写锁类型,被修饰的是一个线程锁,用来锁定被频繁读取而很少修改的资源,本人在实际工作中很少用到这个,基本上用的比较多的是互斥锁,这次也可以趁机研究一下线程读写锁的用法。
查看源码,确实没有定义,这个时候就要考虑系统的头文件是否包含此类型定义, 使用
命令 grep -rn “pthread_rwlock_t” /usr/include/
输出很多信息,最后定位到
/usr/include/i386-linux-gnu/bits/pthreadtypes.h:139:} pthread_rwlock_t;

关于用户态 TCP/IP 协议栈的一个项目研究

可以发现 存在 pthread_rwlock_t定义,那么为什么编译又会找不到呢?
注意到 这个结构体定义前面有
(#if define __USER_UNIX98 || define __USE_OPEN2K)
定义
(#endif)

网上解决方案 在编译时加上编译选项:
-D_XOPEN_SOURCE=500 或 -D_GNU_SOURCE 即可解决
修改 Makefile ,加上 -D_GNU_SOURCE

关于用户态 TCP/IP 协议栈的一个项目研究

最后编译通过!

3.具体用法以及源码分析待研究一段时间之后再写。。。