慢开始和快重传算法的模拟实现-计算机网络原理课程设计

本文详细介绍了如何使用C或Java编程语言模拟慢开始和快重传算法,涉及超时与重复确认的处理,以及如何通过可视化展示发送窗口随RTT变化的过程。设计过程包括设置接收窗口、阈值和传输次数,最终通过标准图形库绘制窗口曲线。

慢开始和快重传算法的模拟实现-计算机网络原理课程设计

题 目 慢开始和快重传算法的模拟实现

一、设计题目
慢开始和快重传算法的模拟实现

二、设计要求
掌握慢开始和快重传算法的工作原理。
采用C、Java等编程语言实现慢开始和快重传两个算法。

算法输入:接收窗口rwin;初始阈值threshold;传送次数;
网络出现超时是在第几次的传输轮次;网络出现对同一个报文段重复确认是在第几次的传输轮次。
算法输出:在第i次RTT后的发送窗口的值。画图描述出发送窗口的变化曲线。

三、设计思路
算法程序主要是利用多个if条件判断语句实现。
首先考虑非正常情况下的窗口值和阈值变化情况,主要有两种,第一种是网络出现超时的情况下,此时判断为网络拥塞,需要调整门限值为窗口的一半,并同时将窗口的值置为一;第二种是网络出现对同一个报文段重复确认的时候,需要调整门限值为窗口的一半,并同时将窗口的值置为原来的一半。
然后就需要考虑正常情况下的慢开始和拥塞避免,一开始的慢开始,按照2的指数型增长,当达到阈值时,就会执行拥塞避免,在拥塞避免过程中,有“加法增大”的特点。
最后将所有的判断语句放到一个while循环中,通过输入的传输次数来结束while循环。
关于生成窗口变化曲线,我下载了一个jar包,并在里面直接调用相关的函数
调整笔的大小的函数:
public static void setPenRadius()
调整画布大小的函数:
public static void setCanvasSize(int canvasWidth, int canvasHeight)
画线段的函数:
public static void line(double x0,double y0,double x1,double y1)
画点的函数:
public static void point(double x, double y)
将文本字符串写道画布上的函数:
public static void textLeft(double x,double y,java.lang.String text)
public static void text(double x,double y,java.lang.String text)

四、设计代码
import java.util.Scanner;
import edu.princeton.cs.algs4.StdDraw;
import static edu.princeton.cs.algs4.StdDraw.point;
import java.awt.Color;
import java.util.Arrays;

/**
*

  • @author dell
    */
    public class NewMain {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      // TODO code application logic here
      Scanner in = new Scanner(System.in);
      int rwin;
      int threshold;
      int n;
      int chaoshi;
      int cbaowen;
      System.out.println(“输入接收窗口rwin:”);
      rwin = in.nextInt();
      System.out.println(“输入初始阈值threshold:”);
      threshold = in.nextInt();
      System.out.println(“输入传送次数:”);
      n = in.nextInt();
      System.out.println(“输入网络出现超时是在第几次的传输轮次:”);
      chaoshi = in.nextInt();
      System.out.println(“输入网络出现对同一个报文段重复确认是在第几次的传输轮次;”);
      cbaowen = in.nextInt();
      int i = 0;
      int cwnd = 1;
      int[] pointx = new int[25];
      int[] pointy = new int[25];
      int x = 1, y = 1;

      while (true) {

       System.out.println("传输轮次为" + i + "的时候的窗口值为:" + cwnd + "  阈值为:" + threshold);
       pointx[x] = i;
       x++;
       pointy[y] = cwnd;
       y++;
       if (i == chaoshi) {
           i++;
           threshold = cwnd / 2;
           cwnd = 1;
           continue;
       }
       if (i == cbaowen) {
           i++;
           threshold = cwnd / 2;
           cwnd = cwnd / 2;
           continue;
       }
      
       if (i == n) {
           System.out.println("当前窗口的值:");
           System.out.println(cwnd);
           break;
       }
      
       if (cwnd < threshold) {
           cwnd *= 2;
           if (cwnd > threshold) {
               cwnd = threshold;
           }
       } else {
           cwnd++;
           if (cwnd > rwin) {
               cwnd--;
           }
       }
      
       i++;
      

      }

      StdDraw.setPenRadius(0.01);
      StdDraw.setCanvasSize(1024, 800);
      StdDraw.line(0.1, 0.1, 0.1, 0.8);
      StdDraw.text(0.1, 0.8, “拥塞窗口”);
      StdDraw.line(0.1, 0.1, 0.8, 0.1);
      StdDraw.text(0.8, 0.1, “>传输次数”);

      for (int f = 1; f <= i; f++) {
      StdDraw.line((double) pointx[f] / 40 + 0.1, (double) pointy[f] / 40 + 0.1, (double) pointx[f + 1] / 40 + 0.1, (double) pointy[f + 1] / 40 + 0.1);

      }
      StdDraw.setPenRadius(0.015);
      for (int f = 1; f <= i + 1; f++) {

       StdDraw.point((double) pointx[f] / 40 + 0.1, (double) pointy[f] / 40 + 0.1);
       StdDraw.textLeft((double) pointx[f] / 40 + 0.1, (double) pointy[f] / 40 + 0.1, "(" + pointx[f] + "," + pointy[f] + ")");
      

      }
      }

}

五、运行结果和效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

六、感想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值