首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核网络udp数据包发送(一)

本系列文章1-4,来源于陈莉君老师公众号“Linux内核之旅” 1....前言 本文首先从宏观上概述了数据包发送的流程,接着分析了协议层注册进内核以及被socket的过程,最后介绍了通过 socket 发送网络数据的过程。 2....我们首先来看协议族是如何注册到内核被 socket 子系统使用的。 当用户程序像下面这样创建 UDP socket 时会发生什么?...sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) 简单来说,内核会去查找由 UDP 协议栈导出的一组函数(其中包括用于发送和接收网络数据的函数),赋给...总结 了解Linux内核网络数据包发送的详细过程,有助于我们进行网络监控和调优。本文只分析了协议层的注册和通过 socket 发送数据的过程,数据在传输层和网络层的详细发送过程将在下一篇文章中分析。

3.9K51

Linux内核网络UDP数据包发送(四)——Linux netdevice 子系统

Linux 支持流量控制(traffic control)的功能,此功能允许系统管理员控制数据包如何从机器发送出去。流量控制系统包含几组不同的 queue system,每种有不同的排队特征。...可以将 qdisc 视为调度程序, qdisc 决定数据包发送时间和方式。 Linux 上每个 device 都有一个与之关联的默认 qdisc。...当 flow 的所有 outstanding(需要确认的)数据包都已确认时,TCP 协议层将设置此标志。当发生这种情况时,内核可以为此数据包选择不同的 TX 队列。...如果使用 setsockopt 带 IP_TOS 选项来设置在 socket 上发送的 IP 包的 TOS 标志( 或者作为辅助消息传递给 sendmsg,在数据包级别设置),内核会将其转换为 skb-...或者,如果当前 CPU 是发送锁定的拥有者,或者如果 RECURSION_LIMIT 被命中,则不进行发送,而会打印告警日志。函数剩余部分的代码设置错误码返回。

3.1K11
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核网络udp数据包发送(二)——UDP协议层分析

前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,分享了UDP层的数据统计和监控以及socket发送队列大小的调优。...Linux 内核会使用一个数组将 TOS 转换为优先级,后者会影响数据包如何以及何时从 qdisc 中发送出去。...许多 卡都支持此功能,使用 NETIF_F_SG 标志进行通告。支持该特性的网卡可以处理数据 被分散到多个 buffer 的数据包;内核不需要花时间将多个缓冲区合并成一个缓冲区中。...接下来看看如何在 Linux 内核中监视和调优 UDP 协议层。 4....总结 本文重点分析了数据包在传输层(UDP协议)的发送过程,并进行了监控和调优,后面数据包将到达 IP 协议层,下次再分享,感谢阅读。

5.4K51

Linux内核网络UDP数据包发送(三)——IP协议层分析

前言 Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,分享了监控...出于讨论目的,我们假设 nf_hook 返回 1,表示调用者(在这种情况下是 IP 协议层)应该自己发送数据包。 3.2 目的(路由)缓存 dst 代码在 Linux 内核中实现协议无关的目标缓存。...如果超过 ,则数据包会出列丢弃,直到小于等于 proc 中的值。统计信息中有个计数器会因此 更新 如果需要 ARP 探测,ARP 将立即被发送。...总结 Linux内核网络数据包发送时,主要用到 ip_send_skb、 ip_local_out、ip_output、ip_finish_output、ip_finish_output2、 dst_neigh_output...等函数,本文通过分析这些函数来分享Linux内核数据包发送在 IP 层的处理,对 IP 层进行了数据监控。

2.9K21

Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入查看 linux 内核源码目录 )

文章目录 一、解压内核源码 二、查询当前 Linux 内核版本号 三、进入查看 linux 内核源码目录 一、解压内核源码 ---- 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz...拷贝到 Ubuntu 虚拟机中 , 执行 tar xvf linux-5.6.14.tar.gz 命令 , 解压 Linux 内核源码 ; 解压完毕后 , linux-5.6.14 目录中就是解压后的...Linux 内核源码 ; 二、查询当前 Linux 内核版本号 ---- 执行 uname -a 命令 , 查询当前 Ubuntu 系统的 Linux 内核版本号 , 执行过程如下 : root@ubuntu...x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~/kernel# root@ubuntu:~/kernel# 当前的内核版本号是 4.13.0 ; 三...、进入查看 linux 内核源码目录 ---- 进入之前解压的 linux-5.6.14 内核源码目录 ; root@ubuntu:~/kernel# ls linux-5.6.14 linux-5.6.14

