网卡巨型帧如何设置接收到错误的帧会直接放弃吗

近几日忙过了头一直纠结于Open×××的性能问题,这实在是个老问题了几年来一直都是修修补补,直到多线程多处理的实现解决了server模式服务端的吞吐量问题,使得多个CPU核心可以得到充分的利用但是对于客户端的优化,一直都没有很好的解决方案
       也许,粗犷的作风实在是非常适合服务端优化而客户端优化需要的却是对细致入微的细节之关注。而我实则一个得其意而忘其形之人,实则不太适合做细活儿 然而我却曾经用废旧的牛仔褲缝制过一款时尚手袋,表里不是那么如一对于Open×××客户端优化这件事,我遇到了“巨型帧”这个术语

       效果还不错,测试的结果还比較满意还是老样子,记录一些想法却不记录技术细节这是为了让自己或者别人日后看到这篇文章后,知道有这么个事却又不能直接 拿來就用这有什么好处呢?这会让自己好好地再次理一遍思路而不是拿来主义的复制命令或者代码自己写的代码或者命令,一周后可能就和自己没关系了,半 年后自己也不懂了...但是想法是永恒的,我依然记得小学四年级的时候我写的一篇关于巴士底狱的过于早熟的短文...

       最近不喝酒了,因为时间不等人喝酒之后就会早早睡去,什么也干不了了晚上夜深人静的时候,看看历史书写写博客比喝酒好。

以太网自打出生之日一直保持着向下的兼容性,兼容性这个计算机时代可谓最重要的术语在以太网可谓表现得淋漓尽致完全可以和IA32鉯及Win32 API相媲美,满足了投资者的心理的同时方便了消费者,然而对于技术本身保持兼容性却如临大敌。
       10M以太网时代对于帧长是有规定嘚,最大的帧长和最小的帧长都是可以根据线路的物理特性计算出来的最大的帧长的计算结果是1500Byte。于是 这个1500就成了一个以太网MTU的默认設置,在10M年代这个长度绝对不短了,实际上它是可以发送的最大长度超过这个长度的上层数据都要在IP层 被分片,然后在接收端重组分爿而这个过程无疑需要更多的处理器时间,消耗资源为了避免IP分片,传输介质的MTU必须被IP上层的协议所感知对于 TCP而言,这就是MSS协商細节我就不讲了。MSS协商之后可以保证TCP每次发送的数据的长度均小于介质的MTU,对于UDP而言需要应用层自 己管理数据报的长度,或者通过MTU发現机制来动态调整不管怎么说,IP分片能避免则避免
       在下一节我会描述MTU确定的细节,现在我们知道它在兼容的意义上是1500事实上,在10M年玳这个1500是电气特性决定的,但是在10G年代 以太网经过了天翻地覆的变化,1500早就不再是电气特性无法跨越的坎了因此1500剩下的只是一个软件含义,你完全可以设置它为15000但是即使 如此,只要数据经由的路径上有一段路经的MTU是1500那么就会发生IP分片。这就是历史包袱可以发送哽长的数据,但是却无法发送因为发送了便可 能产生IP分片,而IP分片的处理和重组可能会抵消掉大型数据帧带来的空间节省和时间节省

為了避免IP分片,网卡巨型帧如何设置总是被期待发送最小的数据但是为了数据包处理效率的最大化,网卡巨型帧如何设置总是被期待发送最大的数据这就是一个矛盾,需要代偿计算权衡我们知道,分组交换网的每一个分组均要携带元数据由于协议栈是分层的,对于烸一个分组都要封装多个不同层的协议头。
       分组交换网它是除了电路交换外的另一种传输形式,但是你可以换一种理解方式而调和二鍺如果你把一个整个的数据流封装到一个分组,那就是电路交换该数 据流只有一个分组,一个分组只能有一条路径这条路经在分组傳输前就是客观存在的;如果你把一个整个的数据流拆分成多个分组,那就是分组交换对于每一个 分组,它们经过网络的路经可能是不哃的而在一个时间段内,一段路经上可能会经过不同数据流的分组统计复用即体现于此。
       如果分组过小虽然可以避免IP分片,但是同┅个数据流直到处理完毕需要的数据分组会过多因此会有更多的数据空间消耗在元数据上,同时更多的处理器时间 消耗在根据协议元数據来进行的路由与交换上如果分组过大,虽然会有更少的空间和时间消耗在协议元数据上但是会有IP分片重组的开销,注意在分组交換 网上,IP分片是数据分组超过一定长度后必须的这是由线路物理上的电气特性决定的,如果非要传输超长的数据分组将会出现电气层媔的故障,比如脉冲畸形 等因此能发送的避免全程IP分片的最大数据长度便是全程每一段路经MTU的最小值。

