用clumsy模拟丢包测试socket库的失败重传
用python的socket库写了通信小程序,现在我需要通过软件模拟出在网络极差的情况下,socket底层解决丢包问题的能力怎么样,我一开始想的是分别在linux和windowns下分别测试,后来一想,不管是什么操作系统,发送数据包都是端口发送的,那么不管是在什么操作系统下,只要测试软件能控制端口发送的数据包,那么就能模拟出各种丢包情况,因此我在 Windows 平台下用clumsy 能人工造成不稳定的网络状况,在写两个测试程序,两个程序通过tcp通道传输一张图片
服务端程序
import socket
def tcp_srv():
# 1. 建立socket负责具体通信,这个socket其实只负责接受对方的请求,真正通信的是链接后重新建立的socket
# 需要用到两个参数
# AF_INET: 含义同udp一致,使用ipv4协议族
# SOCK_STREAM: 表明是使用的tcp进行通信
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定端口和地址
# 此地址信息是一个元祖类型内容,元祖分两部分,第一部分为字符串,代表ip,第二部分为端口,是一个整数,推荐大于10000
addr = ("127.0.0.1", 10086)
sock.bind(addr)
# 3. 监听接入的访问socket
sock.listen()
while True:
# 4. 接受访问的socket,可以理解接受访问即建立了一个通讯的链接通路
# accept返回的元祖第一个元素赋值给skt,第二个赋值给addr
skt,addr = sock.accept()
# 5. 接受对方的发送内容,利用接收到的socket接收内容
# 50000000代表接收使用的buffersize
#msg = skt.receive(500)
msg = skt.recv(50000000)
# 接受到的是bytes格式内容
# 想得到str格式的,需要进行解码
with open('E:/test/a.jpg','wb') as f:
f.write(msg)
# 6. 如果有必要,给对方发送反馈信息
skt.send('ok'.encode())
# 7. 关闭链接通路
skt.close()
if __name__ == "__main__":
print("Starting tcp server.......")
tcp_srv()
print("Ending tcp server.......")
客户端程序
import socket
import time
def tcp_clt():
# 1. 建立通信socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 链接对方,请求跟对方建立通路
addr = ("127.0.0.1", 10086)
sock.connect(addr)
# 当中是你的程序
# 3. 发送内容到对方服务器
print("建立通道成功,准备传输数据")
time.sleep(5) #在这里设置等待时间,是为了有充足的时间开启clumsy
f = open('E:/qq/aaaa.jpg', 'rb')
strChar = f.read()
start = time.clock()
sock.send(strChar)
# 4. 接受对方的反馈
rst = sock.recv(500)
elapsed = (time.clock() - start)
# 5. 关闭链接通路
sock.close()
print(elapsed)
if __name__ == "__main__":
tcp_clt()
一、在不开模拟软件的情况下,查看tcp传输一张图片所需的时间

在这种情况下,传输一张图片只需要0.017s
二、用软件模拟高延迟情况下的传输所需要的时间

在延迟高达2000的网络环境下,图片依然成功传输,虽然耗费了很多时间,花费时间4.47s
三、用软件模拟高丢包率情况下传输所需时间,效果如下

在高延迟和高丢包率下,文件依然成功传输,花费时间13.71s
经过上面的测试,我知道了socket库底层基于tcp/ip协议的失败重传机制做的很好,在非常高的延迟和丢包率下,文件依然能到达,
那么发散思维,是不是所有基于tcp/ip设计的网络,我们都可以用上面的方法来测试它的性能呢?
用clumsy模拟丢包测试socket库的失败重传的更多相关文章
- 如何在Windows环境下模拟丢包
[本文出自天外归云的博客园] Q&A Question: How to simulate packet loss on Windows? Answer: Clumsy, an utility ...
- 使用Network Emulator Toolkit工具模拟网络丢包测试(上)
弱网络测试包括延时和丢包二种场景下应用的功能是否正常: 网络延时测试使用Fiddler工具控制上下行数据传输延时时间来模拟网络延时场景: 网络丢包测试使用Network Emulator Toolki ...
- 使用Network Emulator Toolkit工具模拟网络丢包测试(下)
用户会在各种网络环境下使用我们的App,PC应用,我们决不能祈求用户的网络环境都是稳定的,因此我们需要模拟出弱网络的情况,用来测试我们的APP在弱网络环境下的表现如何.Network Emulator ...
- 发生tcp丢包(拥堵、超时)重传
可以根据wireshark的Seq序列号和Ack序列号来进行详细分析. 可见,网络丢包(可能是网络拥堵.也有可能是骨干网上有"防火墙"故意随机丢包,因为这个服务器的IP放在国外)对 ...
- clumsy 模拟网络丢包延迟
https://www.cnblogs.com/bodboy/p/6015530.html clumsy 能在 Windows 平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现 ...
- UDP主要丢包原因及具体问题分析
UDP主要丢包原因及具体问题分析 一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...
- windows下模拟网络延时、丢包、抖动
1.Fiddler 免费软件 模拟网速功能比较单一(Rules --> Performance --> Simulate Modem speed),选项较少,Fiddler仅是减缓带宽并未 ...
- UDP丢包原因
一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失.对于这种情况可以修改接收 ...
- linux 系统 UDP 丢包问题分析思路
转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...
随机推荐
- IntelliJ IDEA中项目报错org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 8 或maven操作compile报resource使用utf8这样的编码错
问题:项目开发工具已经setting成utf-8 并且项目各方面的配置文件包括maven这些的pom.xml里的配置都已经设置为utf-8 但是还报错 IntelliJ IDEA中项目报错org.xm ...
- P3396 哈希冲突
很好的根号算法(这种思想好像叫根号分治?) 首先,暴力是Ο(n2)的 考虑预处理: for(p=1;p<=n;p++) //枚举模数 ans[p][i%p]+=value[i]; 看似很好但还是 ...
- 我们来说说self.setinterval
学了js的你,肯定知道setInterval方法是按照指定的周期(以毫秒计)来调用函数或计算表达,setInterval方法会不停地调用函数,直到clearInterval被调用或窗口被关闭,这个se ...
- php递归实现一维数组转为指定树状结构 --- 省市区处理
### 这两天脑壳痛,一时短路,想不到准备利用递归实现这个需求,最后还是要请教同事,回来自己在实现了一遍,并记录下来 ### 原数据: // { // 广东省: { // 广州市: [ // &quo ...
- computed计算属性
在computed中,可以定义一些属性,这些属性 叫做计算属性.计算属性的本质是一个方法,只不过我们在使用的时候,把他们的名称当做属性来使用,并不会吧计算属性当做方法去调用.与methods平级. / ...
- cookie记录横向滚动条位置
一.Css <style type="text/css"> #x{ width: 100%; white-space: nowrap; overflow-x: scro ...
- linux常见故障处理
目录 一. 文件和目录类 1.1 File exist 文件已经存在 1.2 No such file or directory 没有这个文件或目录(这个东西不存在) 1.3 command not ...
- ubuntu16.4下使用QT修改系统时间
我也是在网上找的,自己随便改了一下六个lineEdit控件,每个控件输入日期时间,点击按钮触发函数可修改时间. 1 //一键修改系统时间 QString year = ui->lineEdit_ ...
- js简单实现自动轮播
//简单一个布局存放图片 <div class="lb"> <div class="lbt"> <img src="im ...
- spring-cloud-hystrix服务熔断与降级
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联 ...