86.4K60

Linux BSP实战课(网络篇):数据包发送过程

本文将介绍在Linux系统中,以一个UDP包的接收过程作为示例,介绍数据包是如何一步一步从应用程序到网卡最终发送出去的。 socket层 socket(...)...构造skb结构体,最后将网卡的信息和该skb关联。...该函数最后会将找到的设备和源IP塞进flowi4结构体返回给udp_sendmsg ip_make_skb:该函数的功能是构造skb包,构造好的skb包里面已经分配了IP包头,并且初始化了部分信息(IP...通知网卡发送数据包 网卡发送完成后发送中断给CPU 收到中断后进行skb的清理工作 在网卡驱动发送数据包过程中,会有一些地方需要和netdevice子系统打交道,比如网卡的队列满了,需要告诉上层不要再发了...满的时候,会给上层调用返回NETDEV_TX_BUSY packet taps(AF_PACKET): 当第一次发送数据包和重试发送数据包时,都会经过这里。

39620

Linux内核分析》之构造一个简单的Linux系统MenuOS 实验总结

环境搭建与配置过程 个人Linux系统环境搭建MenuOS的过程 Linux系统环境搭建MenuOS的过程 1、Linux系统环境搭建MenuOS的过程 # 下载内核源代码编译内核 cd ~/LinuxKernel...rest_init();中包含内核启动过程 所在位置:xref: /linux-3.18.6/init/main.c rest_init()函数 从系统内核一启动,rest_init()会一直存在,是...0号进程,并且创建了1号进程,创建了一些其他的服务进程*/ static noinline void __init_refok rest_init(void) { int pid;...0号进程一直存在,创建一号进程及其他服务的内核线程。...总结 Linux内核的启动,通过start_kernel()进行各种初始化工作,最终执行到rest_init()来初始化0号进程,同时0号进程创建1号用户态的进程以及其他服务的一些内核线程。

2.1K10

详解云计算网络底层技术——虚拟网络设备 taptun 原理解析

用户空间与内核空间的数据传输 在 Linux 中,用户空间和内核空间的数据传输有多种方式,字符设备就是其中的一种。...在 Linux 内核 2.6.x 之后的版本中,tap/tun 对应的字符设备文件分别为: tap:/dev/tap0 tun:/dev/net/tun 设备文件即充当了用户空间和内核空间通信的接口...当应用程序打开设备文件时,驱动程序就会创建注册相应的虚拟设备接口,一般以 tunX 或 tapX 命名。...当用户程序向文件 /dev/net/tun 或 /dev/tap0 写数据时,内核就可以从对应的 tunX 或 tapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。...基于上图,我们看看数据包的流程: 应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。

3.9K50

Linux 网络设备驱动开发(一) —— linux内核网络分层结构

Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。    Linux内核采用分层结构处理网络数据包。...在Linux内核,所有的网络设备都被抽象为一个接口处理,该接口提供了所有的网络操作。    net_device结构表示网络设备在内核中的情况,也就是网络设备接口。...设备名称总线参数协议参数链接层变量接口标志 四、数据包接收流程   在Linux内核中,一个网络数据包从网卡接收到用户空间需要经过链路层、传输层和socket的处理,最终到达用户空间。...五、数据包发送流程    以UDP数据包发送流程为例,在DM9000网卡上如何发送一个数据包。...链路层的 dev_queue_xmit()函数处理发送队列,调用 DM9000网卡的发送数据包函数 dm9000_xmit()发送数据包发送完毕后,调用 dm9000_xmit_done函数处理发送结果

1.8K21

26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)

1.描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议。..., 通过网络设备上的中断触发接收操作, 4)网络设备与媒介层: 用来负责完成数据包发送和接收的物理实体, 设备驱动功能层的函数都在这物理上驱动的 层次结构如下图所示: ?...,当上层要发送一个数据包时, 就会调用网络设备层里net_device数据结构的成员hard_start_xmit()将数据包发送出去。...2)调用收包函数,代入发送的sk_buff缓冲区, 里面来伪造一个收的ping包函数 3)使用dev_kfree_skb()函数来释放发送的sk_buff缓存区 4)更新发送的统计信息 5)使用netif_wake_queue...,之前是发送ping包0x08,需要改为0x00,表示接收ping包 5)使用dev_alloc_skb()来构造一个新的sk_buff 6)使用skb_reserve(rx_skb, 2);将sk_buff

