简单几招模拟网络超时情况

我们先来聊一聊网络超时的概念,以及模拟网络超时对我们程序的必要性

要想了解如何模拟网络超时的情况,我们需要先了解一下

为什么会网络超时呢

简单的说:就是你向服务端发送数据请求,然尔服务器没返回数据,或返回数据太慢导致未收到返回数据。

比如,你要下载一个东东,你向服务器发送下载这个东东的请求,但等了好长时间都没有收到服务器同意你接收下载数据的请求,所以也不能一直这样等下去,你的电脑就会报告网络超时,如果不是你的网络故障,那么就是对方服务器的问题。

我们知道在TCP建立连接的时候有3次握手的规则

1.      客户端发送’SYN’给服务端

2.      服务端返回确认’SYN_ACK’给客户端

3.      客户端最终确定’ACK’

在这3次握手的时间内,每一次都有可能网络会掉包,我们分析一下每一种掉包的情况:

1.      SYN丢失第一次握手客户端发送SYN掉包的情况:这种情况下,客户端发送的SYN丢失在网络中,没有得到确认,客户端的TCP会超时重发SYN。发送7个SYN后等待一个超时时间(例如:127秒),如果在这段时间内仍然没有收到ACK,则connect返回超时。

2.      SYN-ACK丢失从客户端的角度来讲以前面一种情况类似。从服务端的角度来讲,由LISTEN状态进入SYN_REVD状态。服务端的TCP会重发SYN-ACK,直到超时。SYN攻击正是利用这一原理,攻击方伪造大量的SYN包发送到服务器,服务器对收到的SYN包不断回应SYN-ACK,直到超时。这会浪费服务器大量的资源,甚至导致奔溃。对服务端的应用层来讲,什么也没有发生。因为TCP只有在经过3次握手之后才回通知应用层,有新的连接到来。

3.      ACK丢失这对服务端来讲与2相同。对于客户端来讲,由SYN_SENT状态进入了ESTABLISED状态,即连接成功了。连接成功后客户端就可以发送数据了。

但实际上数据是发送不到服务端的(我们假设客户端收到SYN-ACK之后,客户端与服务端之间的网络就断开了),客户端发送出去的数据得不到确认,一般重发3次左右就会处于等待ACK的状态(win7)。而ubuntu 12.10下,调用send会返回成功,直到TCP的缓冲被填满(测试环境:局域网,感觉这个不是很合理,按照书上所说:应该是使用“指数退避”进行重传 -- TCP/IP协议详解,大概是我的测试环境中有NAT所致

吧)。最终,客户端产生一个复位信号并终止连接。返回给应用程序的结果是Connection time out(errno: 110)

好,理解了3次握手掉包的情况下,我们就很容易实现模拟超时情况的发生,

我们可以在端口上控制服务端无法与客户端握手成功来让超时的情况发生

具体的实现要用到 iptables 这个命令

iptables-A OUTPUT -p tcp -m tcp --tcp-flags SYN SYN --sport 9090 -j DROP

这个命令是用来drop 掉响应SYN的返回

之前我们看到第一次客服端向服务器请求SYN的握手信息,而这个命令就是阻止服务器返回SYN_ACK的确认握手信息,这样客户端就无法收到服务端的握手确认信息了.

上面这种情况是模拟连接没有成功的情况

下面还有一种情况,就是连接已经成功了,但是在传输数据的时候,服务端没有及时返回数据,我们来看看这种情况是如何模拟的:

iptables -A OUTPUT -p tcp -m tcp --tcp-flags PSH PSH --sport 9090 -j DROP

细心的童鞋会发现,这里用到的flags 是PSH ,对,PSH的意思是控制信息是可以正常传送的,也就是说握手是正常成功的,然后传输数据的时候,我们限制了服务器无法给客户端传送数据内容,这样就模拟了连接是成功的,但是无法正常读取到服务端的数据的超时情况了

上面说的是最简单手动设置超时的方式,当然还有神器可以使用,接着就献上这款神器名叫netem,地址在

http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

Network Emulation 有兴趣的童鞋可以前往研究。

Gerry

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-28 17:09:08

简单几招模拟网络超时情况的相关文章

简单十招提高jQuery执行效率

