TCP incast

This article will show you how to reproduce TCP incast using a virtual network at an end host.

1. Topology

topology.jpg
  • VM1, VM2 and VM3 are clients (sender) and VM5 is a server (receiver). VM4 play the role of switch and you can realize your NF at it.
  • start up the topology
#createVnet.sh
sudo ovs-vsctl add-br mgmt
echo "create mgmt"
sudo ovs-vsctl add-br exp_1
echo "create exp_1"
sudo ovs-vsctl add-br exp_2
echo "create exp_2"

#clear NAT
#sudo ifconfig docker0 down
sudo iptables -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT

sudo ifconfig mgmt 100.0.0.1/24 up
#sudo ifconfig exp_1 up
#sudo ifconfig exp_2 up

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 100.0.0.0/24 ! -d 100.0.0.0/24 -j MASQUERADE
#iptables -nvL

#sudo virsh create /etc/libvirt/qemu/vm0.xml
#sudo virsh create /etc/libvirt/qemu/vm1.xml
#sudo virsh create /etc/libvirt/qemu/vm2.xml

sudo virsh start vm1
sudo virsh start vm2
sudo virsh start vm3
sudo virsh start vm4
sudo virsh start vm5

#ovs-dpctl show
#sudo ovs-ofctl add-flow exp in_port=1,action=output:2
#sudo ovs-ofctl add-flow exp in_port=3,action=output:4
#sudo ovs-ofctl add-flow exp in_port=4,action=output:1

echo "finished!"

  • destroy the virtual network
#destroyVnet.sh
sudo virsh destroy vm1
sudo virsh destroy vm2
sudo virsh destroy vm3
sudo virsh destroy vm4
sudo virsh destroy vm5

sudo ovs-vsctl del-br mgmt
echo "delete mgmt"
sudo ovs-vsctl del-br exp_1
echo "delete exp_1"
sudo ovs-vsctl del-br exp_2
echo "delete exp_2"

2. Incast

#!/bin/bash

protocol=("reno")
ip_arr=(10 20 30)
flow_arr=(1 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30)
#flow_arr=(1 2 4)


ssh_func()
{
    # ${1}: protocol  ${2}: ip  ${3}: flow number

    sshpass -p 1234 ssh ubuntu@100.0.0.${2} > /dev/null 2>&1 << eeooff
    #sudo sysctl -w net.ipv4.tcp_ecn=1
    #sudo sysctl -w net.ipv4.tcp_congestion_control=${1}
    iperf -c 10.0.0.50 -n 64K -P ${3} > /home/ubuntu/Desktop/iperf_${1}_${3}.txt
    #iperf -c 10.0.0.50 -i 1 -t 5 > /home/ubuntu/Desktop/iperf_${1}_${3}.txt
    exit
eeooff
}

ssh_server()
{
    sshpass -p 1234 ssh ubuntu@100.0.0.50 > /dev/null 2>&1 << eeooff
    #sudo sysctl -w net.ipv4.tcp_ecn=1
    #sudo sysctl -w net.ipv4.tcp_congestion_control=${1}
    timeout -s SIGINT 3 iperf -s > /home/ubuntu/Desktop/iperf_${1}_${3}.txt 
    exit 
eeooff
}

for proto in ${protocol[@]}
do
    for flow in ${flow_arr[@]}
    do 
        echo "protocol : "${proto}    "    flow number : "${flow}
        #ssh_server ${proto} ${ip} ${flow} &      # 3 seconds   
        #sleep 1
        for ip in ${ip_arr[@]}
        do 
            #echo ${proto} 10.0.0.${ip} ${flow}
            ssh_func ${proto} ${ip} ${flow} &        # 64K 10Gbps
        done 
        echo ""
        sleep 4
    done
    echo ""
done

echo "done!!!"
exit 0

3. Results

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import re
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from pylab import *
import matplotlib.gridspec as gridspec

def read_iperf(path):
    with open(path,'r') as iperf:
        for line in iperf.readlines():
            matchobj = re.search(r'\[.*\]',line,re.M|re.I)
            if matchobj:
                if re.search(r'SUM',line,re.M|re.I):
                    temp_1 = re.search(r'Bytes .* Mbits/sec',line,re.M|re.I)
                    temp_2 = re.search(r'Bytes .* Gbits/sec',line,re.M|re.I)
                    if temp_1:
                        aList = re.split(r'\s+',temp_1.group())
                        return float(aList[1])/1000
                    elif temp_2:
                        aList = re.split(r'\s+',temp_2.group())
                        return float(aList[1])

def path_gen():
    dir_path = "/Users/yche/Desktop/results/"
    folders  = ["client_10","client_20","client_30"]
    flow_num = [2*i + 2 for i in range(15)]
    protos   = ["dctcp","cubic","reno","reno_ecn_off"]

    tput_list= []

    for p in protos:
        put_temp = []
        for flow in flow_num:
            good_put = 0
            for folder in folders:
                path = dir_path + folder + "/iperf_" + p + "_" + str(flow) + ".txt"
                good_put = good_put + read_iperf(path)
                #print (path)
            put_temp.append(good_put)
        tput_list.append(put_temp)

    for item in tput_list:
        print(item)

    return tput_list

def plot(good_put):
    patterns = ['b*-','g+-','cx-',"md-"]
    legends  = ["DCTCP","CUBIC","RENO","RENO (NO ECN)"]

    dctcp        = good_put[0]
    cubic        = good_put[1]
    reno         = good_put[2]
    reno_ecn_off = good_put[3]

    plt.figure(figsize=(6,3))
    ax = plt.subplot(1,1,1)

    x_data = [2*i+2 for i in range(len(dctcp))]
    #print(x_data)

    ax.plot(x_data,dctcp,patterns[0],label=legends[0])
    ax.plot(x_data,cubic,patterns[1],label=legends[1])
    ax.plot(x_data,reno,patterns[2],label=legends[2])
    ax.plot(x_data,reno_ecn_off,patterns[3],label=legends[3])
    
    ax.set_xlim(-1,31)
    ax.set_ylim(0,10)
    ax.set_xlabel("Number of senders in parallel")
    ax.set_ylabel("goodput (Gbps)")
    ax.yaxis.grid(True)

    plt.legend(loc=0,prop={'size': 10})

    plt.tight_layout()
    pp = PdfPages("/Users/yche/Desktop/results/incast.pdf")
    pp.savefig()
    pp.close()

if __name__ == '__main__':
    good_put = path_gen()
    plot(good_put)
incast.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,135评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,317评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,596评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,481评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,492评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,153评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,737评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,657评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,193评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,276评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,420评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,093评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,783评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,262评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,787评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,427评论 2 359

推荐阅读更多精彩内容