当前位置: 首页 > 科技观察

一招轻松教你模拟弱网环境

时间:2023-03-12 17:57:05 科技观察

在运维过程中,最复杂的问题就是网络问题,而网络问题最让人头疼的就是无法复现。本文介绍一款功能强大的网络模拟工具Netem。Netem是linux2.6以上内核版本提供的网络模拟功能模块。主要用于在性能良好的网络环境下模拟复杂的网络传输性能,如网络故障时的低带宽、传输延迟、丢包等。Netem由命令行工具tc控制。tc大家应该很熟悉了。tc是iproute2工具包的一部分。它的全称是交通管制。tc主要用于linux内核的流控。它主要通过在输出端口建立队列来实现流量控制。接收报文从输入接口进来后,通过流量限制,丢弃不合规的数据报文。分销商做出判断和选择。如果接收到的数据包的目的是主机,则将数据包发送给上层处理,否则需要转发,将接收到的数据包交给转发块处理。转发块还接收本地上层(TCP、UDP等)生成的包。转发块通过查看路由表来确定处理后的数据包的下一跳,然后安排数据包将它们传输到输出接口。一般我们只能限制网卡发送的数据包,限制网卡接收的数据包不是很好。所以我们可以通过改变发送顺序来控制传输速率。Linux流控主要是在设置输出接口时处理实现的。关于Linux内网包转发,在公众号之前发表的文章《nfstable比iptables强在哪里》中有更详细的介绍,这里就不啰嗦了。感兴趣的可以点击阅读。回到正题,我们主要使用tc工具和Netem模块来模拟网络状态。下面我们就来看看netem模块的强大功能吧。网络状态不佳通常有以下症状:延迟、丢包、乱序、重复、错误等,我们使用netem来模拟以上情况。建议不要在生产环境中测试,掌握后再使用。在tc配置netem的操作中,主要有4个控制参数,分别是add(表示将Netem配置添加到指定网卡)、change(表示修改已有的Netem配置)、replace(表示替换已有的值)Netem配置),del(代表删除网卡上的Netem配置),好了,接下来开始测试几种情况。Simulatedelayedtransmissiontcqdiscadddeveth0rootnetemdaly100ms模拟网络,所有数据包延迟100ms发送。在上面的命令中,qdisc是一个排队规则。没有加规则之前,因为是内网,所以ping延迟是1ms。添加延迟后,在真实网络中增加到100ms。在环境中,我们通常很难看到非常稳定的延迟。不要使用内网,所以netem也考虑到了这一点。模拟延迟参数提供可选参数来控制延迟的时间分布。完整的参数列表如下:YesSee,除了TIME,还有三个可选参数:JITTTER:网络抖动,加入一个随机事件长度,让延迟的事件出现在一定范围内CORRELATION:相关系数,下一条消息delayeventandthepreviousmessageCorrelationcoefficientdistribution:延迟分布,可以选择的值有uniform,normal,pareto,paretonormal。我们先来看看JITTER。如果设置为10ms,则消息延迟事件将在100ms±10ms之间随机选择。效果是CORRELATION指的是数据包之间的相关性,因为网络情况平滑变化,短时间内相邻数据包的延迟应该是近似的,不是完全随机的,这个值是一个百分比,如果是100%,则固定在延迟的情况,如果是0%,就是随机延迟的情况。然后继续看刚才的配置效果,通过正态分布的方式模拟分布,更符合真实的网络情况。它的参数是几种延迟。分发方式,有兴趣的可以尝试模拟丢包率。丢包是网络中最常见的情况。丢包会导致重传,重传会增加网络链路的流量和延迟。netem提供了loss参数,可以模拟丢包率tcqdiscadddeveth0rootnetemloss50%看效果和延时差不多。丢包率还有一个相关系数参数可以设置,表示后包丢包率与前包丢包率的相关性。tcqdiscadddeveth0rootnetemloss50%25%上面的命令表示丢包率为50%,当前丢包的可能性为25%,与上一个包相关。Simulatedpacketrepetition模拟数据包复制。加上duplicate参数,packetduplication和packetloss参数类似,就是repetitionrate和correlation这两个参数,比如随机生成50%duplicatepackettcqdiscaddeveth0rootnetemduplicate50%看效果。相关性与其他参数相同。有兴趣的可以模拟测试数据包损坏模拟参数损坏的消息损坏。消息损坏和消息重复的参数是相似的。例如,30%的随机生成消息是tcqdiscadddeveth0rootnetemcorrupt30%。从icmp_seq可以看到结果。PacketsimulationPacketoutoforder我们知道,为了保证可靠传输,TCP会在报文中加上一个序号,以保证拆分后的数据包能够到达,然后重新组装。最好的情况是可以传输数据包以减少重新排序的需要。次数,虽然乱包带来的影响没有上面那么严重,但是还是经常遇到。netem还提供了模拟乱包的方法,区别于前面的参数。以上操作都是针对单条消息进行的,重排序涉及多条消息的重组,所以Netem有两种模拟重排序的方法。第一个是每隔一定数量的消息固定地重新排序。tcqdiscadddeveth0rootnetemreorder50%gap3delay100ms以上是正常每3个数据包发送一次,其他数据包延迟100ms发送。第二种方法更接近显示情况,是随机的,用概率来选择乱序的包。tcqdisccangedeveth0rootnetemreorder50%15%delay300ms上面的效果是50%的消息正常发送,其他消息延迟300ms发送。在测试配置的过滤条件时,必须检查当前配置的条件。可以通过tc的show命令查看。模拟弱网环境,排查问题,这个工具必不可少,赶紧收藏吧!