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

网络虚拟化常见问题

网络虚拟化常见问题

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

返回下列几个值其中之一

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处理后发送出去。

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

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

5.dpdk

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

data plane develop kit

相关文章: