慢开始和快重传算法的模拟实现-计算机网络原理课程设计
题 目 慢开始和快重传算法的模拟实现
一、设计题目
慢开始和快重传算法的模拟实现
二、设计要求
掌握慢开始和快重传算法的工作原理。
采用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] + ")");}
}
-
}
五、运行结果和效果



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

4228

被折叠的 条评论
为什么被折叠?



