本系列文章1-4,来源于陈莉君老师公众号“Linux内核之旅” 1....前言 本文首先从宏观上概述了数据包发送的流程,接着分析了协议层注册进内核以及被socket的过程,最后介绍了通过 socket 发送网络数据的过程。 2....我们首先来看协议族是如何注册到内核,并被 socket 子系统使用的。 当用户程序像下面这样创建 UDP socket 时会发生什么?...sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) 简单来说,内核会去查找由 UDP 协议栈导出的一组函数(其中包括用于发送和接收网络数据的函数),并赋给...总结 了解Linux内核网络数据包发送的详细过程,有助于我们进行网络监控和调优。本文只分析了协议层的注册和通过 socket 发送数据的过程,数据在传输层和网络层的详细发送过程将在下一篇文章中分析。
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 被命中,则不进行发送,而会打印告警日志。函数剩余部分的代码设置错误码并返回。
前言 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 层进行了数据监控。
前言 本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调优。...Linux 内核会使用一个数组将 TOS 转换为优先级,后者会影响数据包如何以及何时从 qdisc 中发送出去。...许多 卡都支持此功能,并使用 NETIF_F_SG 标志进行通告。支持该特性的网卡可以处理数据 被分散到多个 buffer 的数据包;内核不需要花时间将多个缓冲区合并成一个缓冲区中。...接下来看看如何在 Linux 内核中监视和调优 UDP 协议层。 4....总结 本文重点分析了数据包在传输层(UDP协议)的发送过程,并进行了监控和调优,后面数据包将到达 IP 协议层,下次再分享,感谢阅读。
文章目录 一、解压内核源码 二、查询当前 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
所以说,本文特指HOOK内核函数的做法。毕竟内核重新编译,重启设备代价非常大。...我们在做正当的事情,所以我假设我们已经拿到了系统的root权限并且可以编译和插入内核模块。那么接下来的事情似乎就是一个流程了。...下面是一个代码,我稍后会针对这个代码,说几个细节方面的东西: #include linux/kernel.h> #include linux/kprobes.h> #include linux/cpu.h...在本例中,显然n是5,符合如今Linux内核函数第一条指令几乎都是callq xxx的惯例。...阅码场"是专业的Linux及系统软件技术交流社区,企业和Linux人才的连接枢纽。
最近要给团队做一个长期的内部分享,主题就是Linux内核中数据包的处理流程。 这几天抽空画了一部分流程图。...内核网络模块非常复杂,完整的流程图需要慢慢完善,以后会借内部分享的机会不断完善这个流程图,欢迎大家指正和提出宝贵意见。...我本人对网卡驱动兴趣不大,但skb path又无法脱离网卡驱动,这里选择了Intel的e1000网卡驱动:原因有二,一是Intel网卡驱动是内核里面写得最清楚,可读性最高的;二是e1000是Intel里面比较简单的驱动
本文将介绍在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): 当第一次发送数据包和重试发送数据包时,都会经过这里。
环境搭建与配置过程 个人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号用户态的进程以及其他服务的一些内核线程。
Linux kernel 4.10 发布了,据说有很多提升,那么可以常鲜看看,Ubuntu 16.04.2 安装Linux kernel 4.10 内核方法如下: sudo add-apt-repository...Kernel 4.2 内核 http://www.linuxidc.com/Linux/2015-09/122826.htm 怎样在 CentOS 7 上安装 Kernel 4.0.2 .../Linux/2015-04/116461.htm 如何在Ubuntu/CentOS上安装Linux内核4.0 http://www.linuxidc.com/Linux/2015-04/...116565.htm 如何在Ubuntu 13.10上安装Linux内核 3.12 http://www.linuxidc.com/Linux/2013-11/92930.htm ...如何在Ubuntu 14.10,Ubuntu 14.04及其衍生版本安装 3.16.7 CKT2内核 http://www.linuxidc.com/Linux/2014-12/110189.htm
对于操作系统而言,这就是内核可以做的事,内核可以访问任意进程的地址空间。 当然了,内核并不会无故私闯民宅,就像警察不会随意闯入别人家里一样。 但是,你可以让内核故意这么做,做点无赖的事情。...显然,test进程如果自己不改它,那就没辙...但是可以让内核强制改啊,让内核私闯民宅就是了。...接下来我写一个内核模块: // test.c // make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules #include linux.../mm.h> #include linux/sched.h> #include linux/module.h> static int pid = 1; module_param(pid, int,...通过虚拟地址获取页表的操作已经由用户态的pagemap文件的读取并解析代劳了。 ----
yum install mailx -y # 安装linux邮件工具,在控制节点:server 端进行操作; agent..."zabbix" xxx@eisc.cn # 测试邮件发送是否正常
Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。 Linux内核采用分层结构处理网络数据包。...在Linux内核,所有的网络设备都被抽象为一个接口处理,该接口提供了所有的网络操作。 net_device结构表示网络设备在内核中的情况,也就是网络设备接口。...设备名称总线参数协议参数链接层变量接口标志 四、数据包接收流程 在Linux内核中,一个网络数据包从网卡接收到用户空间需要经过链路层、传输层和socket的处理,最终到达用户空间。...五、数据包发送流程 以UDP数据包发送流程为例,在DM9000网卡上如何发送一个数据包。...链路层的 dev_queue_xmit()函数处理发送队列,调用 DM9000网卡的发送数据包函数 dm9000_xmit()发送数据包,发送完毕后,调用 dm9000_xmit_done函数处理发送结果
用户空间与内核空间的数据传输 在 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 将这个数据包发给协议栈。
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
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用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
在时间上 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
一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...,并工作起来。...当网卡从网络接收到数据包后,需要产生一个中断来通知 Linux 内核有数据包需要处理,而 irq 就是网卡驱动注册到内核中断服务的中断号。...向 Linux 内核注册了 ei_interrupt 硬件中断服务。 所以,当网卡接收到数据包时,会触发 ei_interrupt 中断服务来通知内核有数据包需要处理。
如果有意发送总长度超过65535的IP碎片,一些老的系统内核在处理的时候就会出现问题,导致崩溃或者拒绝服务。另外,如果分片之间偏移量经过精心构造,一些系统就无法处理,导致死机。...我们用Snort分别抓取采用ICMP和UDP协议发送的数据包。...5. teardropteardrop也比较简单,默认发送两个UDP数据包,就能使某些Linux内核崩溃。...老的Linux内核(1.x - 2.0.x)在处理这种重叠分片的时候存在问题,WinNT/95在接收到10至50个teardrop分片时也会崩溃。...你可以阅读teardrop.c的源代码来了解如何构造并发送这种数据包。6. 如何阻止IP碎片攻击* Windows系统请打上最新的Service Pack,目前的Linux内核已经不受影响。
curl 用于从命令行发送 HTTP 请求。通过 curl 命令可以发送 GET、POST 等 HTTP 请求,并查看服务器返回的响应。 检查http是否ok。...bcc 基于 BPF(Berkeley Packet Filter)技术的动态跟踪和性能分析工具集,主要用于 Linux 系统的内核和用户空间程序分析。 比bpftrace更灵活。...网络场景构造 iptables 用于设置和管理 Linux 内核的防火墙。通过 iptables 命令可以设置网络连接的规则、过滤数据包、进行网络地址转换等操作。 可以对特定特征进行丢包,转换。...tcpcopy 一种请求复制工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的。 性能压测 iperf 用于测试网络带宽和性能。...除了熟悉工具,更重要的是具备过硬的基础知识、熟悉代码流程,并懂什么时候收集什么信息,然后将这些命令和工具熟练的应用到工作中。
领取专属 10元无门槛券
手把手带您无忧上云