沒有積分的, 看到這個問題也不想回了。網路中差,是用軟體來限制網速的。具體什麼軟體,自己用網路查吧。
❷ CRC演算法模擬 計算機網路基礎課程 高分求解 正解追加200
引言
CRC的全稱為Cyclic Rendancy Check,中文名稱為循環冗餘校驗。它是一類重要的線性分組碼,編碼和解碼方法簡單,檢錯和糾錯能力強,在通信領域廣泛地用於實現差錯控制。實際上,除數據通信外,CRC在其它很多領域也是大有用武之地的。例如我們讀軟盤上的文件,以及解壓一個ZIP文件時,偶爾會碰到「Bad CRC」錯誤,由此它在數據存儲方面的應用可略見一斑。
差錯控制理論是在代數理論基礎上建立起來的。這里我們著眼於介紹CRC的演算法與實現,對原理只能捎帶說明一下。若需要進一步了解線性碼、分組碼、循環碼、糾錯編碼等方面的原理,可以閱讀有關資料。
利用CRC進行檢錯的過程可簡單描述為:在發送端根據要傳送的k位二進制碼序列,以一定的規則產生一個校驗用的r位監督碼(CRC碼),附在原始信息後邊,構成一個新的二進制碼序列數共k+r位,然後發送出去。在接收端,根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。這個規則,在差錯控制理論中稱為「生成多項式」。
1 代數學的一般性演算法
在代數編碼理論中,將一個碼組表示為一個多項式,碼組中各碼元當作多項式的系數。例如 1100101 表示為
1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即 x6+x5+x2+1。
設編碼前的原始信息多項式為P(x),P(x)的最高冪次加1等於k;生成多項式為G(x),G(x)的最高冪次等於r;CRC多項式為R(x);編碼後的帶CRC的信息多項式為T(x)。
發送方編碼方法:將P(x)乘以xr(即對應的二進制碼序列左移r位),再除以G(x),所得余式即為R(x)。用公式表示為
T(x)=xrP(x)+R(x)
接收方解碼方法:將T(x)除以G(x),如果余數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤。
舉例來說,設信息碼為1100,生成多項式為1011,即P(x)=x3+x2,G(x)=x3+x+1,計算CRC的過程為
xrP(x) x3(x3+x2) x6+x5 x
-------- = ---------- = -------- = (x3+x2+x) + --------
G(x) x3+x+1 x3+x+1 x3+x+1
即 R(x)=x。注意到G(x)最高冪次r=3,得出CRC為010。
如果用豎式除法,計算過程為
1110
-------
1011 /1100000 (1100左移3位)
1011
----
1110
1011
-----
1010
1011
-----
0010
0000
----
010
因此,T(x)=(x6+x5)+(x)=x6+x5+x, 即 1100000+010=1100010
如果傳輸無誤,
T(x) x6+x5+x
------ = --------- = x3+x2+x,
G(x) x3+x+1
無余式。回頭看一下上面的豎式除法,如果被除數是1100010,顯然在商第三個1時,就能除盡。
上述推算過程,有助於我們理解CRC的概念。但直接編程來實現上面的演算法,不僅繁瑣,效率也不高。實際上在工程中不會直接這樣去計算和驗證CRC。
下表中列出了一些見於標準的CRC資料:
名稱 生成多項式 簡記式* 應用舉例
CRC-4 x4+x+1 ITU G.704
CRC-12 x12+x11+x3+x+1
CRC-16 x16+x12+x2+1 1005 IBM SDLC
CRC-ITU** x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
CRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP
* 生成多項式的最高冪次項系數是固定的1,故在簡記式中,將最高的1統一去掉了,如04C11DB7實際上是104C11DB7。
** 前稱CRC-CCITT。ITU的前身是CCITT。
2 硬體電路的實現方法
多項式除法,可用除法電路來實現。除法電路的主體由一組移位寄存器和模2加法器(異或單元)組成。以CRC-ITU為例,它由16級移位寄存器和3個加法器組成,見下圖(編碼/解碼共用)。編碼、解碼前將各寄存器初始化為"1",信息位隨著時鍾移入。當信息位全部輸入後,從寄存器組輸出CRC結果。
3 比特型演算法
上面的CRC-ITU除法電路,完全可以用軟體來模擬。定義一個寄存器組,初始化為全"1"。依照電路圖,每輸入一個信息位,相當於一個時鍾脈沖到來,從高到低依次移位。移位前信息位與bit0相加產生臨時位,其中bit15移入臨時位,bit10、bit3還要加上臨時位。當全部信息位輸入完成後,從寄存器組取出它們的值,這就是CRC碼。
typedef unsigned char bit;
typedef unsigned char byte;
typedef unsigned short u16;
typedef union {
u16 val;
struct {
u16 bit0 : 1;
u16 bit1 : 1;
u16 bit2 : 1;
u16 bit3 : 1;
u16 bit4 : 1;
u16 bit5 : 1;
u16 bit6 : 1;
u16 bit7 : 1;
u16 bit8 : 1;
u16 bit9 : 1;
u16 bit10 : 1;
u16 bit11 : 1;
u16 bit12 : 1;
u16 bit13 : 1;
u16 bit14 : 1;
u16 bit15 : 1;
} bits;
} CRCREGS;
// 寄存器組
CRCREGS regs;
// 初始化CRC寄存器組:移位寄存器置為全"1"
void crcInitRegisters()
{
regs.val = 0xffff;
}
// CRC輸入一個bit
void crcInputBit(bit in)
{
bit a;
a = regs.bits.bit0 ^ in;
regs.bits.bit0 = regs.bits.bit1;
regs.bits.bit1 = regs.bits.bit2;
regs.bits.bit2 = regs.bits.bit3;
regs.bits.bit3 = regs.bits.bit4 ^ a;
regs.bits.bit4 = regs.bits.bit5;
regs.bits.bit5 = regs.bits.bit6;
regs.bits.bit6 = regs.bits.bit7;
regs.bits.bit7 = regs.bits.bit8;
regs.bits.bit8 = regs.bits.bit9;
regs.bits.bit9 = regs.bits.bit10;
regs.bits.bit10 = regs.bits.bit11 ^ a;
regs.bits.bit11 = regs.bits.bit12;
regs.bits.bit12 = regs.bits.bit13;
regs.bits.bit13 = regs.bits.bit14;
regs.bits.bit14 = regs.bits.bit15;
regs.bits.bit15 = a;
}
// 輸出CRC碼(寄存器組的值)
u16 crcGetRegisters()
{
return regs.val;
}
crcInputBit中一步一步的移位/異或操作,可以進行簡化:
void crcInputBit(bit in)
{
bit a;
a = regs.bits.bit0 ^ in;
regs.val >>= 1;
if(a) regs.val ^= 0x8408;
}
細心的話,可以發現0x8408和0x1021(CRC-ITU的簡記式)之間的關系。由於我們是從低到高輸出比特流的,將0x1021左右反轉就得到0x8408。將生成多項式寫成 G(x)=1+x5+x12+x16,是不是更好看一點?
下面是一個典型的PPP幀。最後兩個位元組稱為FCS(Frame Check Sequence),是前面11個位元組的CRC。
FF 03 C0 21 04 03 00 07 0D 03 06 D0 3A
我們來計算這個PPP幀的CRC,並驗證它。
byte ppp[13] = {0xFF, 0x03, 0xC0, 0x21, 0x04, 0x03, 0x00, 0x07, 0x0D, 0x03, 0x06, 0x00, 0x00};
int i,j;
u16 result;
/////////// 以下計算FCS
// 初始化
crcInitRegisters();
// 逐位輸入,每個位元組低位在先,不包括兩個FCS位元組
for(i = 0; i < 11; i++)
{
for(j = 0; j < 8; j++)
{
crcInputBit((ppp[i] >> j) & 1);
}
}
// 得到CRC:將寄存器組的值求反
result = ~crcGetRegisters();
// 填寫FCS,先低後高
ppp[11] = result & 0xff;
ppp[12] = (result >> 8) & 0xff;
/////////// 以下驗證FCS
// 初始化
crcInitRegisters();
// 逐位輸入,每個位元組低位在先,包括兩個FCS位元組
for(i = 0; i < 13; i++)
{
for(j = 0; j < 8; j++)
{
crcInputBit((ppp[i] >> j) & 1);
}
}
// 得到驗證結果
result = crcGetRegisters();
可以看到,計算出的CRC等於0x3AD0,與原來的FCS相同。驗證結果等於0。初始化為全"1",以及將寄存器組的值求反得到CRC,都是CRC-ITU的要求。事實上,不管初始化為全"1"還是全"0",計算CRC取反還是不取反,得到的驗證結果都是0。
4 位元組型演算法
比特型演算法逐位進行運算,效率比較低,不適用於高速通信的場合。數字通信系統(各種通信標准)一般是對一幀數據進行CRC校驗,而位元組是幀的基本單位。最常用的是一種按位元組查表的快速演算法。該演算法基於這樣一個事實:計算本位元組後的CRC碼,等於上一位元組余式CRC碼的低8位左移8位,加上上一位元組CRC右移8位和本位元組之和後所求得的CRC碼。如果我們把8位二進制序列數的CRC(共256個)全部計算出來,放在一個表裡 ,編碼時只要從表中查找對應的值進行處理即可。
CRC-ITU的計算演算法如下:
a.寄存器組初始化為全"1"(0xFFFF)。
b.寄存器組向右移動一個位元組。
c.剛移出的那個位元組與數據位元組進行異或運算,得出一個指向值表的索引。
d.索引所指的表值與寄存器組做異或運算。
f.數據指針加1,如果數據沒有全部處理完,則重復步驟b。
g.寄存器組取反,得到CRC,附加在數據之後。
CRC-ITU的驗證演算法如下:
a.寄存器組初始化為全"1"(0xFFFF)。
b.寄存器組向右移動一個位元組。
c.剛移出的那個位元組與數據位元組進行異或運算,得出一個指向值表的索引。
d.索引所指的表值與寄存器組做異或運算。
e.數據指針加1,如果數據沒有全部處理完,則重復步驟b (數據包括CRC的兩個位元組)。
f.寄存器組的值是否等於「Magic Value」(0xF0B8),若相等則通過,否則失敗。
下面是通用的CRC-ITU查找表以及計算和驗證CRC的C語言程序:
// CRC-ITU查找表
const u16 crctab16[] =
{
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78,
};
// 計算給定長度數據的16位CRC。
u16 GetCrc16(const byte* pData, int nLength)
{
u16 fcs = 0xffff; // 初始化
while(nLength>0)
{
fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];
nLength--;
pData++;
}
return ~fcs; // 取反
}
// 檢查給定長度數據的16位CRC是否正確。
bool IsCrc16Good(const byte* pData, int nLength)
{
u16 fcs = 0xffff; // 初始化
while(nLength>0)
{
fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];
nLength--;
pData++;
}
return (fcs == 0xf0b8); // 0xf0b8是CRC-ITU的"Magic Value"
}
使用位元組型演算法,前面出現的PPP幀FCS計算和驗證過程,可用下面的程序片斷實現:
byte ppp[13] = {0xFF, 0x03, 0xC0, 0x21, 0x04, 0x03, 0x00, 0x07, 0x0D, 0x03, 0x06, 0x00, 0x00};
u16 result;
// 計算CRC
result = GetCrc16(ppp, 11);
// 填寫FCS,先低後高
ppp[11] = result & 0xff;
ppp[12] = (result >> 8) & 0xff;
// 驗證FCS
if(IsCrc16Good(ppp, 13))
{
... ...
}
該例中數據長度為11,說明CRC計算並不要求數據2位元組或4位元組對齊。
至於查找表的生成演算法,以及CRC-32等其它CRC的演算法,可參考RFC 1661, RFC 3309等文檔。需要注意的是,雖然CRC演算法的本質是一樣的,但不同的協議、標准所規定的初始化、移位次序、驗證方法等可能有所差別。
結語
CRC是現代通信領域的重要技術之一。掌握CRC的演算法與實現方法,在通信系統的設計、通信協議的分析以及軟體保護等諸多方面,能發揮很大的作用。如在作者曾經設計的一個多串口數據傳輸系統中,每串口速率為460kbps,不加校驗時誤碼率大於10-6,加上簡單的奇偶校驗後性能改善不很明顯,利用CRC進行檢錯重傳,誤碼率降低至10-15以下,滿足了實際應用的要求。
❸ 計算機網路的主要功能是什麼
實現資源共享,實現數據信息的快速傳遞,提高可靠性,提供負載均衡與分布式處理能力,集中管理以及綜合信息服務。
❹ 計算機網路技術中的差錯控制
差錯控制就是提高數據傳輸的正確率嘛,減少錯誤數據在信道中的傳輸佔用信道帶寬。引發數據出現差錯的原因有很多,以數據鏈路層來說,可能是幀重復,幀失序,幀丟失。每層都引入差錯控制,因為每層的數據都是以不同的形式傳輸的,物理層傳輸比特流,總不能用幀的差錯控制去解決比特流傳輸過程中出現的差錯
❺ 大學計算機網路OSI模型差錯控制題
物理層,原因是只有在物理傳輸中,傳輸介質會受到雜訊的干擾。
網路層,一個分組應該就是IP包
數據鏈路層,在二層傳輸的數據叫幀
第4個比較不好判斷,首先要明白這個錯誤的指令是操作造成的錯誤指令,還是在傳輸過程中導致正確的指令錯誤。如果是前者的話是在應用層,如果是後者是表示層。
僅供參考!!
❻ 計算機網路題求解答 謝謝
2017年12月28日,星期四,
兄弟,你這照片上的第一題中多項式的指數看不清呀,
沒事,我就現在的情形,給你說一下大概的思路,你參考著,再結合題目中實際的參數,再套一遍就能把題目解出來了,
CSMA/CD(Carrier Sense Multiple Access with Collision Detection)基帶沖突檢測的載波監聽多路訪問技術(載波監聽多點接入/碰撞檢測)。所有的節點共享傳輸介質。
原理,如下,
1、所有的站點共享唯一的一條數據通道,
2、在一個站點發送數據時,其他的站點都不能發送數據,如果要發送就會產生碰撞,就要重新發送,而且所有站點都要再等待一段隨即的時間,
3、對於每一個站而言,一旦它檢測到有沖突,它就放棄它當前的傳送任務。換句話說,如果兩個站都檢測到信道是空閑的,並且同時開始傳送數據,則它們幾乎立刻就會檢測到有沖突發生。
4、它們不應該再繼續傳送它們的幀,因為這樣只會產生垃圾而已;相反一旦檢測到沖突之後,它們應該立即停止傳送數據。快速地終止被損壞的幀可以節省時間和帶寬。
5、它的工作原理是: 發送數據前 先偵聽信道是否空閑 ,若空閑,則立即發送數據。若信道忙碌,則等待一段時間至信道中的信息傳輸結束後再發送數據;若在上一段信息發送結束後,同時有兩個或兩個以上的節點都提出發送請求,則判定為沖突。若偵聽到沖突,則立即停止發送數據,等待一段隨機時間,再重新嘗試。
6、原理簡單總結為:先聽後發,邊發邊聽,沖突停發,隨機延遲後重發。
7、Carrier Sense Multiple Access就是,要發送和發送中都要進行監聽,
8、有人將CSMA/CD的工作過程形象的比喻成很多人在一間黑屋子中舉行討論會,參加會議的人都是只能聽到其他人的聲音。每個人在說話前必須先傾聽,只有等會場安靜下來後,他才能夠發言。人們將發言前監聽以確定是否已有人在發言的動作稱為"載波監聽";將在會場安靜的情況下每人都有平等機會講話成為「多路訪問」;如果有兩人或兩人以上同時說話,大家就無法聽清其中任何一人的發言,這種情況稱為發生「沖突」。發言人在發言過程中要及時發現是否發生沖突,這個動作稱為「沖突檢測」。如果發言人發現沖突已經發生,這時他需要停止講話,然後隨機後退延遲,再次重復上述過程,直至講話成功。如果失敗次數太多,他也許就放棄這次發言的想法。通常嘗試16次後放棄。
9、核心問題:解決在公共通道上以廣播方式傳送數據中可能出現的問題(主要是數據碰撞問題)
包含四個處理內容:監聽、發送、檢測、沖突處理
監聽:
通過專門的檢測機構,在站點准備發送前先偵聽一下匯流排上是否有數據正在傳送(線路是否忙)?
若「忙」則進入後述的「退避」處理程序,進而進一步反復進行偵聽工作。
發送:
當確定要發送後,通過發送機構,向匯流排發送數據。
檢測:
數據發送後,也可能發生數據碰撞。因而,要對數據邊發送,邊檢測,以判斷是否沖突了。
沖突處理:
當確認發生沖突後,進入沖突處理程序。有兩種沖突情況:
① 偵聽中發現線路忙
② 發送過程中發現數據碰撞
① 若在偵聽中發現線路忙,則等待一個延時後再次偵聽,若仍然忙,則繼續延遲等待,一直到可以發送為止。每次延時的時間不一致,由退避演算法確定延時值。
② 若發送過程中發現數據碰撞,先發送阻塞信息,強化沖突,再進行監聽工作,以待下次重新發送
10、
先聽後說,邊聽邊說,邊說邊聽;
一旦沖突,立即停說;
等待時機,然後再說;
註:「聽」,即監聽、檢測之意;「說」,即發送數據之意。
11、在發送數據前,先監聽匯流排是否空閑。若匯流排忙,則不發送。若匯流排空閑,則把准備好的數據發送到匯流排上。在發送數據的過程中,工作站邊發送邊檢測匯流排,是否自己發送的數據有沖突。若無沖突則繼續發送直到發完全部數據;若有沖突,則立即停止發送數據,但是要發送一個加強沖突的JAM信號,以便使網路上所有工作站都知道網上發生了沖突,然後,等待一個預定的隨機時間,且在匯流排為空閑時,再重新發送未發完的數據。
12、
CSMA/CD網路上進行傳輸時,必須按下列五個步驟來進行
(1)傳輸前監聽
(2)如果忙則等待
(3)如果空閑則傳輸並檢測沖突
(4)如果沖突發生,重傳前等待
(5)重傳或夭折
補充一個重要的知識點:
要使CSMA/CA 正常工作,我們必須要限制幀的長度。如果某次傳輸發生了碰撞,那麼正在發送數據的站必須在發送該幀的最後一比特之前放棄此次傳輸,因為一旦整個幀都被發送出去,那麼該站將不會保留幀的復本,同時也不會繼續監視是否發生了碰撞。所以,一旦檢測出有沖突,就要立即停止發送,
舉例說明,
A站點發送數據給B站點,當A站通過監聽確認線路空閑後,開始發送數據給B站點,同時對線路進行監聽,即邊發送邊監聽,邊監聽邊發送,直到數據傳送完畢,那麼如果想要正確發送數據,就需要確定最小幀長度和最小發送間隙(沖突時槽)。
CSMA/CD沖突避免的方法:先聽後發、邊聽邊發、隨機延遲後重發。一旦發生沖突,必須讓每台主機都能檢測到。關於最小發送間隙和最小幀長的規定也是為了避免沖突。
考慮如下的情況,主機發送的幀很小,而兩台沖突主機相距很遠。在主機A發送的幀傳輸到B的前一刻,B開始發送幀。這樣,當A的幀到達B時,B檢測到沖突,於是發送沖突信號,假如在B的沖突信號傳輸到A之前,A的幀已經發送完畢,那麼A將檢測不到沖突而誤認為已發送成功。由於信號傳播是有時延的,因此檢測沖突也需要一定的時間。這也是為什麼必須有個最小幀長的限制。
按照標准,10Mbps乙太網採用中繼器時,連接的最大長度是2500米,最多經過4個中繼器,因此規定對10Mbps乙太網一幀的最小發送時間為51.2微秒。這段時間所能傳輸的數據為512位,因此也稱該時間為512位時。這個時間定義為乙太網時隙,或沖突時槽。512位=64位元組,這就是乙太網幀最小64位元組的原因。
以上信息的簡單理解是:A發送一個幀的信息(大小不限制),B收到此幀,發現有沖突,馬上發送包含檢測到了沖突的信息給A,這個沖突信息到達A也是需要時間的,所以,要想A成功發送一個幀(並知道這個幀發送的是否成功,沖沒沖突)是需要這個幀從A到B,再從B到A,這一個來回的時間,
也就是說,當一個站點決定是否要發送信息之前,一定要先進行線路的檢測,那麼隔多長時間檢測一次合適呢(在沒有檢測的期間是不進行數據的發送的,因此也就不存在沖突),這就要看, 一個電子信號在這兩個站點之間跑一個來回的時間了,試想一下,如果這個信號還沒有跑到地方,你就開始檢測,顯然是浪費檢測信號的設備資源,然後,A站點發送一個電子信號給B站點,信號經過一段時間到達了B站點,然後假設B發現了沖突,馬上告訴A,那麼這個電子信號再跑回A也需要一段時間,如果當這個信號在路上的時候,A就開始檢測是不是有沖突,顯然是不合適的,因為,B發送的沖突信號還在路上,如果A在這個時間段就檢測,一定不會發現有沖突,那麼,A就會繼續發送信號,但這是錯誤,因為已經有沖突被檢測出來,因此,A這么做是錯誤的,所以,A要想正確發送一個電子信號給B,並且被B正確接收,就需要,A發送一個電子信號,並等待它跑一個來回的時間那麼長,才能確認是沒有沖突,然後再繼續發送下一個信號,
這個電子信號跑一個來回的時間,是由站點間的距離s、幀在媒體上的傳播速度為v(光速)以及網路的傳輸率為r(bps)共同決定的,
那麼,假設電子信號跑一個來回的時間是t,則有如下式子,
t=2s/v;
又有,假設在時間t內可以傳送的數據量(最小幀)為L,則有如下式子,
L=t*r;解釋:這個就是說,一個電子信號從A跑到B需要t這么長時間,又因為電子信號幾乎接近光速,因此,即使在t這么短的時間內,我仍然可以不停的發送很多個電子信號,這樣就形成了一串二進制數列在t這個很小的時間段內被從A發送出去,那麼我在t這個時間段內究竟能發送出去多少的電子信號,就要看我的傳輸率r是多少了,因為有這種關系,所以就形成了最小幀的概念,
將 L=t*r 變形為 t=L/r,並將 t=L/r 帶入 t2s/v,得到式子:L/r=2s/v,
再將,題目中給出的數據帶入上式,得到
2500位元組/(1G bps)=2s/200000(Km);將單位統一後,有下式:
(2500*8)/(1024*1024*1024)=2s/200000(Km);繼續計算,得:
s=1.86Km,
若1Gbps取值為1000*1000*1000,則s=2Km;
兄弟,我這個利用工作空隙給你寫答案,你別著急啊,現在是12:48,第三題,我抓緊時間幫你算。
❼ 計算機網路的差錯控制指的是什麼
差錯產生原因主要是由於線路本身電氣特性所產生的隨機噪音,信號振幅,頻率和相位的衰減等設備故障因素造成
差錯分為單比特差錯和突發差錯,單比特差錯是指在傳輸的數據單元只有一個比特發生變化,而突發差錯是有兩個或兩個以上的比特發生變化
--差錯控制的兩種方法
1.從硬體入手,但增加通信成本
2.傳輸過程中進行差錯控制,在數據鏈路層採用編碼進行查錯CRC和糾錯處理
❽ 計算機網路問題,急,,,
2017年12月13日星期三,
這里需要強調一點,生成多項式(generator polynomial)和多項式不是一個概念,這里需要注意。我個人的理解是你要進行幾位的CRC校驗,就需要幾位的生成多項式(generator polynomial),但還收到生成多項式(generator polynomial)的第一位必須為1的限制,因此生成的多項式還需要注意這一點。原始信息所對應的多項式和生成多項式(generator polynomial)不是一個概念。
首先,我們要知道,任何一串二進制數都可以用一個多項式表示:且這串二進制數的各位對應多項式的各冪次,多項式中假如有此冪次項(比如多項式匯中有冪次項x^2對應二進制串碼中從右至左的第三位二進制數一定為1.因為右數第一位的冪次項為x^0,右數第二位的冪次項為x^1),則對應二進制數串碼中此位置的1,無此冪次項對應0。
舉例:代碼1010111對應的多項式為x^6+x^4+x^2+x+1,若我們將缺失的冪次項補全的話就有x^6+(x^5)+x^4+(X^3)+x^2+x+1,又因為x^5和X^3所對應的二進制位為0,不記入多項式中,因此有x^6+x^4+x^2+x+1,就是表示 1010111這個串碼。
而多項式為x^5+x^3+x^2+x+1的完整多項式為x^5+(x^4)+x^3+x^2+x+1正好對應二進制串碼101111,而x^4對應的二進制串碼中右數第五位(左數第二位)為0,不記入多項式中,因此,101111可以使用多項式x^5+x^3+x^2+x+1來表示。
通過上述兩個多項式的例子,可以看出,當多項式中的冪次項所對應的那一位二進制為1時,多項式中的那一個冪次項存在,而當二進制串碼中的某位為0時,對應的多項式冪次項忽略不記錄,例如,10111 1因為從左向右第二位是0,因此對應的多項式分子x^4就沒有被記錄到多項式中,
書面的說法是:
多項式和二進制數有直接對應關系:X的最高冪次對應二進制數的最高位,以下各位對應多項式的各冪次,有此冪次項對應1,無此冪次項對應0。可以看出:X的最高冪次為R,轉換成對應的二進制數有R+1位,
我們現在來看題目中generator plynomial (生成多項式)is X^4+x^2+1,最高冪次是4,因此,其表示的二進制為(4+1=5)5位,
且通過crc的原理,我們知道,循環冗餘校驗碼(CRC)是由兩部分組拼接而成的,
第一部分是信息碼,
第二部分是校驗碼,
可得公式:
CRC=信息碼+校驗碼,
很明顯校驗碼是跟在信息碼之後的,所以,題目中1101011011中左數的那5位是真正傳輸的信息(信息碼),即actual bit string transmitted(實際傳輸的信息位流)是11010,而後面的5位(11011)是校驗碼,
接下來我們結合上面的內容來理解對CRC的定義:
循環冗餘校驗碼(CRC)的基本原理是:在K位信息碼後再拼接R位的校驗碼,整個編碼長度為N位,因此,這種編碼也叫(N,K)碼。對於一個給定的(N,K)碼,可以證明存在一個最高次冪為N-K=R的多項式G(x)。根據G(x)可以生成K位信息的校驗碼,而G(x)叫做這個CRC碼的生成多項式。 校驗碼的具體生成過程為:假設要發送的信息用多項式C(X)表示,將C(x)左移R位(可表示成C(x)*2^R),這樣C(x)的右邊就會空出R位,這就是校驗碼的位置。用 C(x)*2^R 除以生成多項式G(x)得到的余數就是校驗碼。
另一個定義:
利用CRC進行檢錯的過程可簡單描述為:在發送端根據要傳送的k位二進制碼序列,以一定的規則產生一個校驗用的r位監督碼(CRC碼),附在原始信息後邊,構成一個新的二進制碼序列數共k+r位,然後發送出去。在接收端,根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。這個規則,在差錯控制理論中稱為「生成多項式」。
再看另一個描述,在代數編碼理論中,將一個碼組表示為一個多項式,碼組中各碼元當作多項式的系數。例如 1100101 表示為1·x^6+1·x^5+0·x^4+0·x^3+1·x^2+0·x^1+1,即 x^6+x^5+x^2+1。
設,編碼前的原始信息多項式為P(x),P(x)的最高冪次加1等於k(這里的K就是整個原始信息的二進制編碼的長度,以上例1100101為例,此串二進制編碼的最高位對應的多項式冪次為6,根據定義得K=6+1=7,正好是此串二進制編碼的長度,);
設,生成多項式為G(x),G(x)的最高冪次等於r,這個r可以隨意指定,也就是r可以不等於K,但指定r時,必須滿足生成多項式G(x)最高位必須為1的條件,
設,CRC多項式為R(x)。:將P(x)乘以x^r(即對應的二進制碼序列左移r位),再除以G(x),所得余式即為R(x)。
設,編碼後的帶CRC的信息多項式為T(x)。:用公式表示為T(x)=x^r*P(x)+R(x),翻譯過來就是,編碼後的帶CRC校驗的多項式由左移了r位的原始信息P(x)後接CRC的校驗碼R(x)組成,
而在接收端,是使用T(x )去除G(x),若無余數,則表示接收正確。就是接收端使用接收到的信息T(x )去除和發送端約好的生成多項式G(x),若除盡沒有餘數則表示信息正確接收。
我們再來看本題,
題中給出已傳輸的信息為:1101011011,即T(x )=1101011011;
而generator polynomial 生成多項式是:x^4+x^2+1,即G(x)=10101;
那麼,我們來使用T(x )除以G(x)=110,根據上面的定義,我們知道,出現了沒有除盡的情況,有餘數,余數為110,則說明信息11010在傳遞過程出現了錯誤,而題目中給出,若將此信息串碼的左數第三位進行翻轉,則接收到的信息為:1111011011,那麼,
T(x )=1111011011,
則,再通過T(x )除以G(x)進行校驗運算後,得到余數1,沒有除盡
即T(x )除以G(x)=1,
所以沒有通過CRC校驗,此時,接收端能發現這個錯誤,
但是,如果我們將此串數據的左數第三位和最後一位同時翻轉,得到1111011010,那麼再經過T(x )除以G(x)的接收端校驗後,除盡了,余數為0,則,此時,因為T(x )除以G(x)=0,通過了接收端的校驗,因此,接收端並不能發現這個錯誤,以為是收到了正確的串碼:11110,但實際上我們發送的串碼是:11010,
最後,我們再來研究一下,T(x )是怎麼除G(x)的,實際上我們必須清楚,這里的除法實際上並不是我們傳統意義上的十進制除法,而是兩個二進制的「按位異或」(請注意每步運算都是先進行高位對齊的。)的演算法,在二進制數運算中,這被稱為模二除運算,
來看兩個例子,
【例一】假設使用的生成多項式是G(X)=X3+X+1。4位的原始報文為1010,求編碼後的報文。
解:
1、將生成多項式G(X)=X^3+X+1轉換成對應的二進制除數1011。
R=3,R就是生成多項式的最高次冪,
2、此題生成多項式有4位(R+1)(注意:通過對生成多項式計算所得的校驗碼為3位,因為,生成多項式的R為生成多項式的最高次冪,所以校驗碼位數是3位),要把原始報文C(X)【這里的C(X)就是1010】左移3(R)位變成1010 000
3、用生成多項式對應的二進制數對左移3位後的原始報文進行模2除(高位對齊),相當於按位異或:
1010000
1011
------------------
0001000, 請注意這里,通過第一次除法,也就是模2除(高位對齊)的運算,將兩個二進制代碼進行了高位對齊後的按位異或的操作後,得到0001000即1000,接下來,需要進行第二次除法,即使用第一步得到的二進制數1000去除1011【G(x)】,則有下面的式子,
1000
1011
------------------
0011,請注意,結果為0011,也可以寫成11,但是我們由上面得知,由生成多項式G(X)=X^3+X+1,已經確定了校驗位是3位,因此,
得到的余位011,所以最終編碼為:1010 011。
例二:
信息欄位代碼為: 1011001;對應的原始多項式P(x)=x6+x4+x3+1
假設生成多項式為:g(x)=x4+x3+1;則對應g(x)的代碼為: 11001,又因為g(x)最高次冪為4,因此可以確定校驗位是4位,
根據CRC給生成多項式g(x)定義的規則,將原始代碼整體左移4位,這樣在原始數據後面多出4位校驗位的位置,即x^4*P(x),得到:10110010000;
接下來使用10110010000去除以g(x),得到最終的余數1010,並與原始信息組成二進制串碼:1011001 1010發送出去,
接收方:使用相同的生成多項式進行校驗:接收到的欄位/生成碼(二進制除法)
如果能夠除盡,則正確,
給出余數(1010)的計算步驟:
除法沒有數學上的含義,而是採用計算機的模二除法,即除數和被除數做異或運算。進行異或運算時除數和被除數最高位對齊,按位異或。
10110010000
^11001
--------------------------
01111010000 ,這里進行第一次按位異或,得到01111010000,即1111010000,將1111010000再去除以11001,如下步驟,
1111010000
^11001
-------------------------
0011110000,進行了第二次模2除後,得到0011110000,即11110000,將
11110000去除11001,
11110000
^11001
--------------------------
00111000,第三次摸2除,得到00111000,即111000,用
111000去除11001,
111000
^11001
-------------------
001010,進行第四次模2除後,得到最終的余數,001010,即1010,
則四位CRC校驗碼就為:1010。
❾ 計算機網路,關於數據鏈路層差錯檢測的【循環冗餘演算法】
P應是由循環冗餘演算法規則算出來的,太久了,具體細節你再翻翻書。
❿ 《計算機網路技術及應用》中OSI模型中數據鏈路層、網路層和傳輸層分別是怎樣進行差錯控制的
數據鏈路層的幀尾有fcs,當發送方發送幀之前會對幀中的數據進行校驗,採用CRC演算法,將得到的數值封裝到幀尾,也就是fcs。接收方收到該幀後,用同樣的演算法對幀中的數據進行計算,將得到的數值與幀尾的fcs進行比較,如果一致則該幀正確,如不一致,則該幀錯誤。
網路層的IP數據包的包頭部分有首部校驗和一項,但該項只對包頭校驗,也是發送方將校驗值加入,接收方使用相同演算法計算後比較。
傳輸層的校驗和,它可以判斷整個報文段的真偽。還可以通過序列號確認號避免報文重傳。