1 解决问题

对于服务器而言,正常的接受一帧Data的过程,客户端先通过网络发送一帧数据到网卡,再经过协议栈,最后通过系统调用叨叨应用程序。具体的流程图如下:

针对上面的两个流程,涉及到两次拷贝(网卡拷贝到协议栈,协议栈拷贝到应用程序),所以就产生了用户态协议栈,将协议栈网络解析作为应用程序的一部分。

2 用户态协议栈原理

1 定义组成图
用户态协议栈主要是用来减少拷贝。采用通过网卡的nmap,DMA方式,将网卡映射到内存中,底层采用DMA直接通道。应用程序直接去内存中取。DMA无copy,copy赋值是要通过cpu指令操作,而此DMA不需要cpu,而是自己操作的,零拷贝

2 nmap原理
对于磁盘文件,网卡,蓝牙都是可以直接采用mmap映射到内存中。DMA方式避开了cpu,但是需要一条总线底层提供,映射完后,数据传输完成到内存后,给cpu触发一个中断通知cpu。
3 网卡的原理
网卡的作用是将光电信息转数字信号或者数字信号转光电信息(DA转换或AD转换).网卡驱动不是运行再网卡上,而是运行再内核上,使网卡正常工作。

3 协议帧头含义

我们能娶到一帧完整的数据方案?
常见的三种方案:1 raw socket(原生socket) 2 开源框架(netmap) 3 商业框架dpdk
目前主要分析netmap开源组件。目前主要采用udp来处理,写demo相对来说简单。

1 以太网帧头

对于以太网协议注意点 Mac地址,网卡上的Mac地址可修改,对于网络中的Mac地址,IP地址,端口,再计算机无对应的固件,都只是在协议栈上只是一个字段名字而已 。数据传输的最大字节数是1500字节。
以太网协议是针对数据链路层

// 以太网的帧头
struct ethhdr {unsigned char dst[ETH_LEN]; // 目的地址unsigned char src[ETH_LEN]; // 源地址unsigned short proto;   //      类型
};

2 IP帧头

