当前位置: 首页 > article >正文

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

9d3024ee69644c7ad5366d01d4b09b1c.png

确保系统安装gccmake工具后,编译所有的目标文件

make all

b66af8d0bb70165b68df91c28f8931ec.png

开启路由功能

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

b108a754a822e59ee1998dab49ecabe9.png

1.4运行tcp协议栈

./lvl-ip

1a08083dc8e28d401eed3cd87e4d4005.png

1.5 使用level-ip 创建自己的TCP client

不知道有没有注意到这句话“兼容Linux Socket API”。下面使用具体例子来理解。

level-ip-master/tools/

f1d0e325f79d633a9393e3d292ec6a23.png

在自己的工程中链接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 !!! ");}

71ac1e6b17fc9b4bb1527e7ee889caf7.png

到这里是有疑问的,socket接口是系统的,如何转到level-ip中的?

29a91170b7cc96634fdf1e128ac97c56.png

如果不运行level-ip,则会:

491a3b0badaa5e7a47a25fe6980b3739.png

这样,我们就可以debug Linux下的TCP/IP协议栈了。

欢迎关注:

Linux下tun/tap ping操作代码例子_3

Linux虚拟网卡设备tun/tap介绍_2

linux下安装tun模块详细教程


http://www.kler.cn/a/509506.html

相关文章:

  • idea 如何安装 github copilot
  • Sentinel配置流控规则详解
  • 哪些新兴技术对智能驾驶汽车影响最大?
  • linux手动安装mysql5.7
  • 使用 Docker 部署 Java 项目(通俗易懂)
  • 时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级
  • SSL配置实验
  • ChatGPT提示词合集(国内大模型可参考使用)
  • 深入了解计算机网络中的路由协议与性能优化
  • 【Python】分析JVM的GC日志
  • 前端小案例——网页井字棋
  • 基于Matlab驱动CAN接口设备进行通信
  • 小程序疫苗预约网站系统ssm+论文源码调试讲解
  • C语言(1)—基础概念的详解
  • python实现pdf转word和excel
  • Socket常见的通信方式
  • 基于大数据的气象数据分析与可视化系统设计与实现【爬虫海量数据,LSTM预测】
  • 深度学习 Pytorch 张量的线性代数运算
  • 《系统动力学模型构建与Vensim仿真》02-Vensim基本的功能和认识
  • Gradio Tunneling 支持固定域名啦
  • 软件包管理器 ---【linux基础开发工具】
  • 1.18学习记录
  • 【PyCharm】连接Jupyter Notebook
  • 电力场景输电线高压铁塔检测数据集VOC+YOLO格式1023张1类别
  • nginx常用配置 (含负载均衡、反向代理、限流、Gzip压缩、图片防盗链 等示例)
  • 掌握 React 高阶组件与高阶函数:构建可复用组件的新境界