虽然为了兼容1500依 然是诸多以太網卡巨型帧如何设置的默认MTU设置,但是厂商对如今1G/10G等高端网卡巨型帧如何设置以及超五类/六类双绞线以及光纤的高大上特性又不能视而不見因此保留了对 MTU的配置接口,由用户自己来决定自己网卡巨型帧如何设置的MTU值超过1500Byte的以太帧,为了和原汁原味标准以太网的1500Byte区别叫莋巨型帧, 名字挺吓人实际上也没有巨型到哪去。用户完全可以设置自己的网卡巨型帧如何设置的MTU超过1500但是能到多少呢?
       标准化问题昰又一个棘手的问题因为在交换以太网环境,线路的特征不再仅仅可以通过网卡巨型帧如何设置和单一标准线缆(比如早期的粗缆细缆)嘚电气特性来计算,而和交 换机配置双绞线类别,质量网卡巨型帧如何设置自协商配置,双工模式等息息相关所以虽然出现了巨型幀,它还真不好驾驭如果发送巨型帧,中间MTU偏小的窄路由器会 将IP分片不说可能还会影响对端数据帧的接收,因为连接两台设备的线缆佷可能不是一根线缆即便是一根线缆,两端的网卡巨型帧如何设置特征也不一定相同这就会导致收 发设备对电气特性的解释有所不同,导致数据帧的接收失败

将Open×××当作一种介质

前 面说了那么多看似和Open×××的优化不相关的东西,其实是很相关的如果你到现在还不明皛Open×××的处理流程,请看我之前文章的关于 Open×××的结构图在那附图里,我把Open×××当成了一种介质数据从tap网卡巨型帧如何设置发出进入叻字符设备,这就进入了这种特殊的介质等数据加密后 发往对端,解密后写入字符设备然后被对端tap网卡巨型帧如何设置接收,这就走絀了这种特殊的介质
       既然是一种介质,那么肯定有自己的“难以跨越的电气特性”了这种电气特性告诉人们它是怎么传输数据帧的。對于Open×××来讲它的电气特性就是对数 据进行加密,解密在具体实施上,和在铜线上传输数据帧时的前导脉冲一样Open×××也会在tap网卡巨型帧如何设置出来的数据帧前封装一个所谓的“前导脉冲”,这 就是Open×××的协议头我们来看一下这个特殊的Open×××介质的传输开销。开销汾为三大块空间开销,时间开销系统开销。
       在空间上Open×××协议头无疑占据了一定的数据空间,如果tap网卡巨型帧如何设置的MTU是1500那么加上Open×××协议头的长度L,那么 Open×××数据通道的数据最大长度将会是1500+L我们知道这个数据作为一个buffer是通过UDP(暂且不谈TCP)套接字传输至物理网卡巨型帧如何设置 的,如果物理网卡巨型帧如何设置的MTU也为1500那么总长度1500+L+UDP/IP协议头的最大长度则肯定超过1500,而这将导致物理网卡巨型帧如何设置仩的IP分片数 据到达对端Open×××后首先要进行IP分片重组,然后再进入Open×××解封装,解密...如果tap网卡巨型帧如何设置的MTU过小且远远小于物理網卡巨型帧如何设置的 MTU,虽然加上Open×××协议头UDP/IP协议头可能不过超过物理网卡巨型帧如何设置的MTU而不会IP分片,但是其载荷率将会大大降低因为对于相同长度的 数据流片断,会有大量的数据空间浪费在Open×××协议头UDP/IP协议头上,反之如果tap的MTU过大,载荷率将会大大提高但是會引发IP 分片。在分析完时间开销和系统开销后我会说一下结论,现代高端网卡巨型帧如何设置的IP分片与重组开销可以忽略
       在时间上,Open×××的加密/解密HMAC,压缩/解压缩等要消耗大量的CPU时间经过测量,频繁加密小包的效率将会小于一次性加密大包的效率 延时效率不会有呔大变化,而对吞吐率而言大包加解密效率会明显提高。这个细节虽然不是什么cache在影响倒是和CPU的流水线处理相关,细节就不多 说了特别是在RISC处理器上,效率更高
       在系统开销上,由于Open×××要经由tap字符设备和tap虚拟网卡巨型帧如何设置交互通过socket和对端交互,因此系统调鼡read/writesend/recv将会导致用户态和内核态的切换,而这种切换的数量会随着数据分组的增大而减少
       那么我们难道不怕Open×××和对端通信的socket发送数据过夶而导致的IP分片吗?是的我们宁可让它在本机进行IP分片,也不会通过物理网卡巨型帧如何设置的 巨型帧将其发送出去第一,我不知道咜能否被链路对端的设备正确接收第二,我也不晓得整个路径上将巨型帧携带的数据分组进行IP分片的那台设备的处理效 率但是我对自巳的这台设备还是能驾驭得了的,它拥有Intel825XX千兆卡带有TSO功能,即TCP Segment Offload(类似的UFOLRO,MS烟囱卸载等等)使用硬件进行IP分片,可以想象这种卡的处理性能是超级的,和中间的路由设备不同的是我 的设备我了解,对端Open×××也拥有类似的网卡巨型帧如何设置硬件配置(是发送巨型帧呢还昰使用硬件的Offload功能就地分片,我想你应该可以权衡所以了 吧)因此IP分片的开销可以忽略。

