{A}{S0}简介
数据链路层是7层 2层。
数据链路层提供的功能和程序的手段,以网络实体之间的数据传输和可能提供的手段来检测,并可能纠正错误可能在发生。
这个C#模拟将包括数据链路层的流量控制技术是:停止和等待回到ñ选择性重复停止和等待
停止并等待ARQ的是最简单的一种(ARQ)方法。停止并等待ARQ的发件人发送一次帧。发送每一帧后,发件人不发送任何进一步的帧,直到它接收到一个ACK(确认)信号。收到良好的帧后,接收方发送一个ACK。如果ACK没有达到一定的时间,被称为超时,前发件人,发件人再次发送相同的帧。
所以现在我们有3个方案:帧到达接收器接收,发送ACK到达Trasnmitter。帧倍。帧到达接收器接收,ACK倍。
在过去的情况下,发件人没有收到ACK,时间,并再次发送帧。现在接收器具有相同的帧的两个副本,不知道如果第二个是重复的帧或携带相同的数据序列中的下一帧。
(为简单起见,如果RX已经有帧,重复被忽略。)使用代码objselected_frame_stp_wt是我们从发射机ListBox中选定的帧dtimeout是我们预定的超时tsSend_Time是由计时器计算TimeSpan对象objFrame和objAck类clssSqaure的对象,负责创建和移动的原语if (objselected_frame_stp_wt != null)
{
if (tsSend_Time.Seconds > dtimeout)//send time exceeded predetermined timeout
{
if (bsend_file) //Rx didn't receive Frame
lbl_receiver.Text = "Timeout";
else //Tx didn't receive Acknowledgment
lbl_sender.Text = "Timeout";
timer1.Enabled = false;//stop sending
}
if (bsend_file)//Frame is being sent to Rx
{
if (LBx_Receiver.Items.Contains(objselected_frame_stp_wt))
lbl_sender.Text = "Resending " + objselected_frame_stp_wt.ToString();
else
lbl_sender.Text = "Sending " + objselected_frame_stp_wt.ToString();
if ((objFrame.Fxpos + dlen) > nwidth)//frame arrived to Rx
{
if (!LBx_Receiver.Items.Contains(objselected_frame_stp_wt))
{
LBx_Receiver.Items.Add(objselected_frame_stp_wt);
}
lbl_sender.Text = "awaiting acknowledgement";
lbl_receiver.Text = "sending acknowledgement";
bsend_file = false;
dtstart = DateTime.Now;
objAck = new clssSqaure(nwidth, -20, -1, color_yellow);
lst_clssSqaure.Add(objAck);
}
objFrame.Fxpos += fspeed * objFrame.Fvec_X;
}
else//Ack is being sent to Tx
{
if (((objAck.Fxpos - dlen + 10) < (nwidth * -1)))//Ack arrived to Tx
{
lbl_sender.Text = "Acknowledgement received";
if (LBx_Receiver.Items.Contains(objselected_frame_stp_wt))
{
LBx_Sender.Items.Remove(objselected_frame_stp_wt);
}
timer1.Enabled = false;
bsend_file = true;
}
objAck.Fxpos += fspeed * objAck.Fvec_X;
}
}
停止和等待的ARQ相比,其他ARQs的是低效的,因为数据包之间的NBSP时间;如果ACK和数据接收成功的在途时间的两倍。
为了解决这个问题,可以一次发送多个数据包,具有较大的序列号,并使用一个设置之一的ACK。这就是回- N ARQ和选择性重复ARQ的。回- N
发送过程中,仍然没有从接收器接收一个ACK包发送窗口大小指定的帧数。
如果任何帧丢失或损坏,或ACK承认他们丢失或损坏,那么该帧和窗口中的所有(即使他们没有收到错误)下面的帧将被重新发送。{S2}使用代码
SlidingWindow去背N和选择性重复使用的功能。
Q_Frames是一个队列持有窗口的大小帧,当一个帧到达接收在一次成功的,一个objAck是创建并添加到队列Q_Acks。
如果一个帧被丢弃(我们回到GO - N模式),Rx将停止接收。{C}选择性重复
发送过程中,继续发送窗口大小指定帧帧丢失后。
回- N ARQ的不同,接收进程将继续接受并承认在经过最初的error.nbsp发送的帧,如果不从发件人的帧到达接收,发送方继续发送,直到它的后续帧清空其窗口。
接收方将继续与后续帧,以填补其接收窗口,每次答复包含最早的丢失帧的序列号的ACK。一旦发件人发送的所有帧,在其窗口重新发送的ACK帧的数目,然后继续它离开的地方。{S3}历史2月7日,2010年:战后初期