1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的jQuery选择语句: $('.elem') $('.elem', context) context.find('.elem') 我们用1.4.2.1.4.4.1.6.2三个版本的jQuery测试,看看浏览器在1秒内能够执行多少次.结果如下: 可以看到,1.6.2版本的运行次数,远远超过两个老版本.尤

redis分布式锁深度剖析(超时情况)

1.redis分布式锁的基本实现 redis加锁命令: SETNX resource_name my_random_value PX 30000 这个命令的作用是在只有这个key不存在的时候才会设置这个key的值(NX选项的作用),超时时间设为30000毫秒(PX选项的作用) 这个key的值设为“my_random_value”.这个值必须在所有获取锁请求的客户端里保持唯一. SETNX 值保持唯一的是为了确保安全的释放锁,避免误删其他客户端得到的锁.举个例子,一个客户端拿到了锁,被某个操作阻塞

Win10系统出问题?简单一招即可修复win10!

时至今日,win10系统的普及率越来越高,在微软多种策略的强推下,10月份win10系统的市场份额已达22.59%,但win10系统也不是完美的,总有些还是会出现一些诸如打开应用程序出现闪退.乱码.总是弹出错误提示等,而之所以会出现这些问题,有可能是系统文件损坏了. 那么,遇到这些情况该怎么办?有一个简单的办法那就是直接用Dism命令修复即可,具体方法如下: 1.使用win+x快捷键打开菜单,选择"命令提示符(管理员)(A)",如下图所示: 2.打开后依次执行下面两条命令: DISM.

简单几招提速 Kotlin Kapt编译

https://droidyue.com/blog/2019/08/18/faster-kapt/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 应用Kotlin之后,涉及到注解的注解处理器依赖也会由annotationProcessor替换成kapt,和最初应用Kotlin一样,总会让人一种感觉,一番应用Kotlin和Kapt之后,编译耗时更长了,不过好在Kotlin和Google 在这一方面做了很多的优化和改进,

简单一招实现json数据可视化

开发一个内部功能时碰到的需求,要把json数据在页面上展示出来,平时浏览器会安装jsonView这样的扩展来看json数据,但是程序要用到的话该怎么办呢?今天在网上搜索的时候,发现了这个小技巧,分享一下. 要用到的核心是JSON.stringify这个函数,没想到吧,平时我们只把它用来序列号json数据.但是这个stringify是有三个参数的, JSON.stringify(value [, replacer] [, space]) ,具体描述请看这里:https://msdn.microso

20.超时情况下的服务降级写法

在hystrix的超时回调函数中处理超时推荐其他商品 package main import ( "errors" "fmt" "github.com/afex/hystrix-go/hystrix" "math/rand" "time" ) type Product struct { ID int Title string Price int } func getProduct() (Product, e

简单几招删除MindManger中的幻灯片

MindManager 15中文版中,许多用户为了对制作的导图进行审阅和检查,会运用到幻灯片功能,将主题单独列出,也可以扩大细节.同样的,在完成对思维导图的检查后,用户可以幻灯片进行删除,恢复导图,文章主要讲解的是如何在MindManager 15中文版中删除幻灯片. 打开在MindManager 15中文版思维导图软件,制作好幻灯片后,在主题后会显示幻灯片图标. 在界面的左侧也会有幻灯片任务版面出现,其中会显现幻灯片主题. 在需要对幻灯片进行删除时,点击任务版面内的主题,右击在出现的对话框内选

Promise超时情况

export const ERROR_PROMISE_TIMEOUT = 'ERROR_PROMISE_TIMEOUT'; export default function (promise, timeout) { let timer = undefined; return Promise.race([ new Promise(function (resolve, reject) { timer = setTimeout(() => { reject(new Error(ERROR_PROMISE

简单三招,看清理财产品真面目

理财产品可分为如下三类 收利息的产品 原理:通过把钱借给别人,获得收益. 这类产品主要包括:银行存款.P2P.国债.企业债等. 做买卖的产品 原理,通过购买资产,赚得收益. 这类产品主要包括:股票.房子.黄金.外汇等. 雇人投资的产品 原理:通过花钱雇佣专业的投资人士,来帮你做投资,获得收益. 这类产品主要包括:基金公司发行的基金.银行发行的理财产品.证券公司发现的券商集合理财计划和信托公司发行的信托理财产品等. 原文地址:https://www.cnblogs.com/youcong/p/11