Linux内核里的传输层数据流

news2024/11/27 0:44:45

传输层发送数据包

socket sendto系统调用

应用程序通过socket调用sendto系统调用发送数据包,根据网络层协议调用inet_sendmsg或者inet6_sendmsg()函数,将数据包送入协议栈发送。

SYSCALL_DEFINE6(sendto...) - net/socket.c
    sock_sendmsg() - net/socket.c
        sock_sendmsg_nosec() - net/socket.c
            int ret = INDIRECT_CALL_INET(sock->ops->sendmsg, inet6_sendmsg, inet_sendmsg, sock, msg, msg_data_left(msg))

协议栈处理函数-L4

协议栈根据传输层协议调用对应的处理函数。这里以udp协议为例说明传输层发送过程。最后根据网络层协议,调用ip_output()、ip6_output()等将数据包发送到网络层处理。

inet_sendmsg() - net/ipv4/af_inet.c
    return INDIRECT_CALL_2(sk->sk_prot->sendmsg, tcp_sendmsg, udp_sendmsg, sk, msg, size)
        udp_sendmsg() - net/ipv4/udp.c
            udp_send_skb() - net/ipv4/udp.c
                ip_send_skb() - net/ipv4/ip_output.c
                    ip_local_out() - net/ipv4/ip_output.c
                        dst_output() - net/dst.h
                             return INDIRECT_CALL_INET(skb_dst(skb)->output, ip6_output, ip_output, net, sk, skb);

协议栈处理函数-L3

网络层处理后,调用neigh_output()函数将数据包送入邻居子系统发送或者转化为arp。

ip_output() - net/ipv4/ip_output.c
    ip_finish_output() - net/ipv4/ip_output.c
        __ip_finish_output() - net/ipv4/ip_output.c
            ip_finish_output_gso() - net/ipv4/ip_output.c
                ip_finish_output2() - net/ipv4/ip_output.c
                    neigh_output() - net/neighbor.h

邻居子系统处理函数

neigh_output() - net/neighbor.h
    return n->output(n, skb) - net/neighbor.h
    neigh_hh_output() - net/neighbor.h
        dev_queue_xmit() - net/core/dev.c

网络设备层处理函数

网络设备层调用驱动注册的ndo_start_xmit()函数发送数据包到驱动。以igb驱动为例,ndo_start_xmit()即igb_xmit_frame()函数。

dev_queue_xmit() - net/core/dev.c
    __dev_queue_xmit() - net/core/dev.c
        dev_hard_start_xmit() - net/core/dev.c
            xmit_one() - net/core/dev.c
                netdev_start_xmit() - include/linux/netdevice.h
                    __netdev_start_xmit() - include/linux/netdevice.h
                        return ops->ndo_start_xmit(skb, dev)

驱动程序处理函数

网卡驱动完成最后的数据包发送过程。

igb_xmit_frame() - drivers/net/ethernet/intel/igb/igb_main.c
    igb_xmit_frame_ring() - drivers/net/ethernet/intel/igb/igb_main.c
        igb_tx_map() - drivers/net/ethernet/intel/igb/igb_main.c

数据包内存释放函数

网卡发送完数据包后,会给cpu发送一个硬中断通知cpu,cpu简单处理后,发出软中断NET_RX_SOFTIRQ。最后的中断处理函数net_rx_action()中完成数据包的释放。

硬中断处理函数:

igb_msix_ring() - drivers/net/ethernet/intel/igb/igb_main.c
    __napi_schedule() - net/core/dev.c
        ____napi_schedule() - net/core/dev.c
            __raise_softirq_irqoff(NET_RX_SOFTIRQ) - net/core/dev.c

软中断处理函数:

ksoftirqd为软中断处理进程,ksoftirqd收到NET_RX_SOFTIRQ软中断后,执行软中断处理函数net_rx_action(),调用网卡驱动poll()函数收包。在poll()函数中调用igb_clean_tx_irq()完成数据包的释放。

