自定义博客皮肤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内核网络、虚拟化

  • 博客(527)
  • 资源 (5)
  • 论坛 (1)

原创 邻居表项的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 22

原创 内核的中断分布

对于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 24

原创 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 16

原创 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 23

原创 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 28

原创 使用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 13

原创 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 30

原创 内核红黑树-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 19

原创 内核红黑树-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 34

原创 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 33

原创 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 52

原创 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 152

原创 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 46

原创 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 44

原创 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 97

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

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

2020-08-28 21:59:47 54

原创 Nagle公平队列

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

2020-08-27 19:22:58 29

原创 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 182 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 87

原创 内核文件句柄数量

涉及三个文件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 100

原创 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 79

原创 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 56

原创 Linux内核RED队列实现

关于RED队列的TC配置命令,参见:RED队列tc设置。1 RED入队列首先计算平均队列长度qavg,参见之后函数red_calc_qavg的介绍。如果队列处于空闲状态,退出空闲状态,清空空闲开始时间戳。static int red_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free){ struct red_sched_data *q = qdisc_priv(sch); struct Q

2020-08-05 19:41:03 86

原创 RED队列tc设置

如下tc命令配置RED(Random Early Detection)队列。$ sudo tc qdisc add dev ens40 root red limit 400000 min 30000 max 100000 avpkt 1000 probability 0.02 burst 55 ecn adaptive harddrop bandwidth 1000Mbit $ $ tc -d -s qdisc show dev ens40 qdisc red 8005: ro

2020-08-04 19:36:40 122

原创 Adaptive-RED队列

RED通过平均队列长度的增长,增加报文的随机丢弃(或标记)概率,来实现主动队列管理(AQM)。当平均队列长度avg由设置的最小阈值(minth)向最大阈值(maxth)增长时,报文的丢弃概率由零增长到最大概率值maxp。RED的一个主要目的就是使用平均队列长度(容许突发流量)和拥塞预先通知(减低平均队列长度)来达到高吞吐和较低的平均队列时延。但是,RED的一个缺陷是,平均队列长度随着拥塞程度和RED参数的设置而变化。当链路轻度拥塞,或者maxp设置的较大时,平均队列长度接近minth。反之,当链路严重拥塞

2020-07-28 22:15:25 65

原创 DPDK示例l3fwd性能测试

测试环境CPU: Intel® Xeon® Gold 5122 CPU @ 3.60GHzCache: 16896 KBMemory: 16GX710 driver: i40e-2.11.29X710 expansion-rom-version: 4.53 0x80001cdf 0.0.0DPDK: dpdk-20.05BIOS设置CPU Power and Performance Policy CPU C-state Disabled

2020-07-27 19:19:24 209

原创 RED队列算法 - 实现

RED算法的大部分工作都可以与报文的转发处理并行进行,两个主要算法包括平均队列长度avg和报文标记概率pb计算,也可以按照低优先级任务执行,因此,RED完全可使用在高速网络中。如果RED标记报文的方式不是丢弃报文,而是设置报文头部中的拥塞标志位(ECN方式),后者将影响报文的转发。但是,因为RED的随机算法被设计用来标记尽量少的报文,从而对转发的影响并不大。对于每个接收到的报文,RED计算平均队列长度avg,如下实现:avg←(1−wq)avg+wqq=avg+wq(q−avg)avg \lefta

2020-07-25 20:37:13 132

原创 fuchsia编译

fuchsia代码主要在搜索网站的源码站,本地开发环境为Ubuntu 16.04.3,如下:$ cat /etc/issueUbuntu 16.04.3 LTS \n \l以下命令下载fuchsia工程代码,curl的-s选项开启静默模式,减少打印信息:$ curl -s "https://fuchsia.googlesource.com/fuchsia/+/master/scripts/bootstrap?format=TEXT" | base64 --decode | bash.

2020-07-24 10:19:07 1478

原创 RED队列

RED(Random Early Detection)算法旨在将队列的平均长度保持在较低的值,同时,允许一定量的突发报文。在发生拥塞期间,RED以一定的概率通知(丢包或者ECN机制)某个连接减低窗口值,此概率大致上与该连接占用的带宽份额成比例。RED设计用来与传输层协议如TCP等一起使用。另外,RED还可避免过多的连接同时减低窗口的现象发生。RED使用一个带有EWMA(Exponential Weighted Moving Average)的LPF(Low-Pass Filter)低通滤波器来计算平均队列

2020-07-24 09:50:15 92

原创 rtnetlink消息解析遇到的问题记录

折腾了两天一个解析rtnetlink消息的程序,总是莫名其妙的crash,最终发现是rtattr数组定的时候忘记了加一。之后,查看了一下iproute2中的代码,如下解析IP地址的函数,rta_tb数组的个数为:IFA_MAX+1,进行了加一操作。int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg){ struct ifaddrmsg *ifa = NLMSG_DATA(n); i

2020-07-15 22:07:58 75

原创 SFB队列

SFB(Stochastic Fair Blue)是一个FIFO类型的队列算法,基于类似于BLUE算法的记账机制,来标识非响应性质的流,并且限制其速率(这类流不处理ECN或者丢包事件)。SFB的记账系统由L*N个桶(bin)组成,其中L表示级别,N表示每个级别的桶的数量。Linux内核中使用8个级别,每个级别16个桶用于记账。 37 #define SFB_BUCKET_SHIFT 4 38 #define SFB_NUMBUCKETS (1 << SFB_BUCKET_SHIFT) /*

2020-07-13 23:06:54 109

原创 DPDK基础库LPM

DPDK中LPM(Longest Prefix Match)的实现,使用了DIR-24-8算法的一个变种,实际上就是用空间换时间。其由一个224大小的表,和256(RTE_LPM_TBL8_NUM_GROUPS)个大小为28的表组成。前者叫做tbl24,可使用IP地址的前24位进行索引。后者叫做tbl8,可使用IP地址的后8位进行索引。理论上,tbl8表的数量应为2^24个,但是考虑的内存的消耗,DPDK默认仅设置为256,事实上长度超过24位的路由表项并不多见。LPM初始化LPM的主要配置参数就是支

2020-07-09 22:31:56 129

原创 DPDK-l3fwd示例IPv6测试

测试环境操作系统: Ubuntu 20.04 LTS;处理器为: Intel® Core™ i7-4790K CPU @ 4.00GHz。网卡使用的是Intel的X710万兆网卡。DPDK版本19.02。测试拓扑: |----------------| | Ubuntu(DPDK) | | |

2020-07-05 20:49:26 191

原创 测试DPDK示例程序l3fwd

测试环境操作系统: Ubuntu 20.04 LTS;处理器为: Intel® Core™ i7-4790K CPU @ 4.00GHz。网卡使用的是Intel的I210千兆网卡。DPDK版本19.02。测试拓扑: |----------------| | Ubuntu(DPDK) | | |

2020-07-02 22:28:00 290

原创 TCP-Westwood拥塞算法

TCP-Westwood在TCP-Reno的基础上增强了窗口控制和退避处理,例如,TCPW发送端监控ACK报文的接收速率,进而估算当前连接可达到的数据发送速率(可用带宽)。当发送端检测到丢包时(超时或者3个重复ACK),发送端根据估算的发送速率设置拥塞窗口大小(cwnd)和慢启动阈值(ssthresh)。不同于TCP-Reno的窗口减半处理,TCP-Westwood避免太过保守的减低窗口操作,TCP-Westwood称此为:Faster-Recovery。与TCP-Reno相比,TCP-Westwood更适

2020-06-30 22:08:37 237

原创 TCP-Hybla拥塞算法

TCP Hybla算法的改进是对于RTT较长的连接(例如卫星和无线网络)可获得与参考TCP连接(如,有线网络)相同的瞬时发送速率B(t)。TCP的发送速率计算如下(W(t)表示t时刻的发送窗口值):B(t)=W(t)/RTT(1)\tag{1} B(t)=W(t)/RTTB(t)=W(t)/RTT(1)对于传统TCP,发送窗口计算如下:W(t)={2t/RTT if 0≤t<tγ,SSt−tγRTT+γ if t>tγ,CA(2)\tag{2}

2020-06-20 21:49:40 223

原创 TCP-Reno拥塞算法

经典的Reno算法实现了三个拥塞函数,如下所示:struct tcp_congestion_ops tcp_reno = { .flags = TCP_CONG_NON_RESTRICTED, .name = "reno", .owner = THIS_MODULE, .ssthresh = tcp_reno_ssthresh, .cong_avoid = tcp_reno_cong_avoid, .undo_cwnd

2020-06-16 22:30:12 651

原创 H-TCP拥塞算法

根据对AIMD拥塞算法的观察,对于传统网络,增加值α应当足够小,以便于同传统TCP拥塞算法(Reno/NewReno)相兼容;而对于高速和长距离(high-speed and long distance)网络,可增大α的值,以便获取额外的带宽。基于以上判断,H-TCP通过动态的调整α和β的值,来达到合理利用高速长距离网络的带宽,而又可在传统网络中与标准TCP保持友善性的目的。在高速模式下,增长参数α的值等于αH(Δ)\alpha^{H}(\Delta )αH(Δ).在低速模式下,增长参数alpha的值等于

2020-06-15 22:04:01 166

原创 TCP客户端端口号选择

如下函数inet_hash_connect,如果没有指定绑定的接口,在发起连接的时候,由函数inet_sk_port_offset先选择一个端口偏移量(port_offset),函数__inet_hash_connect负责绑定端口。int inet_hash_connect(struct inet_timewait_death_row *death_row, struct sock *sk){ u32 port_offset = 0; if (!inet_sk(sk)->ine

2020-06-10 22:03:37 485

原创 TCP监听端口选择

内核提供了两个PROC文件可以控制套接口使用的端口号范围,其中文件ipv4_local_port_range定义了可使用的端口范围;文件ip_local_reserved_ports定义了保留的端口范围。static struct ctl_table ipv4_net_table[] = { { .procname = "ip_local_port_range", .maxlen = sizeof(init_net.ipv4.ip_local_ports

2020-06-09 23:32:47 450

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

WEB Portal 认证完整的交互报文

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

2018-04-24

redwingz的留言板

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

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