1.网卡收发包的过程
下面是内核相关的
收包过程
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是如何工作的)
几个表的情况如下:
连接跟踪的位置下图所示:
连接跟踪采用的方案是在入口记录,在出口确认
会在入口进行计算,在出口确认的时候,保存到哈希表
报文的连接跟踪状态
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发生了什么?