run_ksoftirqd() - kernel/softirqd.c
    __do_softirq() - kernel/softirqd.c
        h->action(h) - kernel/softirqd.c
            net_rx_action() - net/core/dev.c
                napi_poll() - net/core/dev.c
                    __napi_poll - net/core/dev.c
                        work = n->poll(n, weight) - net/core/dev.c
                            igb_poll() - drivers/net/ethernet/intel/igb/igb_main.c
                                igb_clean_tx_irq() - drivers/net/ethernet/intel/igb/igb_main.c

传输层接收数据包

本文以Intel igb网卡驱动为例说明收包过程:

网卡驱动注册硬中断处理函数

网卡驱动注册中断处理函数igb_msix_ring()。

igb_open() - drivers/net/ethernet/intel/igb/igb_main.c
    igb_request_irq - drivers/net/ethernet/intel/igb/igb_main.c
        igb_request_msix - drivers/net/ethernet/intel/igb/igb_main.c
            igb_msix_ring() - drivers/net/ethernet/intel/igb/igb_main.c

系统启动时注册软中断处理函数

NET_RX_SOFTIRQ的软中断处理函数为net_rx_action()。

subsys_initcall(net_dev_init) - net/core/dev.c
    net_dev_init() - net/core/dev.c
        open_softirq(NET_RX_SOFTIRQ, net_rx_action) - net/core/dev.c

系统启动时注册协议栈处理函数

在网络层,以IPv4为例,注册的协议处理函数为ip_rcv()。在传输层,根据协议注册其处理函数upd_rcv()、tcp_v4_rcv()、icmp_rcv()等。

fs_initcall(inet_init) - net/ipv4/af_inet.c
    inet_init() - net/ipv4/af_inet.c
        inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) - net/ipv4/af_inet.c
        inet_add_protocol(&udp_protocol, IPPROTO_UDP) - net/ipv4/af_inet.c
        inet_add_protocol(&tcp_protocol, IPPROTO_TCP) - net/ipv4/af_inet.c
        dev_add_pack(&ip_packet_type) - net/ipv4/af_inet.c

硬中断处理函数

当有数据包到达网卡时,DMA把数据映射到内存,通知CPU硬中断,执行注册的硬中断处理函数igb_msix_ring(),简单处理后,发出软中断NET_RX_SOFTIRQ。

igb_msix_ring() - drivers/net/ethernet/intel/igb/igb_main.c
    __napi_schedule() - net/core/dev.c
        ____napi_schedule() - net/core/dev.c
            __raise_softirq_irqoff(NET_RX_SOFTIRQ) - net/core/dev.c

软中断处理函数

ksoftirqd为软中断处理进程,ksoftirqd收到NET_RX_SOFTIRQ软中断后,执行软中断处理函数net_rx_action(),调用网卡驱动poll()函数收包。最后通过调用注册的ip协议处理函数ip_rcv()将数据包送往协议栈。

run_ksoftirqd() - kernel/softirqd.c
    __do_softirq() - kernel/softirqd.c
        h->action(h) - kernel/softirqd.c
            net_rx_action() - net/core/dev.c
                napi_poll() - net/core/dev.c
                    __napi_poll - net/core/dev.c
                        work = n->poll(n, weight) - net/core/dev.c
                            igb_poll() - drivers/net/ethernet/intel/igb/igb_main.c
                                igb_clean_rx_irq() - drivers/net/ethernet/intel/igb/igb_main.c
                                    napi_gro_receive() - net/core/gro.c
                                        napi_skb_finish() - net/core/gro.c
                                            netif_receive_skb_list_internal() - net/core/dev.c
                                                __netif_receive_skb_list() - net/core/dev.c
                                                    __netif_receive_skb_list_core - net/core/dev.c
                                                        __netif_receive_skb_core - net/core/dev.c
                                                            deliver_skb() - net/core/dev.c
                                                                pt_prev->func(skb, skb->dev, pt_prev, orig_dev)

协议栈处理函数-L3

