Linux下level-ip安装及测试_4
先说下总体的思路——搞一个方便调试的tcp/ip协议栈,level-ip。再划分具体的操作,可以不用系统的socket的接口进行tcp通讯,如今,这个目标终于初步实现了。需要的一个组件是tun/tap,将虚拟出来的设备与实际网卡进行数据转发,这样用户态协议栈通过tun0进行中转,更多内容需要自己探索!
测试环境:VMWare虚拟机ubuntu16.04(需支持tun/tap),Windows TCP Server调试助手
1.Ubuntu16.04下安装level-ip
1.1level-ip简介
1.1.1 Level-IP是一款运行在Linux用户空间的TCP协议栈,它有以下特点
独立运行,与应用程序完全隔离
使用Linux虚拟网卡实现通信
兼容Linux Socket API
为其他应用程序,提供网路链接服务
1.1.2大家要注意的是,该tcp协议栈并不完美,目前它只实现了以下功能:
ARP请求、回复、缓存
ICMP ping和回复
IPv4数据包处理,校验和
TCPv4握手
TCP数据传输
TCP分段重组
超时重传和RTT估计
1.1.3以下功能还有待完善:
ip分片重组
滑动窗口
糊涂窗口与避免
零窗口探针
拥塞控制
select套接字
1.2使用Level-IP
1.2.1 安装
获取Level-IP源码
git clone https://github.com/EmbedHacker/level-ip
安装libcap-dev工具,以修改可执行程序的权限
sudo apt install libcab-dev(git上错误的)
sudo apt install libcap-dev
确保系统安装gcc、make工具后,编译所有的目标文件
make all
开启路由功能
sudo sysctl -w net.ipv4.ip_forward=1
接受虚拟网卡的输入信息
sudo iptables -I INPUT --source 10.0.0.0/24 -j ACCEPT
伪装物理网卡的ip,注意enp0s3为物理网卡,
用户应根据ifconfig命令的查询结果修改
sudo iptables -t nat -I POSTROUTING --out-interface enp0s3 -j MASQUERADE
设置物理网卡数据转发给虚拟网卡,注意修改物理网卡!!
sudo iptables -I FORWARD --in-interface enp0s3 --out-interface tap0 -j ACCEPT
设置虚拟网卡数据转发给物理网卡,注意修改物理网卡!!
sudo iptables -I FORWARD --in-interface tap0 --out-interface enp0s3 -j ACCEPT
1.3添加虚拟设备
tun网卡处于三层没有mac地址
添加名称为tun0网卡:
ip tuntap add tun0 mode tun
tap网卡处于二层有mac地址
添加名称为tap0网卡:
ip tuntap add tap0 mode tap
1.4运行tcp协议栈
./lvl-ip
1.5 使用level-ip 创建自己的TCP client
不知道有没有注意到这句话“兼容Linux Socket API”。下面使用具体例子来理解。
在level-ip-master/tools/下
在自己的工程中链接liblevelip.so
// 定义sockaddr_instruct sockaddr_in skaddr_in; skaddr_in.sin_family= AF_INET;skaddr_in.sin_port =htons(2048);skaddr_in.sin_addr.s_addr = inet_addr("192.168.99.1");struct sockaddr *addr = (sockaddr *)&skaddr_in;sock = socket(AF_INET, SOCK_STREAM, 0);if (connect(sock, addr, 16) == -1) {perror("CLient could not establish connection");return 1; }std::cout << "tcp_v4_connect!" <<ret <<std::endl;char str[]="hello";int len = strlen(str);if (write(sock, str, len) != len) {printf("Write error\n");return 1;}else{printf("success !!! ");}
到这里是有疑问的,socket接口是系统的,如何转到level-ip中的?
如果不运行level-ip,则会:
这样,我们就可以debug Linux下的TCP/IP协议栈了。
欢迎关注:
Linux下tun/tap ping操作代码例子_3
Linux虚拟网卡设备tun/tap介绍_2
linux下安装tun模块详细教程