计算机网络:网络延时

本文详细介绍了网络延时的组成,包括传播延时、发送延时和转发延时,并讨论了可靠传输的停等方式和滑动窗口方式。通过具体的任务描述,分析了不同情况下发送文件的延时计算,如等长分组、非等长分组以及发送窗口限制的影响。此外,还提供了AC代码以辅助理解计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络延时

网络文件传输采用分组方式进行,即将文件拆分为多个分组,为确保文件正确收到,收到方需要给发送回传确认信息。在不考虑分组丢失的情况下。网络延时就要由以下因素决定:

  • 传播延时,这是由于光信号在光纤中传输需要时间,这是物理规则确定的。
  • 发送延时,即接收方要处理数据需要完整接收数据后才能做进行一步的处理,由于网络设备发送比特流的速率有限,分组从第一个比特到最后一个比特全部发送出去需要时间,这个是由网卡性能决定的。
  • 转发延时,分组从A->B需要经过中间的数据交换设备进行转发。交换设备收到分组后若设备忙则需要排队等待处理,这导致排除延时;交换设备需要查找路由才能决定转发给下一个交换设备,这导致处理延时。交换设备从收到分组第一个比特到转发出全部比特的时延可以统称为转发延时。

在这里插入图片描述
除此之外,发送等待收到的确认消息也需要时间。
可靠传输可以采用不同方式:

  • 停等方式,即每个发一个分组,等到确认后发下一分组。
  • 滑动窗口方式,即连续发送多个分组,同时接收连续的多个确认。如果接收方吞吐率足够大,发方可以一次将分组全部发送出去,发送过程中也可以接收确认。但有时由于网路拥堵或接收方一次处理太多分组,会限制发送方允许连续发送的分组数量。

任务描述

我们在代码文件network_delay.c中约定线路中信号传播速度2.0X10^5km/s,交换设备转发延时1ms。

任务一:

计算一个分组从A->B需要的传播延时。并假定各结点间是等间距的。

任务二:

根据分组大小及网卡发送速率计算完整发送一个分组需要的时间。

任务三:

根据上述条件计算一个分组从发送第一比特到收到对方的确认需要的时间。由于确认分组很小,我们忽略确认分组的发送时间。
在这里插入图片描述

任务四:

采用停待方式发送一个文件的延时。其过程是将文件拆分为多个分组,每个分组收到确认为发送下一分组。需要注意的是最后一个分组可能长度小于允许的最大分组长度。
在这里插入图片描述
图中示意文件只需要分为2个分组。

任务五:

文件拆分为多个分组后,允许连接发送分组。
在这里插入图片描述
上述是文件正好拆分为等长的分组,实际拆分中最后一个分组可能不够最大组长。从下图可以看出,最后一个分组较其他分组小一些,p3中的虚线表示实际分组长度。从图中可以看出,与等长分组的延时计算相比,时长要小,其少出的时间为图中标识部分。
在这里插入图片描述

任务六:

与任务五相比,限定了发送窗口,即每次允许连续发送的分组最大数量。 如果发送窗口足够大在窗口还未发送完成将,就收到了分组的确认,则种情况下与任务五相同。若窗口小到为1,则与任务四的停等方式相同。
下图表示是若窗口内分组全部发送完成后没收到确认,则需要待待确认到达后才能进行下一窗口的发送。等待时间为下图中黑色区域所示。这时长就是单分组的网络延时与窗口发送的时长差。除了这个等待时间外,其他情况与任务五相同。
在这里插入图片描述

AC代码

#include <math.h>
#include <math.h>
#include<stdio.h>
float light_speed=2*pow(10,5);//光信号在光纤中的传播速率(km/s)
float r_delay=1;//交换设备转发时延(ms),包括处理时延+排队时延
/*************************************************
计算传播时延;
router_num为A->B经过的交换设备数量,spacing表示结点等间距(Km);
返回:传播延时(ms).
*************************************************/
float propagation_delay(int router_num,int spacing){   
	float p_delay=0;    
	/********Begin 1 ***********/    
	p_delay = (router_num+1) * 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_delay=0;   
	/********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_delay=0;   
 	/********Begin 3 ***********/   
  	n_delay = packet_len * 8.0 / send_rate*1000 *(router_num+1) 
  	+ 2.0 * (router_num+1) * 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_delay=0;   
	/********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_num+1)
       +2.0*(router_num+1)*spacing/light_speed*1000
       +2.0*router_num*r_delay);    
    else  //余下字节构建一个不足长的分组       
       n_delay = (num*(packet_len*8.0/send_rate*1000*(router_num+1)
       +2.0*(router_num+1)*spacing/light_speed*1000
       +2.0*router_num*r_delay)) 
       + ((file_len%packet_len)*8.0/send_rate*1000*(router_num+1)
       +2.0*(router_num+1)*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_delay=0;    
/********Begin 5 ***********/   
	//确定需要的分组数量   
	int num = file_len/packet_len;   
	//如果分组等长,则整个时延是一个分组的时延+(所有分组-最后一个分组的)的发送时延   
	n_delay = (packet_len*8.0/send_rate*1000*(router_num+1)
	+2.0*(router_num+1)*spacing/light_speed*1000
	+2.0*router_num*r_delay) 
	+((num-1)*(packet_len*8.0/send_rate*1000));   
	//不等长,意味着最后一个分组短于其他分组。
	//实际分组为packet_num+1 +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_delay=0;   
	/********Begin 6 ***********/    
	int num = file_len / packet_len;    
	//第一个分组确认的时延与窗口发送时间的差值  
	float dvalue = packet_len*8.0/send_rate*1000*(router_num+1)
	+2.0*(router_num+1)*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_num+1)
	+2.0*(router_num+1)*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_num+1)
		+2.0*(router_num+1)*spacing/light_speed*1000+2.0*router_num*r_delay))
		+(file_len%packet_len)*8.0/send_rate*1000*(router_num+1)
		+2.0*(router_num+1)*spacing/light_speed*1000
		+2.0*router_num*r_delay;   
	/*********End  6  **********/   
	return n_delay;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值