在软中断处理的最后,调用的pt_prev->func()函数即为协议栈注册ipv4处理函数ip_rcv()。网络层处理完成之后,根据传输协议执行注册的传输层处理函数tcp_v4_rcv或者udp_rcv()。

ip_rcv() - net/ipv4/ip_input.c
    ip_rcv_finish() - net/ipv4/ip_input.c
        dst_input() - include/net/dst.h
            ip_local_deliver() - net/ipv4/ip_input.c
                ip_local_deliver_finish() - net/ipv4/ip_input.c
                    ip_protocol_deliver_rcu() - net/ipv4/ip_input.c
                        ret = INDIRECT_CALL_2(ipprot->handler, tcp_v4_rcv, udp_rcv, skb)

协议栈处理函数-L4

这里以udp协议为例说明处理过程,tcp协议处理过程更复杂一些。最后将数据包添加到socket的接收队列。然后进入用户空间应用层面处理。

udp_rcv() - net/ipv4/udp.c
    udp_unicast_rcv_skb() - net/ipv4/udp.c
        udp_queue_rcv_skb() - net/ipv4/udp.c
            udp_queue_rcv_one_skb() - net/ipv4/udp.c
                __udp_queue_rcv_skb() - net/ipv4/udp.c
                    __udp_enqueue_schedule_skb() - net/ipv4/udp.c
                        __skb_queue_tail() - net/ipv4/udp.c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

compose系列教程-2. 显示图片

