网络虚拟化常见问题

1.网卡收发包的过程

下面是内核相关的

https://blog.csdn.net/hilyoo/article/details/4455031?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

收包过程

https://blog.csdn.net/jiangganwu/article/details/83037139

0.网卡驱动创建rx descriptor ring,并将地址写入网卡寄存器;网卡驱动为每个descriptor分配skb,并将地址写入descriptor;

1.包到达网卡,网卡对包进行校验

2.网卡将帧写入FIFO缓冲区

3.DMA通过PCI总线将数据包复制到skb缓冲区,

4.产生中断,交给内核处理,这些中断处理程序在网卡驱动中

5.CPU执行硬中断处理函数

6.ksoftirqd执行软中断函数

7.网卡驱动将sk_buff送上协议栈

其中,协议栈的解析过程:

ip层对包进行错误检测和路由,packet被转发或送往上层

发包过程

0.socket调用send

tcp/udp为这些数据添加tcp/ip头部

ip添加ip头

超过了MTU的话需要进行ip分组,并传给链路层

链路层写到网卡驱动中的tx descriptor ring

1.网卡驱动创建tx descriptor ring,将tx descriptor ring的总线地址写入网卡寄存器

2.协议栈将sk_buff送到网卡驱动

3.网卡驱动将sk_buff放到tx descriptor ring

4.找到下一个要使用的descriptor

5.将descriptor中的数据拷贝到FIFO

6.将数据包发送出去

7.通知CPU释放数据缓冲区中的数据包

2.中断上半部,下半部

 

这里写图片描述

其中中断上半部负责将napi放到poll list里面,下半部取出napi对应的skb并交给内核栈

3.netfilter

https://blog.csdn.net/ruisenabc/article/details/87920528

下面是linux协议栈中的网络层对ipv4报文的处理流程

预先在每个点上都注册了回调函数

返回下列几个值其中之一

1. NF_ACCEPT

继续正常传输数据报。这个返回值告诉Netfilter:到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段。
2. NF_DROP

丢弃该数据报,不再传输。
3. NF_STOLEN

模块接管该数据报,告诉Netfilter“忘掉”该数据报。该回调函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter获取了该数据包的所有权。
4. NF_QUEUE

对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
5. NF_REPEAT

 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环。

数据报从进入系统,进行IP校验以后,

首先经过第一个HOOK函数NF_IP_PRE_ROUTING进行处理;

然后就进入路由代码,其决定该数据报是需要转发还是发给本机的;若该数据报是发被本机的,则该数据经过HOOK函数NF_IP_LOCAL_IN处理以后然后传递给上层协议;

若该数据报应该被转发则它被NF_IP_FORWARD处理;

经过转发的数据报经过最后一个HOOK函数NF_IP_POST_ROUTING处理以后,再传输到网络上。

本地产生的数据经过HOOK函数NF_IP_LOCAL_OUT 处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送出去。

四张表:

filter表,mangle表,raw表,nat表

4.1000M速率能发送多少数据包?

https://blog.csdn.net/gold0523/article/details/57113863

5.dpdk

https://www.cnblogs.com/bakari/p/8404650.html

data plane develop kit

6.连接跟踪

为什么使用连接跟踪?

1.访问网站,你访问的那个网站的返回包能够通过但是其他网站不能通过

2.nat的查表,当第一个数据包查询nat表的时候,连接跟踪将转换方法保存下来,

后续的报文只需根据连接跟踪里保存的方法进行转换就行了。

识别一个连接上的双向数据包,同时记录状态

也是通过在hook点上注册相应的数据结构来工作的

https://segmentfault.com/a/1190000019605260(Netfilter是如何工作的)

几个表的情况如下:

连接跟踪的位置下图所示:

arch

连接跟踪采用的方案是在入口记录,在出口确认

会在入口进行计算,在出口确认的时候,保存到哈希表

struct

报文的连接跟踪状态

IP_CT_ESTABLISHED

IP_CT_RELATED

IP_CT_NEW

IP_CT_ESTABLISHED + IP_CT_IS_REPLY,与ESTABLISHED类似,但是是在回复方向

IP_CT_RELATED + IP_CT_IS_REPLY,与RELATED类似,但是是在回复方向

下面的图的博客地址在https://blog.csdn.net/qisefengzheng/article/details/50011037

用以实现连续跟踪入口的hook函数以较高的优先级分别被注册到了NF_IP_PREROUTING和NF_IP_LOCAL_OUT两个hook点上;用以实现连接跟踪出口的hook函数以非常低的优先级分别被注册到了NF_IP_LOCA_IN和NF_IP_POST_ROUTING两个hook点上

Neftilter框架用ip_conntrack{}来记录一个数据包与其连接的状态关系

 

7.OVS总结

基本流程:https://blog.csdn.net/YuZhiHui_No1/article/details/39298321?utm_source=blogxgwz27

1.ovs-vsctl add-port br-int p1发生了什么?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值