当前位置: 首页 > Linux

veth的原理----两个容器通过veth通信时数据包的发送和接收路径

时间:2023-04-06 22:21:25 Linux

基于linuxkernel5.4.54veth是一个虚拟网络设备,通过linuxkernel网络设备驱动实现/*注册在kernel上的veth设备的调用方法*/staticconststructnet_device_opsveth_netdev_ops={.ndo_init=veth_dev_init,/*初始化设备*/.ndo_open=veth_open,/*打开设备*/.ndo_stop=veth_close,/*关闭设备*/.ndo_start_xmit=veth_xmit,/*发送数据包(重要)*/.ndo_get_stats64=veth_get_stats64,/*CopyhardwarestatisticsTouserspace*/.ndo_set_rx_mode=veth_set_multicast_list,/*里面有个空函数,是骗人的*/.ndo_set_mac_address=eth_mac_addr,/*修改MAC地址*/#ifdefCONFIG_NET_POLL_CONTROLLER.ndo_poll_controller=veth_poll_controller,/*里面是一个空函数,Man's*/#endif.ndo_get_iflink=veth_get_iflink,/*获取设备的iflink值(应该是数字)*/....ndo_bpf=veth_xdp,/*设置或查询XDP-设备上的相关状态,并管理BPF卸载。*/.ndo_xdp_xmit=veth_xdp_xmit,/*传输XDP数据包*/};通过veth连接两个容器发送和接收路径:process(container1)|--系统调用进入Namespace1的网络协议栈,当container1创建进程时networknamespacekernellayer会为进程设置:createskb,从用户空间拷贝数据到内核空间TCP/UDP包IP包,运行Namespace1路由和iptables|--走出协议栈,进入网络设备调用网络设备驱动的中转包函数|veth_xmit:veth驱动注册的传递函数|veth_forward_skb|__dev_forward_skb:清除skb中所有可能影响命名空间隔离的信息|并将更新数据包将到达的网络设备(skb->dev)从eth0改为eth1|数据包运行的协议栈(网络命名空间)由skb->dev|XDPhookpoint|netif_rx|netif_rx_internal:cpusoftinterruptloadbalancing|的nd_net字段决定enqueue_to_backlog:将skb包加入到指定cpu的input_pkt_queue中,当tail队列为空时激活网络软中断。如果队列不为空,则不需要激活软中断。在cpu清除队列之前,会自动触发软中断,每个cpu都有自己的input_pkt_queue(接收队列,默认大小1000,可修改),和process_queue(处理队列)。软中断处理函数处理完process_queue中的所有skb包后,会拼接input_pkt_queue到process_queue中。input_pkt_queue和process_queue是为非NAPI设备准备的cpuQueue。NAPI设备有自己的队列cpu来处理网络包:do_softirq()|net_rx_action:网络软中断处理函数|napi_poll|n->poll:veth设备没有定义poll,调用默认的poll函数-process_back日志|process_backlog:cpu循环从process_queue中取出skb进行处理,最多处理300个skb,|处理队列清空后,拼接input_pkt_queue到process_queue|尾部__netif_receive_skb|...|最后容器2进程收到数据包)总结一下veth的工作过程:容器1进程产生数据包---->eth0--->veth修改并清除信息---->eth1--->容器2进程接收数据包的具体实现:容器1进程向eth0发送一个包,veth改变数据包的内容,将数据包添加到一个cpu队列,等待cpu处理cpu处理数据包,运行容器2的eth1所在的网络协议栈(Namespace2),最终发送到容器2的应用相当于数据包从容器1到硬件网卡设备容器2接收数据包veth虚拟设备与硬件网卡设备区别示意图veth设备与硬件网卡设备相比,少了DMA、RingBuffer、中断处理功能veth设备是一个零-复制硬件网卡设备。与veth相比,有两处拷贝丢失:一是接收数据包时从DMA到内核空间的拷贝,二是发送数据包时从内核空间到DMA的拷贝。