目的是为了老鼠流能在理论时延时间内传输完成。DMR越大奖励越多,DMR越小,奖励越少,这时就会促使DRL增加老鼠流的传输带宽,在输出的动作中有一个速率叠加在端口队列上。但这样应该会影响大象流的传输,所以还应该把大象流能传输完成率也加上去(也应该是DMR,也就是大象流的DMR),只有这两个DMR都满足才是保证了QOS。但是根据队列的优先级好像大象流是优先传输的,所以可以不用管大象流的DMR?
采用mininet和ryu实验,
创建fattree(4,8,8),带宽设置为10Gbps,负荷为80%,主机数为8,寻找4条最短路径,产生的流量数为40。
状态为(40,5)
速率维数为2*72
路径为2*28(28表示不同主机的通信)
动作维度为2*(72+28)
评价指标:
Flow Completion Time :FCT流完成时间
Deadline Meet Rate: DMR截止时间完成率也就是数据流在规定的时间是否到达目的地
Size:
Tputi = FCT / Size
FCTi_ = data.FCT.sum()#所有数据流完成时间总和
DMRi_ = float(MFmeetratenum)/MFnum #老鼠流的时限完成率
Tputi_ = FCTi_ / Sizei_ #数据流完成时间总和除于总的数据流的字节数总和,即每个字节完成的时间,也就是传输速率
Generate.py:
deadline = 0
# Type 1 flows
if flow_type == 1:#注意:这里没有区分大象流和老鼠流,所以理论传输时延需要作为超参调整,另外也可以只考虑老鼠流的流量,不考虑大象流流量
# Calculate ideal FCT (ms)
#ideal_fct = 0.2 + float(flow_size) * 8 * 1024 / (capacity * 1024 * 1024) * 1000
if threshold_size==10:
ideal_fct = 1 + float(flow_size) * 1024 / (capacity * 1024 * 1024) * 1000
elif threshold_size==1000:
ideal_fct = 20 + float(flow_size) * 1024 / (capacity * 1024 * 1024) * 1000
# Deadline is assigned to
deadline = int(math.ceil(2 * ideal_fct))
flow = [times[i], flow_size, flow_type, deadline, host_src, host_dst, dsport]
trace.append(flow)
Client.py:
FCT = time.time() - flowStartTime#发送完后计算该次数据流发送的实际时延
if flowtype == 1:
if deadline/1000.0 >= FCT:#若老鼠流能在理论时延内完成传输即理论时延大于实际时延则满足速率
meetrate = True
else:
meetrate = False
Env.py:
MFmeetratenum = len(data[data.meetrate==True])
FCTi_ = data.FCT.sum()
DMRi_ = float(MFmeetratenum)/MFnum
Tputi_ = FCTi_ / Sizei_
if DMRi_ >= 0.9:
reward = -Tputi_ * 1000
elif DMRi_ >= 0.8:
reward = -Tputi_ * 10 * 1000
elif DMRi_ >= 0.7:
reward = -Tputi_ * 20 * 1000
elif DMRi_ >= 0.6:
reward = -Tputi_ * 30 * 1000
elif DMRi_ < 0.6:
reward = -Tputi_ * 40 * 1000
定义输入的数据流分布:
flowsize数据流字节大小的分布函数,
小于等于6的占0.15
(6,13)大小的占0.2-0.15=0.05
(13,19)大小的占0.3-0.2=0.1
以此类推
Websearch.txt
6 1 0.15
13 1 0.2
19 1 0.3
33 1 0.4
53 1 0.53
133 1 0.6
333 1 0.7
933 1 0.8
1333 1 0.9
3333 1 0.97
8000 1 1
首先通过环境reset初始化网络:
Fattree结构:
https://blog.csdn.net/qq_49588762/article/details/115296838
整个拓扑网络分为三个层次:自上而下分别为边缘层(edge)、汇聚层(aggregate)和核心层(core),其中汇聚层交换机与边缘层交换机构成一个pod,交换设备均采用商用交换设备。下图是pod=4=k density=2,主机数16,density =2表示每个接入层交换机2台主机,交换机20台,核心层4台,汇聚层8台,边缘层8台。
获取到网络数据:主要是主机名,对应IP地址和MAC地址
self.HostList, self.HostIPList, self.HostNameIPMAC------------- [<Host h001: h001-eth0:10.1.0.1 pid=26371> , <Host h002: h002-eth0:10.2.0.1 pid=26373> , <Host h003: h003-eth0:10.3.0.1 pid=26375> , <Host h004: h004-eth0:10.4.0.1 pid=26377> , <Host h005: h005-eth0:10.5.0.1 pid=26379> , <Host h006: h006-eth0:10.6.0.1 pid=26381> , <Host h007: h007-eth0:10.7.0.1 pid=26383> , <Host h008: h008-eth0:10.8.0.1 pid=26385> ] ['10.1.0.1', '10.2.0.1', '10.3.0.1', '10.4.0.1', '10.5.0.1', '10.6.0.1', '10.7.0.1', '10.8.0.1'] {'h001': ('10.1.0.1', '00:00:00:00:00:01'), 'h002': ('10.2.0.1', '00:00:00:00:00:02'), 'h003': ('10.3.0.1', '00:00:00:00:00:03'), 'h004': ('10.4.0.1', '00:00:00:00:00:04'), 'h005': ('10.5.0.1', '00:00:00:00:00:05'), 'h006': ('10.6.0.1', '00:00:00:00:00:06'), 'h007': ('10.7.0.1', '00:00:00:00:00:07'), 'h008': ('10.8.0.1', '00:00:00:00:00:08')}
再得到access-table,即交换机及对应端口与8台主机的连接关系:
Access_table------------- {('3001', '3'): ('10.1.0.1', '00:00:00:00:00:01'), ('3002', '3'): ('10.2.0.1', '00:00:00:00:00:02'), ('3003', '3'): ('10.3.0.1', '00:00:00:00:00:03'), ('3004', '3'): ('10.4.0.1', '00:00:00:00:00:04'), ('3005', '3'): ('10.5.0.1', '00:00:00:00:00:05'), ('3006', '3'): ('10.6.0.1', '00:00:00:00:00:06'), ('3007', '3'): ('10.7.0.1', '00:00:00:00:00:07'), ('3008', '3'): ('10.8.0.1', '00:00:00:00:00:08')}
然后就是安装上面对应主机和交换机出端口的流表:
上面的print输出如下:
k,v----------