【计网】代码实现:TCP拥塞控制算法编程实验(结合matplotlib折线图输出结果)

声明:本文仅提供一个思路,因本人较lan,且近期时间匆忙,因此代码实现有许多不足制之处(详情见正文 四、不足之处 )

一、实验需求

掌握TCP进行拥塞控制的四种算法:慢开始、拥塞避免、快重传、快恢复的工作原理,编程实现拥塞控制算法。

程序输入:
(1)拥塞窗口cwin;
(2)初始阈值ssthresh;
(3)判断报文段丢失的依据(超时?三个重复确认?)
(4)(…自行设定额外输入项)
程序输出:
(1)输出前i轮次拥塞窗口的值。
(2)画图描述出拥塞窗口的变化曲线。

声明:因涉及图像结果的输出,选用 Python 较为方便。

二、测试效果

测试用例一

在这里插入图片描述
测试数据输入:

  • 初始拥塞窗口大小:1
  • 初始阈值大小:16
  • 超时发生时的传输轮次(没有则输-1):12
  • 重传发生时的传输轮次(没有则输-1):-1
  • 传输轮次:22

程序输出如下:
在这里插入图片描述

测试用例二

在这里插入图片描述
测试数据输入:

  • 初始拥塞窗口大小:1
  • 初始阈值大小:16
  • 超时发生时的传输轮次(没有则输-1):12
  • 重传发生时的传输轮次(没有则输-1):21
  • 传输轮次:26

程序输出如下:
在这里插入图片描述

三、完整代码

import numpy as np 
from matplotlib import pyplot as plt 


#程序输入-------

'''测试数据
1
16
12
-1
22

1
16
12
21
26
'''

cwin = eval(input('请输入初始拥塞窗口大小:')) #拥塞窗口
ssthresh = eval(input('请输入初始阈值大小:')) #初始阈值

#是否超时 >0-True  -1-False
ifTimeoutRoundIndex = eval(input('请输入超时发生时的传输轮次(没有则输-1):')) #超时发生时的传输轮次

#是否重传 >0-True  -1-False
ifReTransmissionRoundIndex = eval(input('请输入重传发生时的传输轮次(没有则输-1):')) #重传发生时的传输轮次

roundCount = eval(input("请输入传输轮次:")) #传输轮次


#算法----------

listXResult = [] #后期绘图用的x坐标集(此处直接用roundCount算出也可以)
listYResult = [] #后期绘图用的y坐标集


for roundIndex in range(roundCount):
    print("第", roundIndex, "轮:", ",拥塞窗口大小:", cwin)

    #图:收集x, y坐标
    listXResult.append(roundIndex)
    listYResult.append(cwin)

    #先判断,是否超时或重传------------

    #---若超时--->转-慢开始
    if (roundIndex == ifTimeoutRoundIndex):
        ssthresh = cwin // 2
        cwin = 1
        continue
    #---若重传--->转-快重传
    if (roundIndex == ifReTransmissionRoundIndex):
        ssthresh = cwin // 2
        cwin = ssthresh
    #--------------------------------

    #+++++++慢开始
    #【拥塞窗口 < 初始阈值】
    if (cwin < ssthresh):
        cwin *= 2
        #避免因x2而越界
        if (cwin > ssthresh):
            cwin = ssthresh

    #+++++++拥塞避免
    #【拥塞窗口 > 初始阈值 且 当前轮次 < 超时发生时的传输轮次】
    elif (cwin >= ssthresh): 
        cwin += 1

    

#程序输出-------
# print("----------------------------------")
# print(listXResult)
# print(listYResult)

plt.xlabel("传输次数 roundIndex")
plt.ylabel("拥塞窗口 cwin")
plt.plot(listXResult, listYResult, 'r')
plt.grid()#添加网格
plt.show()

四、不足之处

因近期时间匆忙

  • 未进行用户输入的检验,读者可自行弥补此缺点
  • 未更改plt输出图的中文编码
  • 为设置多个超时,多个阻塞的情况
  • …读者自行更改即可,本文仅提供一个思路
  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超周到的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值