數據鏈路層: 可靠性傳輸 六個協議

可靠性傳輸

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.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言實現配置文件的讀寫

配置文件的格式如下&#xff1a; key1 value1 key2 value2 . . . 名值對以一個鏈接&#xff0c;一條記錄以換行符分割 頭文件&#xff1a; #include<stdio.h> #include<stdlib.h> #include <string.h> 函數原型&#xff1a; void trim(char *strIn, char *…

Educational Codeforces Round 73 (Rated for Div. 2)

A 很簡單的一個模擬&#xff0c;只要前面的數字有兩個以上就能合成后面的&#xff0c;我們進行一遍合成看能不能出現2048就可以了。 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include&…

數據鏈路層: HDLC

一. 協議機 發送方和接收方. 同時有限狀態機把協議形式化為一個四元組 (S,M,I,T), 其中你S表示進程和信道可能進入的集合, M 表示數據幀的狀態, I 表示進程的初始狀態, T 表示兩兩狀態之間的轉化. 每個系統狀態可以分為發送狀態, 接受狀態和信道狀態. 把狀態用一個點進行表示,…

Miller_Rabin算法

為了測試一個大整數是不是素數&#xff0c;我們不能夠使用傳統的測試是否有因子的方法&#xff0c;因為那樣的時間復雜度至少也是O(n)O(n)O(n)&#xff0c;空間復雜度是O(n)O(n)O(n)&#xff08;使用線性篩數法&#xff09;&#xff0c;時間復雜度還好說&#xff0c;空間復雜度…

bob-tong 字符串函數之Strtok()函數

https://www.cnblogs.com/Bob-tong/p/6610806.html Strtok()函數詳解&#xff1a; 該函數包含在"string.h"頭文件中 函數原型&#xff1a; char* strtok (char* str,constchar* delimiters ); 函數功能&#xff1a; ??切割字符串&#xff0c;將str切分成一個個子…

數據鏈路層:SLIP(串型線路IP) PPP(點對點協議)

SLIP 沒有差錯控制, 傳輸時必須知道對方IP, 傳輸使用于低速業務 19.2k.應用非常受限 PPP協議 1. PPP協議功能 處理錯誤檢測 支持多協議(IP, IPX, DECnet 等) 連接時允許協商 IP 地址 允許身份驗證 2. PPP 的組成 串型鏈路上封裝數據報, 即支持異步鏈路也支持面向 比特…

Honeycomb——BFS

【題目描述】 傳送門 【題目分析】 看起來很復雜好像還要建圖什么的&#xff0c;其實直接在原圖上BFS就可以了&#xff0c;設置一下方向數組&#xff0c;然后直接跑就可以了。 【AC代碼】 #include<cstdio> #include<cstring> #include<algorithm> #inc…

C語言中strspn()函數和strcspn()函數的對比使用

C語言strspn()函數&#xff1a;計算字符串str中連續有幾個字符都屬于字符串accept 頭文件&#xff1a;#include <string.h> strspn() 函數用來計算字符串 str 中連續有幾個字符都屬于字符串 accept&#xff0c;其原型為&#xff1a; size_t strspn(const char *str, con…

Codeforces Round #587 (Div. 3)

A 只要每兩個都不一樣就可以&#xff0c;一旦出現兩個一樣的就改一個。 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typede…

信道分配 以太網

1.頻分復用 將信道分為多個頻帶, 用戶得到某個頻帶后,在通信的過程中, 自始至終都都占用這個信道.即頻分復用中, 所有用戶同時占用不同頻帶的信道 2. 時分信道 將時間劃分為一段一段的等長時分復用幀, 每個用戶在不同時間占用相同的數據幀 3. CSMA/CD 載波監聽多點接入/碰撞…

strpbrk函數

http://blog.csdn.net/tommy_wxie/article/details/7554332 函數原型&#xff1a;extern char *strpbrk(char *str1, char *str2) 參數說明&#xff1a;str1待比較的字符串&#xff0c;str2為指定被搜索的字符串。 所在庫名&#xff1a;#include <string.h> …

網絡層網絡層服務及其 IP 地址

ARP 協議功能 將 IP 地址通過廣播(一個網段, 不能跨路由器), 目標 MAC 地址是FFFFFFFF 解析目標IP地址的 MAC 地址. IP 協議 網絡層的一個協議, 是一個協議的統稱, 包括 ARP(地址解析協議) 協議, ICMP(網絡控制報文協議) 協議, IGMP(網際組管理協議) 協議. 其中 ICMP 和 IG…

隨機生成1024個數,存入一段內存,用指針實現獲取1024個數的最大數地址,最小數地址

http://blog.csdn.net/itcastcpp//details/39277193 題目&#xff1a;隨機生成1024個數&#xff0c;存入一段內存&#xff0c;用指針實現獲取1024個數的最大數地址&#xff0c;最小數地址&#xff0c;具體實現如下&#xff1a; [cpp] view plaincopy #include<stdlib.h> …

UVa11134

【題目分析】 覺得是一道挺考驗貪心掌握程度的題目&#xff0c;我就算知道是要用貪心而且肯定和區間有關&#xff0c;肯定要進行一下排序什么的我還是沒有找到合適的貪心策略。 經過大佬的博客后我才明白如何進行貪心。 如果沒有任何提示看這道題&#xff0c;首先&#xff0…

傳輸層:IP 地址解析 路由轉發

IP 地址與硬件地址 1. 地址解析 通過IP地址將其如何轉換為 MAC 地址.解決同一個局域網上的主機或路由的 IP 地址和硬件地址的映射問題. 即以太網上除了主機還有路由. 即如果發出的請求所有的主機都沒有做出相應, 那么該以太網上的路由會對其做出響應. (1) 以太網內部主機與…

UVa11582

一個數學問題,一旦出現循環確定循環節以后就能解決問題啦. 加上一個快速冪取模.需要注意的是數據范圍是264,所以必須用unsigned long long才能解決問題. 覺得板子還是要會自己寫,否則不同的題目具體有一些小的改變就會束手無策. 還有就是發現如果每次初始化數組的話就會超時,所…

輸入一個單向鏈表,輸出該鏈表中倒數第K個結點

http://blog.csdn.net/itcastcpp/article/details/39274891//尹成 單鏈表操作 #include <iostream> using namespace std; class LinkList;struct LinkNode { public:LinkNode(int value 0):m_value(value),pNext(NULL){}~LinkNode(){pNext NULL;}friend class LinkList…

網絡層:構成超網(CIDR)

CIDR構成超網 CIDR消除了原來的傳統的 A,B, C, D類地址, 使用了各種網絡前綴來代替原來分類地址中的網絡號和子網號, IP 地址由原來的三級分類又變成了兩級分類. 其中網絡號和子網號是一個隨機的長度. 其中 CIDR 也可以使用 / 的形式來表示, 其中在 / 前面寫上網絡前綴的位數.…

UVa12169

我們可以暴力枚舉a,然后通過x1和x3確定b的值&#xff0c;然后確定其他的數字&#xff0c;一旦出現錯誤就放棄這組解。 關鍵問題就在于如何通過a,x1,x3確定b的值 x2 ( x1 * a b) % M x3 ( x2 * a b ) % M ( ( x1 * a b ) % M * a b ) % M x3 - k * M x1 * a % M * a %…

尹成 雙循環鏈表

今天&#xff0c;我們一起用C寫一個雙鏈表&#xff0c;具體代碼如下&#xff1a; DoubleList.h具體內容如下&#xff1a; [cpp] view plaincopy #include "NodeList.h" template<typename Type> class DoublyList{ public: DoublyList() :head(ne…