• 网络流程图


    • 网络协议栈流程图以及数据结构

    linux内核网络模块加载

    socket 创建流程

    UDP 收发包流程以及 软中断收发包流程

    UDP  收-发包流程

    -> igb_msix_ring          中断服务函数(分队列处理)
    
    -> napi_schedule -> napi_schedule_prep        
       检测napi->state, NAPI_STATE_SCHED是否置位允许napi调度
    -> __napi_schedule -> ____napi_schedule     
       关闭硬件中断,并将该napi->poll_list添加到全局轮询队列poll_list
    -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)     产生napi软件中断
    
    
    -> net_rx_action                             软中断服务函数
       只要全局poll_list队列不为空,则一直轮询处理
       当轮询完成预设目标任务budget,或者2秒轮询超时后强制退出则结束napi轮询,重新使能中断
    -> n->poll -> igb_poll 回调网卡轮询处理接口
    
    
    -> igb_clean_rx_irq
        -> igb_alloc_rx_buffers    
           判断回收rx_buffer超过IGB_RX_BUFFER_WRITE(16),一次性补充16个buffer
        -> igb_fetch_rx_buffer      申请skb并将rx_buffer数据page挂接到skb
        -> napi_gro_receive        
           判断网卡是否支持GRO(Generic Segmentation Offload)
           相对应的有TSO(TCP Segmentation Offload)
        -> napi_skb_finish -> netif_receive_skb
           使能CONFIG_RPS(Receive Packet Steering)时
        -> get_rps_cpu              依据skb->hash获取后续传输层协议栈处理target CPU
        -> enqueue_to_backlog -> __skb_queue_tail    
           将各个队列的skb入列到对应处理target CPU的input_pkt_queue
           
           
    -> ____napi_schedule 
    -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)     产生sd->backlog软件中断
    -> net_rx_action                软中断服务函数
    -> n->poll -> process_backlog    回调backlog的轮询处理函数
        -> __skb_dequeue            从队列中出列待处理skb
        -> __netif_receive_skb -> __netif_receive_skb_core     
           开始处理网络层skb    
           根据注册skb->protocol搜索pt_prev /* Protocol hook */
        -> deliver_skb -> pt_prev->func
        
    -> ip_rcv               IP层数据处理,net/ipv4/af_inet.c注册
       若注册pf_ring的packet_type,则调用pfring rcv
       prot_hook.func = packet_rcv;
       prot_hook.type = htons(ETH_P_ALL);
    -> ip_rcv_finish -> dst_input /* Input packet from network to transport */
    -> skb_dst(skb)->input(skb) 
    -> ip_local_deliver -> ip_defrag /* Reassemble IP fragments. */
    -> ip_local_deliver_finish 
       根据注册inet_protos搜索ipprot
       tcp_protocol, udp_protocol, icmp_protocol, igmp_protocol等
       在net/ipv4/af_inet.c,inet_init注册,以tcp为例
    -> tcp/udp层 -> ipprot->handler
    
    
    -> tcp_v4_rcv(udp_rcv) -> tcp_v4_do_rcv 
    -> tcp_rcv_state_process 
    -> case TCP_ESTABLISHED: tcp_data_queue 
    -> tcp_queue_rcv 
    -> __skb_queue_tail /* queue a buffer at the list tail */
    
    
    -> napi_complete            结束轮询
    -> igb_ring_irq_enable        重新使能硬件中断
    
    
    应用层send -> copy_from_user 
    -> 内核层skb -> 协议栈 
    -> 分队列
    -> ndo_start_xmit -> igb_xmit_frame
    -> igb_xmit_frame_ring 
        -> igb_tx_queue_mapping     根据skb->queue_mapping获取对应发送队列tx_ring
        -> igb_xmit_frame_ring      skb填充tx_ring->tx_buffer_info
        -> igb_tso                  TSO(TCP Segmentation Offload)
        -> igb_tx_map                
        将skb流式映射dma_map_single填充描述符tx_desc
        并在最后一帧的描述符tx_desc中将EOP(End of Packet)置位
        
    
        
    -> igb_msix_ring                            中断服务函数(分队列处理)
    -> napi_schedule -> napi_schedule_prep        
       检测napi->state, NAPI_STATE_SCHED是否置位允许napi调度
    -> __napi_schedule -> ____napi_schedule     
       关闭硬件中断,并将该napi->poll_list添加到全局轮询队列poll_list
    -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)   产生napi软件中断
    -> net_rx_action                            软中断服务函数
       只要全局poll_list队列不为空,则一直轮询处理
       当轮询完成预设目标任务budget,或者2秒轮询超时后强制退出则结束napi轮询,重新使能中断
    -> n->poll -> igb_poll                      回调网卡轮询处理接口       
        -> igb_clean_tx_irq                     释放skb,dma_unmap_single    
        
        
    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    安卓手机无法使用adb导出文件
    dex2jar 报错 com.googlecode.d2j.DexException: not support version
    夜神模拟器adb连接
    无法安装 /lib/x86_64-linux-gnu/libpng12.so.0 的新版本: 没有那个文件或目录
    mysql基础 -创建
    VScode
    阿强的TypeScript基础
    Vue由浅入深之Array变化侦测
    深入浅出Vue.js一之Object的变化侦测
    阿强工作中常用的js的数组方法汇总
  • 原文地址:https://www.cnblogs.com/codestack/p/11494351.html
Copyright © 2020-2023  润新知