10.1K101

云原生虚拟网络 tuntap & veth-pair

在时间上 tun/tap 出现得更早,在 Linux Kernel 2.4 版之后发布的内核都会默认编译 tun/tap 的驱动。...然后网络栈会将这个数据包根据路由发送到 docker0 网桥,docker0 网桥会扮演二层交换机的角色,将数据包发送给正确的端口,进而通过 veth pair 设备进入到 containerA 的 Network...容器发送数据包经过 docker0 网桥进入内核态一次;数据包由 flannel0 设备进入到 flanneld 进程又一次;第三次是 flanneld 进行 UDP 封包之后重新进入内核态,将 UDP...如果 qume-kvm 要和外界通信,那么数据包会被发送到物理网卡,最终实现与外部通信。...ping相关概念,我们大致可以了解到: ping进程构造ICMP echo请求包,通过socket发给协议栈; 协议栈根据目的IP地址和系统路由表,知道去 10.1.1.3 的数据包应该要由 10.1.1.2

1.4K20

如何移植使用Linux内核的通用链表(附完整代码实现)

在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head。...本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使用的函数都给出了详细的说明和测试用例,并且移植了Linux内核的链表结构,在任意平台都可以方便的调用内核已经写好的函数。...Linux内核中的链表   上面介绍了普通链表的实现方式,可以看到数据域都是包裹在节点指针中的,通过节点指针访问下一组数据。...但是 Linux内核的链表实现可以说比较特殊,只有前驱和后继指针,而没有数据域。链表的头文件是在include/list.h(Linux2.6内核)下。...链表删除插入节点 内核实现 /** * list_move - delete from one list and add as another's head * @list: the entry

1.3K20

Linux 网卡数据收发过程分析

一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...,工作起来。...当网卡从网络接收到数据包后,需要产生一个中断来通知 Linux 内核数据包需要处理,而 irq 就是网卡驱动注册到内核中断服务的中断号。...向 Linux 内核注册了 ei_interrupt 硬件中断服务。 所以,当网卡接收到数据包时,会触发 ei_interrupt 中断服务来通知内核数据包需要处理。

2.3K30

linux网络开发者定位问题常用工具和命令总结

curl 用于从命令行发送 HTTP 请求。通过 curl 命令可以发送 GET、POST 等 HTTP 请求,查看服务器返回的响应。 检查http是否ok。...bcc 基于 BPF(Berkeley Packet Filter)技术的动态跟踪和性能分析工具集,主要用于 Linux 系统的内核和用户空间程序分析。 比bpftrace更灵活。...网络场景构造 iptables 用于设置和管理 Linux 内核的防火墙。通过 iptables 命令可以设置网络连接的规则、过滤数据包、进行网络地址转换等操作。 可以对特定特征进行丢包,转换。...tcpcopy 一种请求复制工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的。 性能压测 iperf 用于测试网络带宽和性能。...除了熟悉工具,更重要的是具备过硬的基础知识、熟悉代码流程,懂什么时候收集什么信息,然后将这些命令和工具熟练的应用到工作中。

1K10

ZMap扫描机制剖析

随之以 Zmap 为代表的全网级快速端口扫描器被大家所熟知加以应用。本文主要通过分析 ZMap 的工作机制以及发包机制来探讨如何构造全网级快速端口扫描器。...,因为它涉及到一个操作系统,需要将扫描数据包通过用户空间传到内核空间,再将扫描数据包通过内核空间传输到NIC 。...PF_RING™ZC 允许用户空间代码绕过内核对NIC进行直接的“零拷贝”访问,从而可以在没有任何上下文切换或浪费内存带宽的情况下发送数据包。...发送线程在数据包可用时,从每个数据包队列中读取数据,使用 PF_RING™ZC 通过线路发送它们。 让我们简单来看一下 ZMap 中 有关于 PF_RING™ZC 的应用....为了确定最佳数据包生成线程数,ZMap 执行了一系列测试,使用 1-6 个数据包创建线程扫描 50 秒,测量发送速率。找到最佳线程数,即对为每个物理核分配一个数据包生成线程。

1.4K10
领券