#include math.h #include math.h #includestdio.h float light_speed2*pow(10,5);//光信号在光纤中的传播速率(km/s) float r_delay1;//交换设备转发时延(ms),包括处理时延排队时延 /************************************************* 计算传播时延; router_num为A-B经过的交换设备数量,spacing表示结点等间距(Km); 返回:传播延时(ms). *************************************************/ float propagation_delay(int router_num,int spacing){ float p_delay0; /********Begin 1 ***********/ p_delay (router_num1) * spacing / light_speed * 1000; /*********End 1 **********/ return p_delay; } /************************************************* 计算单个分组的发送时延; packet_len为分组长度(byte),send_rate接口发送速率(bit/s); 返回:发送延时(ms). *************************************************/ float transmission_delay(int packet_len,int send_rate){ float t_delay0; /********Begin 2 ***********/ t_delay packet_len * 8.0 / send_rate*1000; /*********End 2 **********/ return t_delay; } /************************************************* 计算发送一个分组并收到确认的延时忽略确认分组的发送时延 packet_len为分组长度(byte),send_rate接口发送速率(bit/s); router_num为A-B经过的交换设备数量,spacing表示结点等间距(Km); 返回:单分组的往返延时(ms). *************************************************/ float network_delay(int packet_len,int send_rate,int router_num,int spacing){ float n_delay0; /********Begin 3 ***********/ // 错误1发送时延错误乘以(router_num1)转发时延只乘router_num应为2*(router_num1) n_delay packet_len * 8.0 / send_rate*1000 *(router_num1) 2.0 * (router_num1) * spacing / light_speed*1000 2.0* router_num* r_delay; /*********End 3 **********/ return n_delay; } /************************************************* 计算发送一个文件并收到确认的延时忽略确认分组的发送时延,采用停等协议每发一个分组待确认后发下一个分组 file_len文件长度(byte)packet_len为分组最大长度(byte),send_rate接口发送速率(bit/s); router_num为A-B经过的交换设备数量,spacing表示结点等间距(Km); 返回:文件全部发送并收到确认的时延(ms). *************************************************/ float network_delay_stop_wait(int file_len,int packet_len,int send_rate, int router_num,int spacing){ float n_delay0; /********Begin 4 ***********/ //确定需要的分组数量 int num file_len / packet_len; if(file_len % packet_len 0) //分组等长 n_delay num*(packet_len*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay); else //余下字节构建一个不足长的分组 n_delay (num*(packet_len*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay)) ((file_len%packet_len)*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay); /*********End 4 **********/ return n_delay; } /************************************************* 计算发送一个文件并收到确认的延时忽略确认分组的发送时延,采用滑动窗口协议可以连续发送分组不限制连续发送的分组数量可以看出分组后各结点占发送的时延可以重叠不用等全部文件发送后才开发转发 file_len文件长度(byte),packet_len为分组最大长度(byte),send_rate接口发送速率(bit/s); router_num为A-B经过的交换设备数量,spacing表示结点等间距(Km); 返回:文件全部发送并收到确认的时延(ms). *************************************************/ float network_delay_sliding_window(int file_len,int packet_len,int send_rate,int router_num,int spacing){ float n_delay0; /********Begin 5 ***********/ //确定需要的分组数量 int num file_len/packet_len; //如果分组等长则整个时延是一个分组的时延所有分组-最后一个分组的的发送时延 n_delay (packet_len*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay) ((num-1)*(packet_len*8.0/send_rate*1000)); //不等长意味着最后一个分组短于其他分组。 //实际分组为packet_num1 spacing/light_speed*1000 if(file_len%packet_len ! 0) n_delay - ((packet_len-(file_len%packet_len))*8.0/send_rate*1000 -packet_len*8.0/send_rate*1000); /*********End 5 **********/ return n_delay; } /************************************************* 计算发送一个文件并收到确认的延时忽略确认分组的发送时延,采用滑动窗口协议可以连续发送分组但限制连续发送的分组数量 file_len文件长度(byte)max_window_num连续发送的最大分组数量,packet_len为分组最大长度(byte),send_rate接口发送速率(bit/s); router_num为A-B经过的交换设备数量,spacing表示结点等间距(Km); 返回:文件全部发送并收到确认的时延(ms). *************************************************/ float network_delay_sliding_window(int max_window_num,int file_len,int packet_len, int send_rate,int router_num,int spacing){ float n_delay0; /********Begin 6 ***********/ int num file_len / packet_len; //第一个分组确认的时延与窗口发送时间的差值 float dvalue packet_len*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay - max_window_num*packet_len*8.0/send_rate*1000; int cnt num / max_window_num; //如果在窗口内发送时长内收到第一个确认则表示可以连续发送分组 n_delay (cnt-1) * max_window_num * packet_len*8.0/send_rate*1000 dvalue*(cnt-1) (packet_len*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay) (max_window_num-1)*(packet_len*8.0/send_rate*1000); //如果发送窗口内收不到确认则会多出窗口间的等待确认延时 if(file_len%packet_len ! 0) n_delay (num*(packet_len*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*10002.0*router_num*r_delay)) (file_len%packet_len)*8.0/send_rate*1000*(router_num1) 2.0*(router_num1)*spacing/light_speed*1000 2.0*router_num*r_delay; /*********End 6 **********/ return n_delay; }