对于IP协议是再网络层传输;
比较需要注意点: 1 4位版本号就是对应我们常说的ipv4或ipv6;
2 而对于ip包的大小主要分为两块一个头大小,数据大小16位(总共就是65535字节 64KB;
而对于传输到以太网数据链路层时候只有1500字节,所以会分成很多个MTU传输发送。
3 TTL:IP包生存时间。例如ping www.baidu.com. 每经过一个网关-1,比如达到某个网关等于0时候,就原路返回目标不可达。
对于以太网帧中有proto类型,而ip帧头中也有proto,用来判断上一层是采用什么协议传输的

struct iphdr{unsigned char version:4,//版本号hdrlen:4; // 首部长度unsigned char tos;      // 服务类型 unsigned short totlen;  // 总长度  一次性65535 64kunsigned short id; // 每个数据包都有一个id,tcp中也有一个seq num,与此无关unsigned short flag:3,offset:13;unsigned char ttl;//生存时间    unsigned char proto;// unsigned short check; //校验unsigned int sip;unsigned int dip;
};

3 udp帧头

udp对于包没有一个固定的id序号,所以再udp发送的时候,再协议上无法实现对包的定义,无边界。
MAC地址是以太网产物
IP地址是网络层产物
端口是传输层产物

struct udphdr{ // 帧头unsigned short sport;unsigned short dport;unsigned short length;unsigned short check;
}

4 常见的物理硬件
对于日常中的常见的硬件再那一层。
NAT:网络地址映射,将port和ip作为映射时候,工作再传输层
路由器:网络层
交换机:二层交换机只适合再局域网内,需要跨网络,则需要引入三层交换机或者路由器。
负载均衡:常见的产品有nginx(应用层,对http协议解析),haproxy(对tcp端口,传输层),LVS(对ip地址,网络层),F5(以太网Mac地址,再数据链路层)

5 ARP协议帧
局域网内全部机器进行广播,具体原理:
1 例如一台机器广播我是192.168.2.4(1~255之间),你的Mac地址是多少,
2 其它机器接受到广播的ARP协议,就会返回我是192.168.2.6某某,我的Mac地址是多少;
3 主动广播的机器收到返回协议响应,再本地简历一张ARP表(主要保存IP地址和Mac地址等
查看ARP表:ARP -a

struct arphdr {unsigned short h_type;unsigned short h_proto;unsigned char h_addrlen;unsigned char protolen;unsigned short oper;unsigned char smac[ETH_ALEN];unsigned int sip;unsigned char dmac[ETH_ALEN];unsigned int dip;
};

6 ICMP协议帧

struct icmphdr {unsigned char type;unsigned char code;unsigned short check;unsigned short identifier;unsigned short seq;unsigned char data[32];
};

用户态协议栈之tcp/ip设计相关推荐

  1. 【Linux服务器开发系列】手写用户态协议栈,udpipeth数据包的封装,零拷贝的实现,柔性数组

    视频教你手写网络协议栈,保证大家能学会,耐心看 1. 用户态协议栈 2. udp/ip/eth数据包的封装 3. 零拷贝的实现 4. 零长数组(柔性数组) [Linux服务器开发系列]手写用户态协议栈 ...

  2. 用户态协议栈tcp/ip设计

    1 解决问题 对于服务器而言,正常的接受一帧Data的过程,客户端先通过网络发送一帧数据到网卡,再经过协议栈,最后通过系统调用叨叨应用程序.具体的流程图如下: 针对上面的两个流程,涉及到两次拷贝(网卡 ...

  3. Linux网络设计之用户态协议栈与dpdk

    用户态协议栈设计与dpdk dpdk环境开启 Windowe下配置静态IP表 DPDK API介绍 struct rte_memzone结构体 struct rte_mempool结构体 struct ...

  4. 用户态协议栈设计实现

    目录 1. 网络模式 2. 获取原始数据 3. UDP数据帧格式 以太网协议头(数据链路层) -- 14byte IP数据头(网络层) -- 20byte UDP协议的数据格式(传输层) -- 8by ...

  5. 一文彻底掌握用户态协议栈,一看就懂的

    用户态协议栈 那我们先跟大家解释这个协议栈这个东西啊协议栈这个东西呢或多或少啊各个朋友应该都听过,我们站在一个设计者的角度,站在一个设计者的角度,站在tcpip的个人的角度,我们怎么去设计这个协议的? ...

  6. 架构决定可扩展性--聊聊用户态协议栈的意义

    在进入这个话题之前先说说通用和专业之间的区别.   举个很好的例子,好比我们个人,绝大部分的人都是"通用"的,而只有极少部分的人是"专业"的.通用的人主要目标是 ...

  7. 深入浅出用户态协议栈

    一.前言 在讲网络协议栈前,先理解一个数据包在网络传输是一个怎么样的流程,如下图所示. 正常的流程是网卡接收到数据后,把数据copy到协议栈(sk_buff),协议栈把sk_buff数据解析完后再把数 ...

  8. 【高阶知识】用户态协议栈之Epoll实现原理

    Epoll 是 Linux IO 多路复用的管理机制.作为现在 Linux 平台高性能网络 IO 必要的组件.内核的实现可以参照:fs/eventpoll.c . 为什么需要自己实现 epoll 呢? ...

  9. 100行源代码搞定用户态协议栈丨udp,icmp,arp协议的现实丨网络协议栈丨Linux服务器开发丨C++后端开发丨Linux后台开发

    100行源代码搞定用户态协议栈 视频讲解如下,点击观看: 100行源代码搞定用户态协议栈丨udp,icmp,arp协议的现实丨网络协议栈丨Linux服务器开发丨C++后端开发丨Linux后台开发丨网络 ...

最新文章

  1. 吴恩达深度学习笔记(114)-RNN梯度消失问题详解
  2. HashMap底层原理分析(put、get方法)
  3. 毫末智行 Fluid 实践:云原生 AI 让汽车变得“更聪明”
  4. Django model 字段类型及选项解析(一)
  5. 学习Spring Boot:(一)入门
  6. C++推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
  7. 不能断点调试python_为Python调试构建一个不间断的断点
  8. 搞懂 mismatch dep signature
  9. java把按钮和键盘对应_按键与按钮的区别?
  10. Python学习教程(Python学习路线):Python3你还未get到的隐藏技能
  11. java利用poi导出数据到excel
  12. 实践两个servlet小项目
  13. 从零基础入门Tensorflow2.0 ----三、11. tf.GradientTape与tf.keras结合使用
  14. java后端做教育视频网站源码_基于 Java Spring cloud的开源在线教育系统调试实战...
  15. modbus rtu功能码理解
  16. 椭球体上某区域面积的求算,及该区域兰伯特投影与墨卡托投影到二维平面后面积对比...
  17. 文档多人协同编辑底层算法是如何实现的?
  18. 保存到千牛服务器的文件在哪里,压缩包里的文件保存后在哪里?
  19. 如何有效的招聘技术人员
  20. 【Java 8 新特性】Java Clock tick() 设置时间最小跳动间隔

热门文章

  1. Dijkstra算法和Floyd算法详解(MATLAB代码)
  2. RAID——独立冗余磁盘阵列
  3. 为什么热咖啡保温几小时后的变化比冰咖啡大?
  4. 拷机测试需要多久_【温馨提示】亚马逊卖家警惕!没有UL测试报告产品将会被下架...
  5. java邮箱验证码_Java实现邮箱验证码
  6. 视频融合应用没听说过?
  7. 变分(Calculus of variations)的概念及运算规则(二)
  8. 图像处理学习2,边缘检测1(sobel算子,kirsch算子)
  9. java实现的聊天程序
  10. project设置工期为1个工作日,但开始时间与结束时间不是同一天,如何解决或者是设置?