自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

redwingz的博客

Linux内核网络、虚拟化

  • 博客(545)
  • 资源 (5)
  • 论坛 (1)
  • 收藏
  • 关注

原创 多径路由选择

以函数ip_route_input_slow为例,在fib查询之后,由函数ip_mkroute_input创建路由缓存项。static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, u8 tos, struct net_device *dev, struct fib_result *res){ err = fib_lookup(net, &fl4,

2021-01-05 22:05:24 44

原创 内核earlyprintk选项

通过设置early_printk选项,可以在内核串口设备初始化之前,看到打印输出,对于调试内核早期的启动问题非常有帮助。如下可在grub命令行中,手动加载启动内核,增加内核参数:grub> grub> linux \(hd0,msdos2)/vmlinuz earlyprintk=ttyS0,115200grub> grub> bootgrub> 对于x86平台,内核函数setup_early_printk处理earlyprintk选项,解析earlyprintk

2020-12-28 21:42:59 51

原创 rtnetlink组数量与设置

在文件include/uapi/linux/netlink.h中定义了,目前共有32个组,除去第一个RTNLGRP_NONE,即31个组。/* RTnetlink multicast groups */enum rtnetlink_groups { RTNLGRP_NONE,#define RTNLGRP_NONE RTNLGRP_NONE RTNLGRP_LINK,#define RTNLGRP_LINK RTNLGRP_LINK... RTN

2020-12-24 22:24:00 52

原创 rtnetlink的portid选择

在iproute2-5.9.0的文件lib/libnetlink.c中,创建netlink套接口时,地址结构sockaddr_nl,即rth->local没有对其成员nl_pid赋值,仅赋值了nl_family和nl_groups,由内核完成nl_pid的选取。int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions, int protocol){ memset(rth,

2020-12-20 20:40:29 50

原创 TCP合法RST报文

RESET报文的接收和检查处理。客户端握手阶段对于TCP客户端,在发送完SYN报文之后,如果接收到的回复报文同时设置了ACK和RST标志,在检查完ACK的合法性之后,处理RST标志,关闭套接口。对于ACK确认序号,其应当大于第一个未确认序号(snd_una),并且,确认序号不应大于未发送数据的序号(snd_nxt)。通常情况下ACK确认序号应当等于snd_una加一(SYN占用一个序号),但是,如果SYN报文中带有数据(例如:TFO),ACK确认序号会更大。以上情况向对端发送reset报文,但是,如果

2020-12-12 20:33:14 141

原创 TCP复位报文的发送

内核发送reset报文的函数为tcp_v4_send_reset,如下其赋值给了tcp_request_sock_ops结构的成员send_reset。struct request_sock_ops tcp_request_sock_ops __read_mostly = { .family = PF_INET, ... .send_reset = tcp_v4_send_reset,监听套接口不存在如下tcp_v4_rcv函数中,__inet_lookup_

2020-12-10 21:41:10 84

原创 X710网卡链路状态控制

驱动版本i40e-2.10.19.82,在ifconfig将网口down的时候,发现链路并没有断开,网卡的指示灯还是亮的。如下为控制网卡shutdown的函数:/** * i40e_down - Shutdown the connection processing * @vsi: the VSI being stopped **/void i40e_down(struct i40e_vsi *vsi){ int i; /* It is assumed that the call

2020-12-06 19:49:06 124

原创 iptables不能初始化filter表问题

错误如下所示:# iptables -Liptables v1.8.1 (legacy): can't initialize iptables table `filter': No chain/target/match by that namePerhaps iptables or your kernel needs to be upgraded.参考网上的说法,应该是filter表模块iptable_filter没有加载成功,或者内核编译选项根本就没有选上此功能。但是手动加载filter模块,没

2020-12-03 22:36:52 307

原创 邻居表的proxy_qlen长度和proxy_delay延时参数

proxy_qlen控制邻居代理缓存的报文数量,proxy_delay定义处理需要代理的arp报文的时间间隔。对于arp协议,内核默认的proxy_qlen为64,proxy_delay为80。通过PROC文件proxy_qlen可查看和修改其值。$ cat /proc/sys/net/ipv4/neigh/ens33/proxy_qlen 64$ cat /proc/sys/net/ipv4/neigh/ens33/proxy_delay 80在arp邻居表arp_tbl中将NEIGH_VA

2020-11-24 22:52:23 115

原创 邻居表项的unres_qlen_bytes长度

对于每个未解析的邻居地址,变量unres_qlen和unres_qlen_bytes分别控制可换成的报文数量和报文字节数量,其中前者unres_qlen在内核linux-3.3版本已经废弃,应使用后一个变量unres_qlen_bytes,其默认值为SK_WMEM_MAX(即net.core.wmem_default),内核建议此值的设置应能够容纳256个中型长度的报文。通过PROC文件unres_qlen和unres_qlen_bytes可查看和修改其值。$ cat /proc/sys/net/ipv

2020-11-19 20:04:14 201

原创 邻居表项的回收控制

内核中存在3个阈值控制邻居表项的回收:gc_thresh1 表示最小可保留的表项数量,如果表项数量小于此值GC(Garbage collector)不进行回收操作,默认为128;gc_thresh2 当表项数量超过此值时,GC将会清空大于5秒的表项,默认为512;gc_thresh3 最大可允许的非永久表项数量。如果系统拥有庞大的接口数量,或者直连了大量的设备,应增大此值。默认值为1024。另外,gc_interval不太清楚有什么用处,默认值为30秒钟。对于IPv4,可通过以下PROC

2020-11-14 07:08:35 154

原创 邻居表项的retrans_time时长

retrans_time控制在发送过邻居地址探测报文之后,经过多长时间检测邻居表项的变化,如果检测不成功,进行重新探测,对于arp协议,内核默认的retrans_time为1秒钟。通过PROC文件retrans_time可查看和修改其值,单位时USR_HZ(100),PROC文件的内容为毫秒值,这里为默认的1000ms。$ cat /proc/sys/net/ipv4/neigh/ens33/retrans_time100$ cat /proc/sys/net/ipv4/neigh/ens33/re

2020-11-12 20:15:49 134

原创 邻居表项的ucast_solicit数量

ucast_solicit控制使用单播发送邻居地址探测报文的次数,对于arp协议,内核默认的ucast_solicit为3。通过PROC文件app_solicit可查看和修改其值,如下,修改为1。$ cat /proc/sys/net/ipv4/neigh/ens33/ucast_solicit 3 $ echo 1 > /proc/sys/net/ipv4/neigh/ens33/ucast_resolicit在arp邻居表arp_tbl中将NEIGH_VAR_UCAST_PROBES索

2020-11-10 20:35:31 145

原创 邻居表项的mcast_solicit数量

mcast_solicit和mcast_resolicit控制使用多播发送邻居地址探测报文的次数,对于arp协议,内核默认的mcast_solicit为3。通过PROC文件app_solicit可查看和修改其值,如下,修改为1。$ cat /proc/sys/net/ipv4/neigh/ens33/mcast_solicit 3 $ cat /proc/sys/net/ipv4/neigh/ens33/mcast_resolicit 0在arp邻居表arp_tbl中将NEIGH_VAR_MC

2020-11-05 22:24:44 119 2

原创 邻居表项的app_solicit数量

app_solicit控制上层应用发送邻居地址探测报文的数量,对于arp协议,内核默认的app_solicit为零,在arp邻居表arp_tbl中没有对NEIGH_VAR_APP_PROBES索引所对应的表项赋值,即将app_solict对于的值设置为了零,如果上层应用可完成地址探测,可将app_solicit修改为非零。通过PROC文件app_solicit可查看和修改其值,如下,修改为1。$ cat /proc/sys/net/ipv4/neigh/ens33/app_solicit 0 $ e

2020-11-04 23:03:10 97

原创 邻居表项的delay_probe_time时长

delay_probe_time控制首次发送邻居请求报文的等待时长,对于arp协议,内核默认的delay_probe_time时长为5秒钟。struct neigh_table arp_tbl = { .family = AF_INET, .key_len = 4, .protocol = cpu_to_be16(ETH_P_IP), .hash = arp_hash, .key_eq = arp_key_eq, .co

2020-11-03 22:39:41 199 1

原创 GARP(Gratuitous ARP)

内核函数arp_is_garp判断ARP报文是否为GARP,先决条件是发送者IP和目标IP地址相同,另外,对于ARP回复(REPLAY)报文,要求如果目标硬件地址存在,需要与发送者硬件地址相等。最后,要求ARP报文的发送者IP为单播地址,否则,判定报文不是garp。static bool arp_is_garp(struct net *net, struct net_device *dev, int *addr_type, __be16 ar_op, __b

2020-10-29 20:30:47 137

原创 邻居表项的locktime时长

如果内核在locktime时间内接收到多个ARP报文,仅首个报文生效。对于arp协议,内核默认的locktime时长为1秒钟,可通过PROC文件或者ip命令进行修改。struct neigh_table arp_tbl = { .family = AF_INET, .key_len = 4, .protocol = cpu_to_be16(ETH_P_IP), .hash = arp_hash, .key_eq = arp_ke

2020-10-28 20:31:30 149

原创 邻居表项的STALE状态超时时间

对于arp协议,内核默认的STALE状态超时时长为60秒钟。struct neigh_table arp_tbl = { .family = AF_INET, .key_len = 4, .protocol = cpu_to_be16(ETH_P_IP), ... .id = "arp_cache", .parms = { ... .data = { ...

2020-10-21 19:36:45 265

原创 内核的中断分布

对于x86架构,定义位于arch/x86/include/asm/irq_vectors.h文件中,linux每可使用的有256个IDT(Interrupt Descriptor Table)表项,64位架构每个CPU有一个IDT表,32位架构共享一个IDT表,其分布如下: * Vectors 0 ... 31 : system traps and exceptions - hardcoded events 系统陷阱和异常中断向量 * V

2020-10-20 20:06:06 151

原创 FQ队列detached流管理

对于FQ中的流结构,如果其没有任何要发送的报文,即其为空,将其设置为detached状态,这样的流结构即不在new_flow链表,也不在old_flow链表。在detach设置函数中,不仅将其next指向固定的地址(静态变量detached的地址),而且,记录下其进入detached状态的时间戳。/* special value to mark a detached flow (not on old/new list) */static struct fq_flow detached, throttle

2020-10-19 20:23:30 136

原创 FQ队列throttled流管理

FQ队列中对发送时间未到的流结构单独存放在delayed红黑树中,这样的流结构即不在new_flow链表,也不在old_flow链表,其next指针执行一个特定的值:throttled。内核函数通过检查流结构的next指针,来判断流是否处于throttled状态。new_flow链表中的流结构的优先级高于old_flows中的流。/* special value to mark a detached flow (not on old/new list) */static struct fq_flow

2020-10-17 23:06:18 118

原创 X710网卡接收丢包

通过ethtool命令看到是rx_dropped一项有数值。/ # ethtool -S eth0 | moreNIC statistics: rx_packets: 88037562 tx_packets: 66028257 rx_bytes: 7461153935 tx_bytes: 5612351710 rx_errors: 0 tx_errors: 0 rx_dropped: 372 tx_dropped: 0

2020-10-16 21:30:43 257

原创 使用git sendmail发送补丁

这里使用iproute2工程为例,以下命令安装git-email工具。$ sudo apt-get install git-emailiproute2当前版本是5.8.0,其中文件tc/q_fq.c中有一处笔误。修改完成之后,使用如下命令生成patch文件:$ git format-patch HEAD^0001-tc-fq-clarify-the-length-of-orphan_mask.patch$ 接下来设置git-email相关配置,这里以126邮箱为例:$ git config

2020-10-14 21:09:35 131

原创 FQ队列对quantum的处理

quantum 表示每次出队列轮询的信用值(credit),例如,每个流每次可允许出队列的字节数量。此值设置的较大意味值下一个流等待服务的时间更长,默认为2倍的接口MTU值。static int fq_init(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct fq_sched_data *q = qdisc_priv(sch); int err; sch->lim

2020-10-12 20:09:53 135

原创 内核红黑树-II

还是先列一下红黑树的5个准则。A node is either red or black节点的颜色非红即黑The root is black根节点为黑色All leaves (NULL) are black所有的叶子(NULL)节点都为黑色Both children of every red node are black红色节点的子节点都为黑色Every simple path from root to leaves contains the same number of black n

2020-09-23 20:30:48 115

原创 内核红黑树-I

内核中许多部分使用到红黑树,比如tcp的乱序队列out_of_order_queue,TC中fq公平队列的流表等。以下为红黑树的5个准则:A node is either red or black节点的颜色非红即黑The root is black根节点为黑色All leaves (NULL) are black所有的叶子(NULL)节点都为黑色Both children of every red node are black红色节点的子节点都为黑色Every simple path f

2020-09-19 06:37:35 84

原创 FQ队列流结构回收

在FQ队列中,如果流结构队列为空,并且超过3秒(FQ_GC_AGE)没有接收到相应的报文,系统将其进行回收,如下判断函数fq_gc_candidate。但是在每次fq_gc回收函数执行时,最大释放8个(FQ_GC_MAX)流结构。/* limit number of collected flows per round */#define FQ_GC_MAX 8#define FQ_GC_AGE (3*HZ)static bool fq_gc_candidate(const struct fq_fl

2020-09-17 19:34:32 68

原创 Linux FQ队列操作

在介绍FQ入队列操作之前,先看一下流量的识别部分。1 流量识别对于一些协议报文,比如HSR(High-availability Seamless Redundancy)、IGMP和HDLC等,其将priority字段设置为了TC_PRIO_CONTROL,对于此类报文,FQ使用一个内部特定的流处理(q->internal)。static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q){

2020-09-12 22:51:26 164

原创 DPDK下X710网卡丢包

环境 -处理器:Intel® Xeon® Gold 5122 CPU @ 3.60GHz 4核8线程DPDK: v20.05测试: 4对接口双向对打流量,报文长度1518字节。发现有接口丢包,打印出来接口的统计信息,其中rte_eth_stats->imissed字段有数值,查看获取统计的函数i40e_dev_stats_get,可见imissed由两部分组成:static inti40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_

2020-09-10 08:15:25 480

原创 Linux公平队列FQ接口实现

用户层面的tc配置命令如下:$ sudo tc qdisc add dev ens38 root fq$ $ sudo tc -s qdisc show dev ens38 qdisc fq 8001: root refcnt 2 limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 low_rate_threshold 550Kbit refill_delay 40

2020-09-08 19:19:01 126

原创 Max-Min公平性

Max-Min公平性由Hayden在文章(Round-Robin Scheduling for Max-Min Fairness in Data Networks)中提出,旨在评估队列调度机制的公平性。This section describes the max-min flow criterion, our definition of throughput fairness. The version presented herewas developed by Hayden [9]. Similar

2020-09-07 19:48:42 117

原创 Linux公平队列FQ配置

FQ (Fair Queue)是一个无类别(classless)的报文调度器,其主意用于本地产生的流量。设计为控制每个流的发送节奏(pacing)。FQ完成流的区分,并且可完成TCP层要求的发送节奏。所有的属于一个套接口的报文认为属于一个流(flow)。对于非本地生成的报文(如对于路由器设备),可使用sk_buff结构中的成员hash作为区分流的备选项。应用程序可使用setsockopt系统调用的选项SO_MAX_PACING_RATE指定最大的pacing速率。FQ调度器可在发送报文之间增加延时以达到T

2020-09-04 21:43:32 296

原创 按位实现的队列轮询算法

由于Nagle所提出的队列轮询算法,实际上是以报文为单位进行公平轮询,进而发送报文,但是没有考虑报文大小不同带来的不公平性,导致使用大报文的连接占用较多的网络带宽。来看一下为解决此问题,理想的按照比特位为单位进行的轮询算法。首先,假设一个理论上的队列服务机制,其可以按照比特位轮询方式(bit-by-bit round robin)进行数据发送,这样,此服务机制可保证在任意时刻每个连接队列都可获得公平的带宽服务。使用R(t)表示在t时刻已进行的轮询次数,R(t)为连续函数,分数结果表示当前存在一次还没有完成

2020-08-28 21:59:47 139

原创 Nagle公平队列

为保护正常行为(well-behaved)的源主机流量,免受异常(badly-behaved)主机的影响,或者是在两种流量混合的网络中,确保正常行为的主机获得优于异常主机的流量服务,在RFC970中,Nagle提出了一种公平队列。我们假设一个高带宽的LAN通过网关(交换设备)与WAN相连,LAN网络中的没有流量控制。任何主机如果发送到WAN网络的报文速率超过网关可处理的极限,将会在网关处造成拥塞。如果网关采用先入先出队列(First-In-First-Out),异常行为的主机将严重干扰正常主机的流量。网

2020-08-27 19:22:58 49

原创 snort3安装测试

环境为Ubuntu:$ cat /etc/issueUbuntu 20.04 LTS \n \l首先由github下载源码,这里使用3.0.2版本。~/ips$ wget https://github.com/snort3/snort3/archive/3.0.2-5.tar.gz~/ips$~/ips$ tar -xf 3.0.2-5.tar.gz~/ips$~/ips$ cd snort3-3.0.2-5/~/ips/snort3-3.0.2-5$其次,安装所需的依赖包:~/i

2020-08-19 19:37:29 389 2

原创 Linux内核Adaptive-RED实现

ARED在RED的基础上实现了最大报文标记概率max_P的自动调整,以便将平均队列长度控制在目标区间内。1 ARED初始化在RED初始化函数red_init中,设置ARED定时器adapt_timer用于定期执行ARED算法,定时处理函数为red_adaptative_timer。static int red_init(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct red_sche

2020-08-11 21:34:27 122

原创 内核文件句柄数量

涉及三个文件file-max,file-nr和nr-open。file-maxfile-max定义了Linux内核可分配的最大数量的文件句柄,当检测到文件句柄耗尽时,需要增加file-max值。/ # cat /proc/sys/fs/file-max1597700内核函数files_maxfiles_init计算系统默认的最大文件数量,依据是每个文件及与其关联的inode和dcache结构,总的大小约为1K。默认文件占用的空间不超出内存的10%,file-max的最小值为NR_FILE,即81

2020-08-10 19:43:21 164

原创 RED硬件卸载支持

在RED参数处理的最后,调用red_offload设置RED卸载功能。static int red_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct Qdisc *old_child = NULL, *child = NULL; struct red_sched_data *q = qdisc_priv(sch); struct n

2020-08-06 19:35:00 138

原创 RED统计信息

使用TC命令查看网络设备ens40的队列统计信息,对于RED队列,显示如下,首先是RED配置参数的显示,其次,为统计信息:$ tc -d -s qdisc show dev ens40 qdisc red 8005: root refcnt 2 limit 400000b min 30000b max 100000b ecn harddrop adaptive ewma 5 probability 0.00956593 Scell_log 8 Sent 0 bytes 0 pkt (dropped

2020-08-06 19:11:09 81

WEB Portal 认证完整的交互报文

web认证交互报文,包括WLAN controller与portal server的认证与注销,AC与radius 服务器的认证报文。

2018-04-24

botan-ed25519.pcap

IKEv2协议交互报文,认证方式选用Ed25519算法的证书方式。

2019-10-28

IKEv2-rw-cert2.pcap

strongswan使用linux内核的af_alg加密接口配置,IKEv2协议交互报文。

2019-10-28

IKEv2-camellia.pcap

IKEv2协议使用camellia加密算法的协商报文,交互流程。

2019-10-28

libssh2-1.8.0 and ssh2_batch example

ssh2_batch可执行程序,用于非交互式的ssh命令执行。源代码和libssh2

2018-06-13

redwingz的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除