在GBN协议和SR协议下的三种运行情况

  • Go-Back-N Protocol
  • 正常情况
  • 发送存在丢包

在GBN (回退N重传协议) 协议下,发送方可以同时发送多个报文段,这些报文段都有一个特定的序号,接收方必须按照序号顺序接收这些报文。如果发送方发送了一批报文,但是其中有部分报文在传输过程中丢失,那么接收方将只会收到一些连续而又正确的数据包,而接收不到中间失踪的数据包。当发送超时时,发送方就会重发所有未确认数据包(即还没有收到对应的 ACK 确认报文),而这也就意味着发送方可能会重新发送之前已经发送过的数据包,即使它们已经被确认了。因此,GBN协议存在着浪费带宽的风险,并且丢包率高时会导致发送方的性能下降。

  • 丢失一个ACK

在GBN (回退N重传协议) 协议下,接收方需要发送一个 ACK (确认) 消息来确认正确接收到的数据包。如果接收方在某个时间点丢失了一个 ACK 消息,那么发送方将不会收到应有的 ACK 消息,并且发送方也不会得知已经丢失了一个 ACK。随着时间的推移,发送方会认为该数据包未被有效接收,因此会将该数据包及其之后的所有未确认数据包重发。这样就可能导致网络拥塞和资源浪费,同时降低传输效率。

为了避免这种情况发生,接收方可以定时发送 SACK (选择性确认) 消息,用来告知发送方哪些数据包已经成功接收。当发送方收到 SACK 后,就会只重发未收到确认的数据包,而不是全部数据包,从而提高网络吞吐量。除此之外,还可以通过调整超时时间的大小、优化网络性能等方法来进一步提高数据传输的效率。

  • Selective Repeat Protocol
  • 正常情况

  • 发送存在丢包

在选择重传协议下,当发送方在传输过程中发生数据包丢失时,接收方会通过发送请求缺失的数据包的消息来通知发送方重新发送。发送方只需要重新发送丢失的数据包即可,由于不需要重传所有数据包,因此选择重传协议比回退 N 帧协议的性能和效率更高。

  • 丢失一个ACK

在选择重传协议下,如果接收方丢失一个ACK确认消息,发送方会在超时计时器到期后重新发送对应的数据包。如果多个ACK确认消息丢失,发送方可能会进行多次重传,这会使网络拥塞和性能下降。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
模仿数据链路层的gobackn协议 /*该协议是搭载ack的回退n步协议*/ #include #include "protocol.h" #define max_seq 7 #define flag 126 #define ESC 100 #define wait_time 2700 //发送计时器等待的时间 #define ack_wait_time 280 static int phl_ready = 0; unsigned char buf[max_seq+1][270]; unsigned char ack[8]; //发送空的ack帧 unsigned char in_buf[600], last_buf[520];//接收时的缓冲区;去掉冗余之后的缓冲区,为防备因误码两帧合并为一帧而定义了很大一个数组 int nbuffered=0; //发送的帧数 int buf_size[max_seq+1]; //记下以发送各帧的帧长 int next_frame_to_send=0; int frame_in_phl=0; //用于成帧 int frame_expected=0; int ack_expected=0; int between(int a,int b,int c) { if( ((a<=b)&&(b<c)) || ((c<a)&&(a<=b)) || ((b<c)&&(c<a)) ) return 1; else return 0; } //判断帧尾,防止出现误判esc esc flag为数据的情况 int end_flag(int in_len) { int count=0; int i; if(in_len=0;i--)//记录flag前的esc数目 count++; return count%2; //若flag前的esc为偶数,则为帧尾 }//成帧函数--数据帧 void send_frame(char *my_buf,int len) { int n; buf[frame_in_phl][0]=(frame_expected+max_seq)%(max_seq+1); //ack buf[frame_in_phl][1]=frame_in_phl; //发送帧的帧号 for(n=0;n<len;n++) buf[frame_in_phl][n+2]=my_buf[n]; //将处理过的新帧赋值到缓冲区中 len=len+2; *(unsigned int *)(buf[frame_in_phl]+len) = crc32(buf[frame_in_phl],len); //在原始帧的基础上加检验和 buf_size[frame_in_phl]=len+4; //记录当前帧的长度,包括3个帧头,4个检验和 nbuffered=nbuffered+1; //缓冲区占用数加一 frame_in_phl=(frame_in_phl+1)%(max_seq+1); } //成帧函数--ack帧 void send_ack() //ack帧的处理 { ack[0]=(frame_expected+max_seq)%(max_seq+1); ack[1]=max_seq+10; //ack帧的序号位,使ack[1]==frame_expected恒不成立 *(unsigned int *)(ack+2) = crc32(ack,2); //在原始帧的基础上加检验和 } //主函数 int main(int argc, char **argv) { int event, arg, n , m , i , j , len = 0 ,in_len = 0; unsigned char my_buf[260]; int phl_wait=0; //在物理层中还没有被发送的帧 protocol_init(argc, argv); enable_network_layer(); for (;;) { event = wait_for_event(&arg); switch (event) { case NETWORK_LAYER_READY:
Python编程可以实现GBN(Go-Back-N)协议SR(Selective Repeat)协议,并且可以模拟丢包现象。下面是一个简单的示例: GBN协议实现: 在GBN协议中,发送方可以连续发送多个数据包,并等待确认。如果数据包被丢弃或确认丢失,发送方需要重新发送前面未确认的数据包。 1. 首先,我们可以创建一个发送方和一个接收方的函数来模拟协议的行为。 ```python def sender(window_size): base = 0 next_seq_num = 0 while base < window_size: packet = create_packet(next_seq_num) send(packet) next_seq_num += 1 while True: ack = receive_ack() if ack == base: base += 1 packet = create_packet(next_seq_num) send(packet) next_seq_num += 1 def receiver(): expected_seq_num = 0 while True: packet = receive() if packet.seq_num == expected_seq_num: send_ack(expected_seq_num) expected_seq_num += 1 ``` 2. 我们可以在发送方模拟丢包现象。在发送函数中,添加一个随机数生成器来模拟丢包的情况。 ```python import random def send(packet): if random.random() < 0.2: # 模拟20%的丢包概率 return # 发送数据包的实现 ``` SR协议实现: 在SR协议中,发送方一次只发送一个数据包,并等待相应的确认。如果数据包或确认丢失,发送方会在超时后重新发送该数据包。 1. 同样,我们可以创建一个发送方和一个接收方的函数来模拟SR协议的行为。 ```python def sender(): next_seq_num = 0 while True: packet = create_packet(next_seq_num) send(packet) ack = receive_ack() if ack == next_seq_num: next_seq_num += 1 def receiver(): expected_seq_num = 0 while True: packet = receive() if packet.seq_num == expected_seq_num: send_ack(expected_seq_num) expected_seq_num += 1 ``` 2. 同样,在发送方模拟丢包现象。在发送函数中,添加一个随机数生成器来模拟丢包的情况。 ```python import random def send(packet): if random.random() < 0.2: # 模拟20%的丢包概率 return # 发送数据包的实现 ``` 通过在发送方模拟丢包现象,我们可以测试GBN协议SR协议在不同丢包率下的性能。这是一个简单的示例,具体的实现会根据具体需求和协议规范进行调整和完善。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值