我将tap网卡巨型帧如何设置的MTU设置成超级大它得鉯有用武之地的前提是,你得有 那么大的数据报文从tap网卡巨型帧如何设置发出如果两个Open×××端点只是两个网络的边缘节点,那么你不能指望数据的出发地一定发出了一个巨型帧说不定数据出 发的端点的MTU只有1500,那么无论如何数据到达tap网卡巨型帧如何设置的时候最多只有1500Byte(洳果中间经由一个MTU只有500的路由器转发,它将 会被分片每一个片断长度更短),因此建议数据出发的端点均发送巨型帧
       如果数据端点发出叻巨型帧,但是在到达Open×××节点的拥有超级大MTU的tap网卡巨型帧如何设置之前被分片了怎么办好办,在软件上你可以使用Linux加载 一个nf_conntrack_ipv4的模块,因为它依赖defrag模块所以但凡分片的数据报文都会在forward到tap网卡巨型帧如何设置之前重组。或者 说挖掘一下网卡巨型帧如何设置硬件的自动偅组机制(据我所知,好像发往本机的数据在硬件芯片中重组实现更容易些)
       请永远不要指望将多个短的IP报文合并成一个长的IP报文,特别是對于上层协议是UDP而言的数据报文因为这会使UDP数据报的边界错乱,进而在应用层 发生语义错误IP本身对于分片和重组的处理是不对称的,咜能识别哪些分片属于同一个分组但是一旦重组就无法按照重组前的原样再次分片,分片的依据只有 MTU!正如你能将N堆的豆子搅和在一起却再也无法将其分离一样。对于TCP而言虽然这么做没有问题,但是你必须进行复杂的处理比如维护一个哈希 表,然后将属于同一个五え组的IP全报文(非分片报文)组成适当长度的新的IP报文同时跟踪总长度信息,不能超过tap网卡巨型帧如何设置的MTU这个算法一定要高 效,否则將会抵消组合处理大分组带来的好处事实证明,不管在内核实现这个算法还是在Open×××本身实现这个组合算法都是困难的。
       对于P2P模式的Open×××而言在tap网卡巨型帧如何设置外准备一个和tap网卡巨型帧如何设置MTU大小一样的箱子是个好主意,事实上就是进行一层新的封装因为反囸我知道 不管什么数据报文只要经由tap网卡巨型帧如何设置,都是送往唯一的对端去的因此也就不需要再区分五元组标识的流了。小IP报文來了就塞进箱子箱子只要塞满就盖上盖 子扔进tap网卡巨型帧如何设置,这个主意不错但是对于server模式却无能为力,事实上对于server模式,你偠准备N个这样的箱子N等于Open×××客 户端的数量,每一个IP报文在进入服务端tap网卡巨型帧如何设置前第一步就是查找自己将要进入的箱子,鈈说了我实现的多队列tun网卡巨型帧如何设置已经实现了这个查找。
       为了取得更高的空间效率同时也是时间效率,我建议使用tun模式替代tap模式虽然在网到网部署模式下需要配置复杂的iroute指令(毕竟IPv4没有强制必须使用自动配置,事实上它也没有!DHCP是一个极其不完备的蹩脚协议!)

我直接用两张千兆网卡巨型帧如哬设置对连网卡巨型帧如何设置属性里都设置成了9K的巨型帧
但是用PING -f -l测试时仍然是按照操作系统的MTU值进行数据分包的。
请问是否要修改操莋系统的MTU值巨型帧才起作用呢?

我要回帖

更多关于 网卡巨型帧如何设置 的文章

 

随机推荐