可靠性傳輸
1. 差錯控制
發送方將數據幀發送, 但是當發送方發送的是一個 1的時候此時接受方卻接受的是一個 0.
(1)校驗
接收方如果幀校驗接受到的幀沒有問題, 則對發送方發送一個肯定性的確認, 當對這個數據幀進行校驗發現這個幀有問題的時候, 此時接受方一種是將這個數據幀扔掉, 另一種就是告訴發送方接收的數據幀有問題, 此時向發送方發送一個否定性確認消息.
(2)差錯檢測和校正
檢錯就是如果發現數據幀傳輸的有問題, 則將接受的數據幀扔掉, 校正就是如果接收方發現接收到的數據幀有問題, 就將這個數據幀進行較正最常用的校驗碼是CRC校驗碼
(2)重發
在發送方定一個定時器, 當發送端在發送數據的時候定義個時間, 當發送端發送數據后如果在定時器時間以內發視頻內發送端接收到了一個確認回復, 則發送端認為接收端接受到數據, 如果發送端在定時器以內沒有接收到任何接受方的確認消息, 此時發送端就認為接收端沒有接受到數據.
(3)幀的編號
一個幀中包含了數據真正的數據, 幀的校驗碼, 幀的序號, 確認號, 校驗信息, 幀頭, 幀尾. 接收方在接收到幀的時候向發送方發送一個確認消息, 而這個消息可能也會在中途丟失, 此時當定時器到達時間的時候, 發送方就會再次發送一個幀, 此時為了防止幀的重復接受, 數據幀中應該包含一個編號來標示數據幀的序號. 在接受的時候, 接收方也必須發送給發送方自己接受到了那個幀, 因此數據幀中也應該包含一個確認號, 來識別接受方接受的是那個數據幀.
2. 流量控制
發送方發送數據的速度太快, 而接收方接受數據的速度太慢, 此時發送方就需要降低自己的發送速度.當發送方發送數據速度非常快, 而接受方接收數據的速度又特別的滿, 此時在接收方設置一個緩沖區, 當緩沖區滿達到一定限度的時候, 此時的接受方就給發送方發送一個信息, 告訴發送方讓其暫停發送等候通知.
基本數據鏈路協議
wait_for_evet(&event)
其中參數 event 就是需要等待的事件
每一層都是一個對應的進程, 它們都是處于一個等待的狀態, 對于發送方來說, 網絡層有數據要交給數據鏈路層, 數據鏈路層對應的進程就要等待網絡層將準備好的數據交給自己, 然后數據鏈路層將數據進行封裝交給物理層, 物理層將數據發送出去, 對于接收方, 數據鏈路層時刻準備著物理層將數據交給自己, 然后數據鏈路層將數據進行解包再將數據交給網絡層.
1. 無限制的單工協議
(1)簡化一
A 和 B 之間的信道傳輸不會出錯, 因此在傳輸的過程中就不需要進行差錯檢驗
(2)簡化二
A 和 B 之間在傳輸的過程中不會接受端可以無限的進行數據的接收
因此有了上面兩個簡化的話, 那么對于數據鏈路層來說, 它只管進行數據的封裝以及上下層之間的交互即可, 其他的任務都不用管. 發送方只管將物理層的數據發送出去即可. 數據鏈路層每次去問網絡層看有沒有數據需要自己去傳送, 如果沒有就繼續dengdai,如果有數據需要自己傳送, 那么就從 wait_for_event 這個函數中跳出
//發送方
void sender1(vod)
{frame s;packet buffer;while(ture){from_network_layer(&buffer);s.info - buffer;//數據鏈路層將網絡層傳下來的數據作為自己的數據部分放到 info 中, 幀的封裝to_physicl_layer(&s);//數據鏈路層將自己的幀作為參數傳給物理層}
}
對于接受方而言, 接收方只需要一直等待, 只要有物理層給自己發送數據, 接受方就將數據直接接受, 然后將數據解包送給上面的網絡層
//接收方
void receiver1(void)
{frame r;event_type event;while(ture){wait_for_evnet(&event);//等待物理層給自己發送數據from_physical_layer(&r);//將物理層給出的數據進行解包to_network_layer(&r.info);//把解包的數據送給網絡層}
}
2. 單工的停 - 等協議
由于接收方的接收數據的能力有限, 所以發送方不能一直發送消息, 發送方在發送完數據后就停下來, 等待接收方給自己發送一個信號, 接收方在接受到一個數據后, 將這個數據進行處理, 等到數據處理完之后接收方給發送方發送一個信號告訴發送方現在數據已經處理完畢可以進行發送了, 此時發送方接受到這個信號后才可以繼續進行數據的發送.
//發送方
void sender2(vod)
{frame s;packet buffer;while(ture){from_network_layer(&buffer);s.info - buffer;//數據鏈路層將網絡層傳下來的數據作為自己的數據部分放到 info 中, 幀的封裝to_physicl_layer(&s);//數據鏈路層將自己的幀作為參數傳給物理層wait_for_event(&evet);//發送方等待接受方給自己一個信號告訴自己可以繼續發送數據了}
}
//接收方
void receiver2(void)
{frame r;event_type event;while(ture){wait_for_evnet(&event);//等待物理層給自己發送數據from_physical_layer(&r);//將物理層給出的數據進行解包to_network_layer(&r.info);//把解包的數據送給網絡層to_physical_layer(&s);//給發送方發送一個信號, 這個信號也是一個幀}
}
3. 有噪聲的信道
在協議二的基礎上加上一個定時器. 同時也有差錯檢驗. 對于發送方必須有一個時間限制,當定時器時間已經到的時候, 接受方還沒有給自己一個確認信號, 此時發送方就認為接受方沒有接收到幀, 對于接受方而言, 在收到數據后將數據進行處理, 處理完數據后就需要在定時器的時間范圍內給發送方一個信號, 告訴接受方自己接受到數據. 同時對于發送方而言, 為了防止幀的重復發送, 它必須有一個幀的序號, 來記錄下一個發送的幀的序號, 而對于接受方為了防止接收幀的重復, 此時接受方就需要有一個幀的序號來記錄下一個要接收幀的序號. 因此用一個比特位就可以記錄幀的序號. 發送方發送一個 1 號幀, 接收方等待接收 1 號幀, 接受方接收到 1 號幀的時候就發送一個確認等待接受 0 號幀, 此時發送方再發送一個 0 號幀, 接收方等待接收 0 號幀, 接收方接收到 0 號幀的時候就發送一個確認信號等待接收 1 號幀. 同時協議三增加一個應答號, 應答號用來表示當前收到的是哪個幀.幀的序號是發送方發送的幀的序號, 一個比特位就好了, 應答號是接收方接收到的幀的序號, 只需一個比特位.
4. 雙向傳輸
當接收方接收到數據后對其進行處理, 然后當它要將數據發送給上面的網絡層的時候會給發送方發送一個確認信號, 而在此過程中這個信號每次都會被丟失, 此時接受方就會因為接受不到確認信號且定時器已經到達時間, 此時發送方會不斷地發送重復幀, 接受方會不斷地將接受到的重復幀扔掉, 此時系統會陷入死鎖狀態.
為了提高信道的利用率, 我們采用兩條信道來解決發送方和接受方的通信. 對于發送方, 當發送方發送一個數據幀的時候, 就將它所發送的幀的類型也包括在這個幀中. 假如兩個進程 A 和 B, 當 A 向 B 發送數據幀的時候, 在這個數據幀的首部加上一個幀的類型, B 接受到 A 發來的數據幀的時候就先檢查數據幀的類型, 當 B 檢查該數據幀的時候, 發現這是一個數據幀的時候, 此時就將這個數據幀交給上面的網絡層, 再向 A 發送一個應答幀, 當 A 接收到這個幀的時候就先檢查幀的類型, 當發現這是一個應答幀的時候就說明發給對方的幀對方成功接受, 此時就從網絡層取下一個數據進行發送.
5. 滑動窗口
包含樓量控制, 差錯處理. 每一方都有一個發送窗口, 發送窗口表示發送一次最多發送多少數據對方可以接收. 每一個接收方有一個接收窗口, 這個窗口的大小可以根據發送方的不同設定自己一次可以接收數據的接受量.
(1)滑動窗口原理(設 Wt = 5, Wr = 3)
發送方發送數據時一次發送 5 個數據幀(0 ~ 4)之后就停下來, 接受方接受數據的時候一次接受多個, 其中它接受一個數據初處理一個數據, 接受到第三個數據的時候就處理第三個數據, 當處理完第三個數據(2)的時候給發送方一個確認消息2, 此時發送方就知道接收方接受到了第三個數據了, 于是下次從 2 號數據開始發送.
(2) 一維滑動窗口協議
A 發送一個數據幀發送窗口滿了, 此時就必須等待 B給 A 發送確認消息, B 接受到一個數據幀后等給 A 發送一個確認消息,A 接受到這個確認消息后知道 B 成功接受到了 自己的消息, 于是發送下一個數據幀, 到了 B 之后, B 發送一個數據給 A 時, 此時 B 的窗口已滿, 于是它就停下來等待 A 的確認消息, A 接受到這個消息后就發送一個確認消息給 B, 此時 B 就知道 A 成功接受到了消息
A 發送一個幀后 B 接受到一個幀, 然后發送一個確認消息給 B, B接收到確認消息后發送
(3)后退 n 幀協議
發送方有大于 1 個的發送窗口, 接受方只有一個接受窗口. 發送端每次發送數據幀的時候一次發送一批數據幀. 當有一個幀出錯, 將后面的所有的幀全部重發. 加入發送方發送 0, 1, 2, 3, 4, 5, 6 七個幀, 接受方此時接受一個 0 號幀, 處理完 1 號幀后就發送一個0 號確認消息, 此時發送方滑動窗口轉過就可以發送第八個數據幀了, 接著接受方接收到了一個 1 號幀, 處理 1 號幀, 處理完之后發送一個 1 號確認消息給 發送方, 發送方就可以發送第九個數據幀了, 但是此時 2 號幀丟失了, 此時丟失的這個幀就必須等到發送方的定時器時間到的時候發送方才知道對方沒有接受到 2 號幀, 于是就將2號后面所有的數據幀進行重新發送. 信道利用率較低, 適用于出錯率較低的信道. 是一種實用的 PPP 可靠傳輸. 當數據幀的序號是 n 位的時候, 此時發送方的發送窗口是 2 ^ n - 1 個滑動窗口, 接收方的窗口數是 1
(4) 選擇性重發
在后退 n 幀協議上的基礎上增加的功能是對于出錯的數據幀, 剛才已經發過的數據幀不用重新發送, 只對出錯的數據幀進行重新發送.發送窗口大于 1, 接受窗口大于 1.