数据的接收 Table of Contents 数据的接收 过程概述 硬中断处理 软中断处理 链路层 igb_clean_rx_irq() GRO(Generic Receive Offloading) napi_gro_receive() napi_skb_finish() gro_normal_one() __netif_receive_skb_core() deliver_skb() 网络层 ip_rcv() ip_rcv_finish() dst_input() ip_local_deliver() ip_protocol_deliver_rcu() 传输层 概述 tcp_v4_rcv() udp_rcv() tcp_recvmsg() udp_recvmsg() 系统调用 read() recv()与recvfrom() recvmsg() 套接口层 sock_recvmsg_nosec() inet_recvmsg() 参考 数据的接收 过程概述 说明: 本文使用6.5内核, 涉及网卡时使用intel igb。 数据包从外部网络进入网卡 网卡(通过DMA)将包拷贝到内核内存中的ring buffer 产生硬件中断,通知系统收到了一个包 驱动调用NAPI,如果轮询(poll)还没有开始,就开始轮询 ksoftirqd软中断调用NAPI的poll函数从ring buffer收包(poll函数是网卡驱动在初始化阶段注册的;每个cpu上都运行着一个ksoftirqd进程,在系统启动期间就注册了) ring buffer里面对应的内存区域解除映射(unmapped) 如果packet steering功能打开,或者网卡有多队列,网卡收到的数据包会被分发到多个cpu…
Month: October 2023
网络数据的发送
网络数据的发送 Table of Contents 网络数据的发送 过程概述 系统调用 概要 write() send()与sendto() sendmsg() 套接口层 sock_sendmsg_nosec() inet_sendmsg() 传输层 tcp_sendmsg() udp_sendmsg() 网络层 ip_local_out() dst_output() ip_output() ip_finish_output() ip_finish_output2() 邻居系统 neigh_output() struct neighbour的output函数指针 设备系统 dev_queue_xmit() __dev_xmit_skb __qdisc_run() dev_hard_start_xmit() 网卡驱动 igb_xmit_frame() igb_xmit_frame_ring() igb_tx_map() 发送完成 概要 硬中断处理 软中断处理 参考 网络数据的发送 过程概述 说明: 本文使用6.5内核, 涉及网卡时使用intel igb。 使用系统调用(write/send/sendto/sendmsg等)写数据 数据穿过socket子系统,进入socket协议族(protocol family)系统 协议族处理:数据穿过协议层,这一过程(在许多情况下)会将数据(data)转换成数据包(packet) 数据穿过路由层,这会涉及路由缓存和ARP缓存的更新;如果目的MAC不在ARP缓存表中,将触发一次ARP广播来查找MAC地址 穿过协议层,packet到达设备无关层(device agnostic layer)…