老王不让用
芝兰生于幽谷,不以无人而不芳; 君子修身立德,不为穷困而改节
展开
-
linux 内核协议栈发包流程(dev_queue_xmit & qos & NET_TX)
dev_queue_xmit、qos队列 & NET_TX软中断转载 2023-09-05 10:25:24 · 840 阅读 · 0 评论 -
linux内核协议栈之GRO (Generic Receive Offload)
GRO(Generic Receive Offload)从软件层面实现将多个 TCP/UDP 数据包聚合在一个skb结构,然后作为一个大数据包交付给上层的网络协议栈,以减少上层协议栈处理skb的开销,提高系统接收数据包的性能。转载 2023-07-17 16:36:11 · 2534 阅读 · 0 评论 -
linux内核协议栈 之socket传输队列长度sk_wmem_alloc统计
在 socket 的结构体里有一个 sk_wmem_alloc 字段,该字段表示已经提交到 ip 层,但还没有从本机发送出去的 skb 占用空间大小。原创 2023-01-11 16:54:09 · 713 阅读 · 0 评论 -
linux内核协议栈之网卡发送队列选择
对于多队列的网络设备,real_num_tx_queues大于1,如果网络设备定义了自身的队列选择函数(ixgbe_select_queue),使用此函数;否则,使用netdev_pick_tx选择发送队列。最后,队列选择完成之后,将队列索引保存到skb的成员queue_mapping中。转载 2023-01-09 19:37:56 · 1729 阅读 · 0 评论 -
linux内核协议栈 之 TCP自动阻塞CORK控制
当应用程序在使用write或者sendmsg系统调用连续的发送少量数据包时,内核试图将这些小包尽可能的合并在一起发送,以降低总得数据包量。得以实现的前提是,至少有一个同数据流的之前数据包正在Qdisc队列或者网络设备的队列中等待发送。转载 2023-01-06 15:07:13 · 420 阅读 · 0 评论 -
linux内核协议栈 之 TCP-TSQ
TCP Small Queues的目的是限制每个TCP连接在Qdisc和device队列中的skb数量,以达到降低RTT(Round-Trip Time)和避免 BufferBloat 的目的。转载 2023-01-06 14:20:11 · 678 阅读 · 0 评论 -
linux内核协议栈 之 GSO逻辑分析
GSO用来扩展之前的TSO,目前已经并入upstream内核。TSO只能支持tcp协议,而GSO可以支持tcpv4, tcpv6, udp等协议。转载 2023-01-05 16:12:55 · 2238 阅读 · 0 评论 -
TCP Fast Open原理和使用
TFO转载 2023-01-03 15:29:44 · 800 阅读 · 0 评论 -
linux 内核协议栈 NAPI机制与处理流程分析(图解)
结合e1000和iixgb类型的网卡说明NAPI工作原理转载 2022-10-13 16:11:47 · 4418 阅读 · 2 评论 -
一文读懂eBPF/XDP
XDP概述XDP数据结构XDP与eBPF的关系XDP操作模式XDP操作结果码XDP和iproute2加载器XDP和BCCXDP是Linux网络路径上内核集成的数据包处理器,具有安全、可编程、高性能的特点。当网卡驱动程序收到数据包时,该处理器执行BPF程序。XDP可以在数据包进入协议栈之前就进行处理,因此具有很高的性能,可用于DDoS防御、防火墙、负载均衡等领域。XDP程序使用的数据结构是,而不是,可以视为的轻量级版本。两者的区别在于:包含数据包的元数据,创建更早,不依赖与其他内核层,因此XDP可以更快的获转载 2021-09-30 18:55:55 · 5717 阅读 · 1 评论 -
linux generic netlink实现机制:通信实例
目录1 demo 概述2 创建内核Demo Genetlink2.1 定义Demo Genetlink3 内核注册Demo Genetlink3 应用层初始化Genetlink套接字4 用户空间和内核空间通信4.1 用户查询Demo Family ID4.2 向内核Demo Family发送消息4.3 内核Demo Family 回发消息4.4 应用层接收内核Demo Family回发消息1 demo 概述示例程序:demo_genetlink_kern.c(转载 2022-02-11 15:27:27 · 1733 阅读 · 0 评论 -
linux generic netlink实现机制:注册、创建
目录1Generic Netlink 概述2 Generic Netlink相关结构体2.1 Generic Netlink消息头结构:struct genlmsghdr2.2 Generic Netlink Family结构:struct genl_family(内核中完成注册)2.3 Generic Netlink Family命令处理结构:struct genl_ops(内核中完成注册)2.4 Generic Netlink Family内核接收消息结构:struct gen.转载 2022-02-11 14:30:29 · 2247 阅读 · 0 评论 -
linux netlink实现机制:通信
目录1 netlink 通信数据结构1.1 netlink 消息报头:structnlmsghdr1.2 socket 消息数据包结构:struct msghdr1.3 netlink消息处理宏2 应用层向内核发送netlink消息3内核向应用层发送netlink消息4 应用层接收内核netlink消息1 netlink 通信数据结构1.1 netlink 消息报头:structnlmsghdrstruct nlmsghdr { __u32 nlmsg_l...转载 2022-02-10 19:57:19 · 2251 阅读 · 0 评论 -
linux netlink实现机制:注册、创建
目录1 netlink 概述2 Netlink子系统初始化3 内核Netlink套接字3.1 内核netlink配置结构:struct netlink_kernel_cfg3.2 netlink属性头:struct nlattr3.3 netlink有效性策略:struct nla_policy3.4 netlink套接字结构:netlink_sock3.5 创建内核netlink套接字4 应用层 Netlink 套接字4.1 套接字地址数据结构 sockaddr_n转载 2022-02-10 19:09:03 · 2238 阅读 · 0 评论 -
Linux内核协议栈--ipsec收发包流程
1 ipsec收包解封流程流程路径:ip_rcv() --> ip_rcv_finish() --> ip_local_deliver() --> ip_local_deliver_finish()解封侧一定是ip报文的目的端,ip_rcv_finish中查到的路由肯定是本机路由(RTCF_LOCAL),调用 ip_local_deliver 处理。下面是贴的网上的一张图片。ip_local_deliver_finish中 根据上次协议类型,调用对应的处理函数。inet..转载 2022-01-27 15:57:40 · 3675 阅读 · 0 评论 -
XFRM -- ipsec协议的内核实现框架
目录1 Overview1.1 XFRM 实例1.2 Netlink 通道1.3 XFRM State1.3 XFRM Policy2 接收发送IPsec报文2.1 接收2.2 发送IPsec协议帮助IP层建立安全可信的数据包传输通道。当前已经有了如StrongSwan、OpenSwan等比较成熟的解决方案,而它们都使用了Linux内核中的XFRM框架进行报文接收发送。XFRM的正确读音是transform(转换), 这表示内核协议栈收到的IPsec报文需要经过转换才转载 2022-01-24 20:06:00 · 3596 阅读 · 0 评论 -
linux 内核协议栈 网络设备抽象 net_device
目录1 数据结构 net_device1.1 设备属性1.2结构管理1.3接口及其上下文2相关 API 说明2.1 net_device 分配alloc_etherdev_mqs()->alloc_netdev_mqs2.2 net_device 注册register_netdev()2.3 端口状态管理api2.3.1 设备状态变迁1 数据结构 net_device设备无关层一个重要的数据抽象是net_device{},net_devic...原创 2021-09-28 17:16:41 · 718 阅读 · 1 评论 -
linux 内核协议栈 网络数据包发送之调度层处理 dev_queue_xmit()
目录1 网路协议栈调度路径1.1 ip报文发送ip_finish_output21.1.1 下一跳发送接口neigh_resolve_output()1.2 arp报文发送arp_xmit2 报文进入调度层的路径分析dev_queue_xmit()【核心】2.1 无队列发送dev_hard_start_xmit()2.2 队列发送__dev_xmit_skb()2.2.1 skb依次出队列操作 __qdisc_run2.2.2 发送软中断 net_tx_ac...原创 2021-09-28 14:10:14 · 810 阅读 · 0 评论 -
linux内核协议栈之网络信息统计SNMP
目录SNMP简介SNMP信息统计框架和实现分析SNMP简介SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议"。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠 ,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了【读】操作;管理员需要向设备执行设置操作转载 2021-09-15 15:00:19 · 1735 阅读 · 0 评论 -
WireShark 中为什么会出现 Tcp Checksum Offload?
其实经常在抓包的时候发现这个问题,今天才好奇的去Google了一下简单的总结下,就是 wireshark 抓到的数据包提示Checksum错误,仅仅是因为它截获到的是操作系统胡乱填充的checksum,而千兆网卡在开启Checksum Offload之后,会把这些计算的工作交给网卡去做,网卡最后还是会计算出正确的checksum并且发出去的。这几天在分析通讯报文的过程中发现WireShark里显示本机发出去的一些数据包Bad Checksum,并提示 maybe caused by “TCP che转载 2021-09-13 17:08:42 · 4274 阅读 · 0 评论 -
linux 内核协议栈 UDP数据报校验和
目录1 校验和相关字段1.1 struct sk_buff1.2 struct net_device2收包流程数据报的校验和计算__udp4_lib_rcv()2.1 udp4_csum_init()2.2 udp_lib_checksum_complete()3 发包流程数据报的校验和计算udp_send_skb()3.1 硬件校验和udp4_hwcsum()3.2UDP软件校验和udp_csum()3.3UDPLITE校验和udplite_csum...转载 2021-09-08 15:52:39 · 2371 阅读 · 0 评论 -
linux 内核网络中 RPS/RFS 原理Ⅱ
目录1 RPS/RFS出现的原因2 多队列网卡3 RPS/RFS介绍4 RSS介绍5 网卡的 affinity 特性6 小结7 使用举例1 RPS/RFS出现的原因RPS/RFS功能是在 Linux- 2.6.35 中有google 的工程师提交的两个补丁,这两个补丁的出现主要是基于以下两点现实的考虑:这两个补丁的出现,是由于服务器的CPU越来越强劲,可以到达十几核、几十核,而网卡硬件队列则才4个、8个,这种发展的不匹配造成了CPU负载的不均衡。 上面的提到的是..转载 2021-05-28 20:43:00 · 1716 阅读 · 0 评论 -
linux 网络软中断 softirq 底层机制及并发优化
目录1 软中断2网络软中断定义3软中断调用(__napi_schedule)3.1 唤醒中断 ( __raise_softirq_irqoff )4触发软中断5 收发包软中断执行6并行优化6.1RSS/RPS/RFS/XPS6.1.1 RSS (Receive Side Scaling) (接收侧的缩放)6.1.2 RPS Receive Packet Steering (接收端包的控制)6.1.3 RFS Receive Flow Steeri...转载 2021-05-28 16:04:57 · 4267 阅读 · 0 评论 -
linux 网络之数据包的接受过程
目录1 网络收包概述2 如何将网卡收到的数据写入到内核内存?3 通知系统内核处理(驱动与Linux内核交互)4 网卡的基础知识5 网卡到内存6 内核网络模块7 协议栈7.1 IP层7.2 UDP层7.3 app 层 socket1 网络收包概述网卡收包从整体上是网线中的高低电平转换到网卡FIFO存储再拷贝到系统主内存(DDR3)的过程,其中涉及到网卡控制器,CPU,DMA,驱动程序,在OSI模型中属于物理层和链路层,如下图所示。 ...转载 2021-05-26 19:30:51 · 4158 阅读 · 0 评论 -
TCP报文之-tcp dup ack 、tcp Out-of-Order
使用WireShark抓包,选择TCP报文,TCP是一种安全的协议,在网络出现状况时也能安全稳定的传输数据,但是在网络出现问题时tcp报文中会有很多中情况导致报文重传或者是重组。现在就在报文中遇到的几个问题来详细说明一下。WireShark出现的常见提示TCP Out_of_Order的原因分析:一般来说是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元,因为他们可能是由不同的路径到达你的电脑上面。TCP Retransmission原因分析:很明显是上面的超时引发的数转载 2021-05-07 17:21:37 · 8657 阅读 · 2 评论 -
linux 内核协议栈 在 ESTABLISHED 状态时,连接收到 SYN 会回复什么?
ESTABLISHED 状态的连接收到乱序包会回复什么 Challenge ACK 的概念 ACK 报文限速是什么鬼 SystemTap 工具在 linux 内核追踪中的使用 包注入神器 scapy 的使用 RST 攻击的原理 killcx 等工具利用 RST 攻击的方式来杀掉连接的原理接下来开始文章的内容。scapy 实验复现现象实验步骤如下:在机器 A(10.211.55.10) 使用 nc 启动一个服务程序,监听 9090 端口,如下所示。nc -4 -l 9090.转载 2021-04-09 18:58:00 · 549 阅读 · 0 评论 -
linux 内核协议栈 TCP零窗口探测 与 keepalive 机制
目录1 TCP保活机制2 具体报文形式2.1 零窗口通知包: win = 02.2 keepalive 包:seq = ack- 1,len = 02.3 zero windowprobe 包: seq = ack,len = 12.4 zero windowprobe确认包3zero windowprobe 机制实现1 TCP保活机制在linux 内核协议栈中,当TCP的接收窗口为0时,发送端开始发送 keepalive 包,直到接收端窗口不为0时继续发...原创 2021-04-09 11:33:09 · 1686 阅读 · 0 评论 -
linux 原始套接字实现分析
目录1 原始套接字概述1.1链路层原始套接字1.2网络层原始套接字1.2.1 接收报文1.2.2 发送报文2 原始套接字实现2.1原始套接字报文收发流程2.2链路层原始套接字的实现2.2.1套接字创建2.2.2报文接收2.2.3报文发送2.2.4 小结2.3网络层原始套接字的实现2.3.1套接字创建2.3.2报文接收2.3.3报文发送2.3.4 小结3 应用及注意事项3.1 使用链路层原始套...转载 2021-01-19 21:37:56 · 2400 阅读 · 0 评论 -
linux内核协议栈 协议栈收包入口 netif_receive_skb
目录1 协议栈入口__netif_receive_skb_core()2 vlan 操作2.1 vlan报文信息struct vlan_hdr2.2 vlan 剥离 vlan_untag()2.3 vlan 添加eth_type_trans()3 三层协议处理钩子注册3.1 各种三层协议处理函数注册过程3.2桥处理函数注册网络收包流程从网卡驱动开始,一直往上,涉及NAPI、GRO、RPS等特性,通常是经过硬件中断后在经由软中断处理,在内核软中断的最后一步就是调用...转载 2021-01-16 16:28:01 · 3260 阅读 · 0 评论 -
linux网络报文接收发送浅析
linux网络报文接收流程netif_rx-->netif_rx_schedule-->net_rx_action-->process_backlog-->netif_receive_skb-->上层协议栈处理(ptype_base的HASH表中已注册.type与.func协议处理函数)linux网络报文发送流程上层发送协议栈组装需发送的报文有队列设备:fun_xmit-->dev_queue_xmit-->qdisc_run-->qdsi转载 2021-01-02 23:24:21 · 2213 阅读 · 1 评论 -
linux内核协议栈 三 / 四层协议接收数据处理函数以及相关的全局 hash表 / 数组
目录前言1 二层数据包处理netif_receive_skb()2 三层数据接收处理2.1 三层数据包协议处理数据结构struct packet_type2.2 三层协议栈 全局 hash 表 struct list_head ptype_base2.3 三层协议处理添加dev_add_pack()3 四层数据接收处理3.1 四层数据包协议处理数据结构 struct net_protocol3.2 四层协议栈 全局数组 struct net_protocol ...转载 2020-11-16 19:13:22 · 1338 阅读 · 0 评论 -
linux内核协议栈 邻居协议之 arp 数据包收发处理流程
前言在arp初始化时,通过调用dev_add_pack将arp协议的接收处理函数添加到了三层协议数据包处理函数相关的hash链表ptype_base中(关于三层协议数据包处理函数相关的hash链表,请参考文档http://blog.csdn.net/lickylin/article/details/22900401)。当底层接收到属于本机的arp数据包时,就会调用arp_rcv进行后续处理。1 arp数据包文接收arp_rcv()功能:对接收到的arp数据包的处理函数首先对arp数据...转载 2020-11-16 16:05:19 · 5697 阅读 · 1 评论 -
linux内核协议栈 邻居协议之ARP协议处理初始化
目录前言1arp协议相关数据结构1.1 arp协议格式1.2 arp数据结构1.3 arp操作码2 arp协议初始化arp_init()2.1 邻居表初始化 neigh_table_init()2.1.1初始化邻居表项成员 neigh_table_init_no_netlink()2.2 arp表初始值struct neigh_table arp_tbl3 arp协议邻居项的初始化函数 arp_constructor()前言上面分析完了通用邻居层的架构...转载 2020-11-16 14:00:14 · 1009 阅读 · 1 评论 -
linux内核协议栈 邻居协议之通用邻居项的状态机机制【核心】
1邻居几个核心状态邻居项的状态机机制是通用邻居层最重要的内容,主要是处理邻居项中状态的改变,其中包括几个邻居状态的定时器机制,以及邻居项的更新,solicit请求的发送等对于通用邻居项的状态机,主要有如下几个状态:NUD_INCOMPLETE NUD_REACHABLE NUD_STALE NUD_DELAY NUD_PROBE NUD_FAILED NUD_NOARP NUD_PERMANENT 其中,处于如下状态的邻居项,都会启动一个定时器:#define NUD..转载 2020-11-15 21:33:32 · 1664 阅读 · 0 评论 -
linux内核协议栈 邻居协议之通用邻居项的创建、查找、删除等相关函数
目录前言1邻居表项创建neigh_create()1.1邻居表项内存申请与初始化neigh_alloc()1.2邻居hash表扩容 neigh_hash_grow()2邻居表项查找2.1neigh_lookup()2.2neigh_lookup_nodev()2.3查找+条件创建 __neigh_lookup()2.4查找+默认创建 __neigh_lookup_errno()3邻居表项销毁neigh_destroy()3.1邻居表项条件...转载 2020-11-15 16:55:35 · 926 阅读 · 0 评论 -
linux内核协议栈 邻居协议之通用邻居项的垃圾回收机制
目录前言1 同步(强制)回收处理函数 neigh_forced_gc()2异步(周期)回收处理函数 neigh_periodic_work()前言对于通用邻居层,我认为主要可以分为三个方面:邻居项处理函数,包括邻居项创建、更新、删除等 邻居项的状态机机制,主要是处理邻居项中状态的改变,其中包括几个邻居状态的定时器机制,也包括发送solicit请求等 邻居项的垃圾回收机制,主要是负责回收一个邻居表里长时间不用的邻居项,已节省邻居缓存空间。这三个方面需要相互协调工作,才能完成通用邻.转载 2020-11-15 14:45:27 · 743 阅读 · 0 评论 -
linux内核协议栈 邻居协议相关数据结构
目录前言1 邻居基本状态2邻居组合状态2.1NUD_IN_TIMER2.2NUD_VALID2.3NUD_CONNECTED3邻居相关结构体3.1领居表项参数struct neigh_parms3.2领居表项操作函数struct neigh_ops3.3领居表项struct neighbour3.4邻居表struct neigh_table前言在linux代码中,对于不同的邻居项,抽象出了一个通用的模型,通用邻居层,主要是用来进行...转载 2020-11-15 12:24:32 · 746 阅读 · 0 评论 -
linux内核协议栈 icmp协议初始化
目录1 ICMP收包处理函数初始化2 ICMP协议模块初始化2.1icmp_sk_init()【核心】1 ICMP收包处理函数初始化我们知道icmp协议是附属于ip层的3层协议,且是将icmp数据存放于ip数据包的数据部分的3层协议。而tcp、udp也是将tcp、udp数据存放于ip数据包的数据部分的4层协议。虽然icmp与tcp等协议不属于同一个网络层,但是都是在3层ip协议处理完以后,才会交给icmp、tcp的处理函数去处理。因此在linux中,都是调用inet_add...转载 2020-11-09 18:08:38 · 487 阅读 · 0 评论 -
linux内核协议栈 icmp 报文收发流程
1 ICMP报文接收1.1 icmp_rcv() 实现在ip层判断是icmp报文之后,会调用icmp_rcv()来处理 icmp 类型的报文对数据包进行合理性检查 根据icmp的类型,分类处理/* * Deal with incoming ICMP packets. */int icmp_rcv(struct sk_buff *skb){ struct icmphdr *icmph; struct rtable *rt = skb_rtable(skb); str...转载 2020-11-09 15:32:50 · 5112 阅读 · 2 评论 -
linux内核协议栈 icmp 协议概述与数据结构
1 ICMP协议概述ICMP协议是网络层中一个非常重要的协议,其全称为InternetControlMessageProtocol(因特网控制报文协议),ICMP协议弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。在实现中,路由器会使用该协议来报告问题,而主机则会使用该机制来测试目的站是否可达。该报文的最终目的地不是一个应用程序或者目的设备上的用户,而是目的设备上的网际协议软件,一般icmp报文的接收是linux内核里的icmp接收模块来...转载 2020-11-08 22:02:34 · 2419 阅读 · 0 评论