資料鏈路層_無聲通道 2
本節講無噪聲通道的第二個協議:停止等待協議
本協議解決的問題是 到達接收方的資料幀的速度大於他們被處理的速度,幀在使用前必須被儲存,
當接收到的幀超出接收方的服務能力之外時那麼就要用本節這個協議控制,也就是 停止等待協議 stop-and-wait protocol,
當傳送方傳送出一個幀後必須停下來直到收到來自接收方的確認,這裡,資料幀仍然是單向通訊的,除了輔助的ACK幀從
另一端傳過來。
設計
在任何時刻,不是在向前通道有個陣列幀,就是在反向通道中有個ACK幀,所有我們需要一個半雙工的鏈路,
此協議和前面的最簡單協議的區別就是這個協議要考慮接收方的處理能力,但他們都不用考慮幀的差錯問題
演算法
下面是停止等待協議中傳送方演算法實現:
while(true) cansend=true{ //判斷網路層是否能給資料鏈路層傳送資料 WaitForEvent(); //當一個時事件出現時喚醒它,這個事件指的什麼? if(Event(RequestToSend) AND canSend){ GetData(); MakeFrame(); SendFrame(); canSend=false; } WaitForEvent(); //這裡這個喚醒它的事件指的是什麼? if(Event(ArrivalNotification)){ ReceiveFrame(); canSend=true; } }
現在看看上面這個演算法怎麼實現的,這個演算法裡有兩個事件,一個是判斷來自網路層的請求,還有個就是判斷來自物理層的通知,網路層請求是否再繼續向資料鏈路層傳送資料,物理層是否接收來自接收方傳來的確認通知ACK,這兩件事必須是交替的
我們想想,資料鏈路層肯定是先接收來自網路層的資料然後轉化成幀再傳遞到物理層,之後傳送發再確認是否收到了ACK確認,也就是收到一個ACK就接接收一次來自網路層的資料,就這樣不停地反覆下去,不可能一次接收兩個幀大小資料,所有說是交替的就是這個原因,
如果一次接收兩個幀然後傳送兩個幀,那麼鏈路層通道就要出現差錯、出現複製幀,但我們現在討論的是無噪聲通道。
網路層的請求是一個緊接著一個的,所有要阻止網路層幀的即時傳送,那麼用什麼方法呢?我們用canSend()判斷語句來控制
以下是停止等待協議中接收方站點演算法實現:
while(true){
WaitForEvent(); // when the event happen, carry out the step
if(Event(ArrivalNotification)){ //if the data frame arrive destination
ReceiveFrame();
ExtractData();
Deliver(data); // deliver the data to Networking Layer
SendFrame(); // send a ACK frame
}
}
//It is impossible for the receiver send a NAK to the sender because the process is ideal
and no noise, so there will not be error happen during the process.
Reference:《Encryptography and Networking Security》6th William Stalling