要在Android中使用Compose显示图片,需要使用Image组件。以下是一个简单的例子,它显示了一张图片: Composable fun MyApp() { val image painterResource(id R.drawable.my_image) Image(painter image, contentDescription "…

dynamics 365的增删改查

今天需要完成对dynamics 365的增删改查,网上一直找不到合适的教程,官方文档看不懂,实在没办法了,于是下载了chatgpt,对他进行了提问。 我:怎么用visual studio基于dynamics 365进行增删改查? ChatGPT 中文…

Python笔记 -- 类

文章目录1、引入2、操作属性3、继承4、将实例用作属性5、导入类1、引入 类和实例 使用类可以模拟任何东西,下面是一个小狗的简单类Dog,它表示任意小狗,实例my_dog表示一个具体的小狗方法 类中的函数称为方法,有关函数的一切均适用…

兔c同学的一篇:使用python 的 unittest模块对类和函数进行测试

文章目录1. 测试函数简单的函数测试单元测试和测试用例可通过的测试不可通过的测试测试未通过时怎么办2. 测试类各种断言方法测试一个类测试 AnonymousSurvey方法setUp()导言 在编写函数或类时,还可为其编写测试。通过测试,可以确定代码面对各种输入都能…

面试官必问--谈谈Spring Bean对象的生命周期吧

现在是时候讨论Spring Bean从产生到销毁整个过程的细节了,也就是Spring Bean的生命周期。在这里文哥先温馨提示:Spring Bean的生命周期是面试高频点之一,希望大家好好掌握哦~一. Spring Bean生命周期的概述如果没有Spring的环境,J…

张力控制之开环模式

张力控制的相关知识也可以参看专栏的其它文章,链接如下: 张力闭环控制之传感器篇(精密调节气阀应用)_RXXW_Dor的博客-CSDN博客跳舞轮对应张力调节范围,我们可以通过改变气缸的气压方式间接改变,张力跳舞轮在收放卷闭环控制上的详细应用,可以参看下面的文章链接,这里我…

人工智能实验一:利用遗传算法求解 TSP(旅行商)问题

1.任务描述 本关任务:利用遗传算法求解 TSP 问题。 2.相关知识 为了完成本关任务,你需要掌握:1. 遗传算法;2. TSP问题。 遗传算法 一个后继状态由两个父状态决定,以k个随机产生的状态开始(population&…

Kaggle赛题解析:Diffusion Prompt生成

文章目录一、比赛信息二、比赛背景三、比赛任务四、评价指标五、数据描述六、解题思路一、比赛信息 比赛名称:Stable Diffusion - Image to Prompts 推断生成高度详细、清晰的焦点、插图、宏伟、史诗般的 3d 渲染图像的prompt 比赛链接:https://www.k…

python----获取一部小说

1、需求说明 获取一部小说的标题内容,以txt文档形式保存 2、项目说明 3、代码 # 怎么发送请求 # pip install requests import requests# pip install lxml->从标签里提起文字 #from lxml import etree from lxml import html etreehtml.etree # 发送给谁 url…

Android---系统启动流程

目录 Android 系统启动流程 init 进程分析 init.rc 解析 Zygote 概叙 Zygote 触发过程 Zygote 启动过程 什么时Runtime? System Server 启动流程 Fork 函数 总结 面试题 Android 是 google 公司开发的一款基于 Linux 的开源操作系统。 Android 系统启动…

Web3中文|一波未平一波又起:Silvergate将走向何处

Silvergate Capital(SI)这一加密公司曾经的重要银行合作伙伴,现在正处于崩溃的边缘。这家总部位于加州拉荷亚的公司上周五晚上表示,其暂停了Silvergate交易所网络(SEN:Silvergate Exchange Network&#xf…

Foxit PDF SDK ActiveX 5.9.7 Crack

Foxit PDF SDK ActiveX对于刚接触PDF或不愿投入过多精力学习PDF技术的产品管理者及开发者来说,Foxit PDF SDK ActiveX无疑是理想的选择。破解版它拥有操作简单的特性,提供可支持定制的可视化编程组件,开发者通过简单的拖放动作,就…

扬帆配资|建筑业景气度持续回升,多只概念股业绩有望增长

新式城镇化概念股遭到商场重视。 今天早盘,新式城镇化概念股冲高,恒锋信息、ST花王涨停。蕾奥规划、筑博规划一度冲高至15%,冠龙节能、杭州园林、美晨生态跟涨。 国家出台一系列城镇化相关方针 城镇化,是人口向城镇会集的进程。…

【Kubernetes】第二十三篇 - 布署 nodejs 后端项目(上)

一,前言 上一篇,介绍了 MySQL 服务的部署; 本篇,介绍 nodejs 后端项目的布署(将后端项目构建成为 docker 镜像,并推送至镜像仓库); 二,准备项目 创建后端项目&#xf…

8、LSM树

一、前言 最近在调研NoSQL数据库,发现RocksDB、LevelDB、HBase以及Prometheus等,其底层的存储引擎都是基于LSM树,于是决定花时间彻底吃透LSM树这一数据结构。 不幸的是,在查阅资料学习的过程中,发现网上各种文章汗牛…

浅谈对Promise的理解以及在工作中的应用

浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案:PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…

轻松转换文档:antennahouse/Office Server Document Converter

关于 Office Server 文档转换器 (OSDC)破解版 无需 Microsoft Office 或 Adob​​e 软件即可快速准确地转换文档。 Office Server 文档转换器 (OSDC) 会将您在 Microsoft Office(Word、Excel、PowerPoint)中创建的重要文档转换为高质量的 PDF 或图像格式…

国内32位MCU在电机控制上的应用方案

电机(Electric machinery,俗称“马达”)是依据电磁感应定律,实现电能转换或传递的一种电磁装置,其主要作用是产生驱动转矩,为用电器或各类机械提供动力。电机作为工业世界的动力之源,几乎用于所…

ThinkPHP 6.1 模板篇之布局与继承

本文主要讲述ThinkPHP 6.1版本模板几种布局的方法和如何实现继承, 可以与《ThinkPHP 6.1 模板篇之文件加载》结合来看。 模板布局 布局方式有两种可以实现。 布局方法1 开启配置 默认情况下,不支持模版布局功能,需要在配置文件中开启&…

如何快速通过PMP考试?

我建议准备的最短时间至少一个月,我用了一个半月,我每天集中精力备考大约4个小时,大家可以根据自己的专注力的长短去调节每天的备考时间。 准备5月的,还没备考的,现在开始也来得及。5月没有报名的可以准备8月的&#…