用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库的失败重传的更多相关文章

  1. 如何在Windows环境下模拟丢包

    [本文出自天外归云的博客园] Q&A Question: How to simulate packet loss on Windows? Answer: Clumsy, an utility ...

  2. 使用Network Emulator Toolkit工具模拟网络丢包测试(上)

    弱网络测试包括延时和丢包二种场景下应用的功能是否正常: 网络延时测试使用Fiddler工具控制上下行数据传输延时时间来模拟网络延时场景: 网络丢包测试使用Network Emulator Toolki ...

  3. 使用Network Emulator Toolkit工具模拟网络丢包测试(下)

    用户会在各种网络环境下使用我们的App,PC应用,我们决不能祈求用户的网络环境都是稳定的,因此我们需要模拟出弱网络的情况,用来测试我们的APP在弱网络环境下的表现如何.Network Emulator ...

  4. 发生tcp丢包(拥堵、超时)重传

    可以根据wireshark的Seq序列号和Ack序列号来进行详细分析. 可见,网络丢包(可能是网络拥堵.也有可能是骨干网上有"防火墙"故意随机丢包,因为这个服务器的IP放在国外)对 ...

  5. clumsy 模拟网络丢包延迟

    https://www.cnblogs.com/bodboy/p/6015530.html clumsy 能在 Windows 平台下人工造成不稳定的网络状况,方便你调试应用程序在极端网络状况下的表现 ...

  6. UDP主要丢包原因及具体问题分析

    UDP主要丢包原因及具体问题分析 一.主要丢包原因   1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...

  7. windows下模拟网络延时、丢包、抖动

    1.Fiddler 免费软件 模拟网速功能比较单一(Rules --> Performance --> Simulate Modem speed),选项较少,Fiddler仅是减缓带宽并未 ...

  8. UDP丢包原因

    一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失.对于这种情况可以修改接收 ...

  9. linux 系统 UDP 丢包问题分析思路

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

随机推荐

  1. CSS white-space属性详解

    概述 CSS的white-space属性用于指定如何处理容器中的空白字符,例如:空格( ).换行(\n).缩进(\t)等. white-space出自CSS1,适用于块状元素,具有继承性,支持IE 5 ...

  2. Mybatis-Plus入门

    1 Mybatis-Plus简介 1.1 什么是Mybatis-Plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化 ...

  3. Python3:输出当前目录所有目录和文件--walk()函数

    有了前一篇文章的介绍,再输出目录,也不过是多写一个函数的事情了,我把它封装成了类~~ 发现walk()真的是一个超级方便好用的函数.这种情况下用listdir()是搞定不了的啦 import os c ...

  4. openwrt 编译

    完整的编译过程: http://www.280i.com/tech/3353.html源更新: https://blog.csdn.net/ypbsyy/article/details/8121836 ...

  5. day06 字典、元组、set的方法及常用操作

    今日内容: 1.深浅拷贝 2.元组 3.字典 4.set 1.深浅拷贝 # 1.值拷贝 # 采用赋值的方法进行 # 只会将堆区容器变量与栈区的绑定关系进行复制 # 2.浅拷贝 # 会将堆区与栈区的绑定 ...

  6. Java基础12-工具类;变长参数;IO

    作业解析 取出整数的16进制表示形式 \u00ff /** * int2hex * */ public static String int2hex(int i) { String str = &quo ...

  7. 一个账户接管几乎所有阿里巴巴网站(CSRF漏洞+WAF绕过)

    场景 文章是关于某些客户端漏洞导致几个阿里巴巴网站的帐户被接管. 条件 TL;DR 必要条件,例如JSONP,某些浏览器处理cookie等行为. 攻击原理 大多数阿里巴巴的网站加载并执行外部JavaS ...

  8. Non-decreasing Array

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  9. Tensorflow笔记一

    Tensorlfow中的计算是通过一个有向图directed graph或则计算图computation graph来实现的. 将每一个运算操作operation作为一个节点node,节点之间通过边e ...

  10. https请求之绕过证书安全校验工具类(原)

    package com.isoftstone.core.util; import java.io.BufferedReader; import java.io.ByteArrayOutputStrea ...