随笔分类 - kernel
摘要:简介 在Linux中安装了802.1Q标签VLAN功能。VLAN是虚拟分配以太网的功能。使用VLAN ID从物理上将一个以太网分割开。在VLAN环境下,具有相同VLAN ID就可以相互通信,但是即使将LAN线连接到相同集线器或交换机上,VLAN ID不同也不能相互通信。802.1Q的以太帧格式由上...
阅读全文
摘要:在字节缓存中我们需要考虑缓存比,为了达到缓存的效果,我们需要对数据包的内容进行切分。目前学术上的切分方法如下: 上图中的9种方法可以根据方法自身的特性分为三类。第一类:位置分类法,此方法按固定大小将数据切分。其方法的优势的计算开销很小,但是对数据变化很敏感。第二类:取样法,MODP、WINN、M...
阅读全文
摘要:实验目标: 对数据包负载文件进行分割,可以让分割块近似1000字节。背景: PACK是一种基于接收端的字节缓存算法。核心思想是利用当前的数据预测下一步需要接收的数据。但是数据块不应该被分割的太小,这样的话会耗费过多的内存和磁盘; 当然也不能分割的太大,数据块过大会导致预测的命中率降低。具体的PA...
阅读全文
摘要:1.字节缓存的基本原理 数据压缩也被称作基本压缩,或无损压缩,一般采用 LZ 系列压缩算法。数据压缩具有自包含性:即对端解压缩方只根据数据包本身:即可进行解压还原,不需要其它任何信息。压缩比因数据类型而异:文本数据压缩比最大,各种网页、Windows office 文件(Excel、word 等等...
阅读全文
摘要:简述 MPTCP的拥塞控制对TCP的拥塞控制的线性增加阶段进行了修改,而慢启动,快速重传、快速恢复都没有改变。每条子路径拥有自己的cwnd,MPTCP的拥塞算法主要关心cwnd的改变。拥塞算法设计原则MPTCP的Throughput 要达到MPTCP中所有子路径中最好的一条路径MPTCP应该和普通...
阅读全文
摘要:简述 TCP使用定时器函数tcp_retransmit_timer进行数据重发,MPTCP需要重发数据的时候,不仅仅在原路径发送数据,而且会在另外一条子路径进行重发。这样考虑的原因是:考虑网络中间件设备的影响, 保证子路径上数据序列号的完整性。目前的版本0.89依然如此实现,以后应该会优化。内核实...
阅读全文
摘要:简述: 在TCP协议中影响数据发送的三个因素分别为:发送端窗口值、接收端窗口值和拥塞窗口值。本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理。接收端窗口值的初始化 根据《MPTCP 源码分析(二) 建立子路径》中描述服务端在发送完SYN/ACK并接收到ACK的时候建立新的so...
阅读全文
摘要:简述: MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条路径来发送数据。MPTCP在接收数据方面与TCP的区别是子路径对无序包进行重排后,MPTCP的mpcb需要多所有子路径的包进行排序。查看图1可知。 +----...
阅读全文
摘要:简述: 支持MPTCP的链路中存在多条子路径,因此在发送数据的时候需要选择最优路径来进行操作。MPTCP利用内核通知链对MPTCP中各子路径进行增加路径、删除路径、修改路径优先级的操作。MPTCP根据相应的策略进行路径选择。路径选择的代码实现 路径选择的关键在于从多个子路径中选择其中一个进行数据...
阅读全文
摘要:简述 MPTCP在进行三次握手之后,客户端和服务端会进行地址信息的交换,让对方知道彼此未用的地址信息。当客户端知道服务端的地址后就可以建立其他子路径。三次握手和建立子路径的过程如图1: 图1关于Token、随机数R、以及HMAC(Hash-based Messa...
阅读全文
摘要:简述: MPTCP依然按照正常的TCP进行三次握手,只是在握手过程中增加了MPTCP特有的信息。建立过程 三次握手过程如下图所示: 左边客户端发送的第一个SYN包携带有客户端自身的KEY,右边发送SYN/ACK的时候携带了自身的KEY,而最后左边的客户端发送最后一个ACK的时候携带着双方的KE...
阅读全文
摘要:背景 随着技术的发展许多设备具有了多个网络接口,而TCP依然是一个单线路的协议,在TCP的通信过程中发端和收端都不能随意变换地址。我们可以利用多个网络接口的这一特性来改善性能和有效冗余。例如:你的手机同时连接WIFI信号和3G信号的时候,如果WIFI关掉,使用WIFI进行的TCP连接就会断开,而不...
阅读全文
摘要:1.背景网卡接收一个数据包的情况下,会经过三个阶段:- 网卡产生硬件中断通知CPU有包到达- 通过软中断处理此数据包- 在用户态程序处理此数据包在SMP体系下,这三个阶段有可能在3个不同的CPU上处理,如下图所示:而RFS的目标就是增加CPU缓存的命中率从而提高网络延迟。当使用RFS后,其效果如下:...
阅读全文
摘要:背景: 内核接收分组的方式有两种:第一种:传统方式,使用中断的方式;第二种:NAPI,使用中断和轮询结合的方式。中断方式: 下图为一个分组到达NIC之后,该分组穿过内核到达网络层函数的路径。此图的下半部分为中断处理,上半部分为软中断。在中断处理中,函数net_interupt是设备驱动程序的...
阅读全文
摘要:1 service irqbalance stop 2 3 #@irqnum:网卡eth2的中断数 4 #@cpunum:CPU数目 5 irqnum=`cat /proc/interrupts | grep eth2.*- | awk -F : '{print $1}' | awk '{pri...
阅读全文
摘要:此命令用于调整C源码的格式。在LKD中的例子:indent -kr -i8 -ts8 -sob -l80 -ss -bs -psl filename参数解释如下:-i :设置缩进的格数-ts :设置tab的长度-sob: 删除多余的空白行-l: 设置缩排的格数-ss: 若for或while部分(含条...
阅读全文
摘要:在编写应用层代码中使用位图,发现内核中已经有现成的实现便使用之。对位图的使用主要是几个关键API。第一:bitmap_zero函数用于初始化位图源码如下:/* *@dst: 位图的起始地址 *@nbits: 位图的个数 */static inline void bitmap_zero(unsig...
阅读全文
摘要:函数 dev_queue_xmit()用于直接使用sk_buf发包,此函数有返回值,但是并不能通过此函数返回值为0来说明包已经发送出去且可以立刻释放sk_buff内存。因为网卡发包是一个异步的过程,比如ixgbe网卡驱动发包过程可以查看此文。因此,解决办法是在skb_buff->uers没有减少的情...
阅读全文
摘要:实现功能:使用自己已经分配的内存让skb->data指向,而不是使用alloc_malloc()。部分代码如下: 1 /* 2 * build a new sk_buff 3 */ 4 //stru...
阅读全文
摘要:前提:pf_ring.ko 运行在模式2收包实验: 使用两台机器同时对装PF_RING的机器进行发包,此机器的网卡流量达到14M的效果。如下所示:上图为PF_RING自己的例子程序pf_count在用户态统计。如下所示为脚本监控网卡情况:后面出现丢包是因为程序停止运行。实验过程中CPU的运行情况...
阅读全文