連 宏
(中國電子科技集團(tuán)公司第二十研究所,西安 710068)
基于非連接的網(wǎng)絡(luò)傳輸層協(xié)議提供的是不可靠的數(shù)據(jù)傳輸服務(wù)[1],無法保證接收端接收到的字節(jié)流是完整的、無差錯的和有序的。此時,就需要設(shè)計應(yīng)用層上的傳輸協(xié)議來保證面向非連接網(wǎng)絡(luò)傳輸?shù)目煽啃訹2]。
針對不可靠的非連接網(wǎng)絡(luò)傳輸,本文設(shè)計了一種具有檢錯功能的傳輸協(xié)議。該協(xié)議綜合運用握手、確認(rèn)、應(yīng)答、校驗和錯誤重傳等多種手段,能有效檢查出傳輸數(shù)據(jù)的錯誤,對錯誤的數(shù)據(jù)采用重傳確認(rèn)機(jī)制,保證了數(shù)據(jù)傳輸?shù)恼_性和有效性。
傳輸協(xié)議包括幀格式定義和傳輸過程定義兩部分內(nèi)容[3]。幀格式描述了協(xié)議報文的基本定義,握手過程描述了數(shù)據(jù)發(fā)送和應(yīng)答的交互過程。下面分別描述本協(xié)議的幀格式、握手過程以及具體實現(xiàn)。
幀格式由同步頭、起始字、消息類型、報文長度、信息正文內(nèi)容、保留和校驗等九部分組成。報文幀格式如表1所示。
表1中消息類型與信息正文內(nèi)容定義如表2所示。
表2 消息類型
幀頭校驗采用校驗和形式,即表1報文幀格式中‘2’、‘3’、‘4’、‘5’項各個字節(jié)的值進(jìn)行累加,溢出則丟棄,累加和由#0100H 減后存入第6 項。數(shù)據(jù)信息校驗采用循環(huán)冗余校驗(Cyclic Redundancy Check,CRC)。CRC 校驗的生成多項式的階數(shù)越高,那么誤判的概率就越小[4]。本協(xié)議使用16 位校驗,生成多項式為g(x)=x16+x12+x5+1,可以100%地檢測出所有奇數(shù)個隨機(jī)錯誤和長度小于等于k(k為g(x)的階數(shù))的突發(fā)錯誤[5]。
表1 報文幀格式
(1)表1的報文幀格式分為報頭幀和數(shù)據(jù)幀兩種。報頭幀僅包含表1中的1~6 項,用來發(fā)送建立連接和發(fā)送應(yīng)答等握手信號,即消息類型為101(正確接收應(yīng)答消息)、102(錯誤接收應(yīng)答消息)和104(建立連接消息)時采用報頭幀格式發(fā)送。數(shù)據(jù)幀包含表1中1~9 項的全部內(nèi)容,用來發(fā)送數(shù)據(jù),即消息類型為100(本幀數(shù)據(jù)內(nèi)容)和103(上幀數(shù)據(jù)內(nèi)容)時采用數(shù)據(jù)幀格式發(fā)送。
(2)表1報文幀格式中,第6 項幀頭校驗采用校驗和形式進(jìn)行校驗。
(3)表1報文幀格式中,第9 項數(shù)據(jù)信息的校驗采用循環(huán)冗余校驗進(jìn)行校驗。
(4)表1報文幀格式中,第7 項信息正文內(nèi)容的最大長度為2048 字節(jié)。如果待發(fā)送的信息長度小于2048 字節(jié),則為實際字節(jié)長度。
使用協(xié)議幀格式進(jìn)行數(shù)據(jù)傳輸,首先由報文同步頭和報文起始字共同決定一幀的開始,這樣避免了非法數(shù)據(jù)進(jìn)入到內(nèi)部處理;然后使用幀頭保留作為判斷字節(jié),可以過濾掉錯誤幀,保留正確幀;最后利用幀頭校驗來判斷幀頭是否正確。通過以上三層處理,僅保留了正確的幀數(shù)據(jù)。接下來對數(shù)據(jù)信息進(jìn)行CRC 校驗,確保進(jìn)入后續(xù)處理程序的數(shù)據(jù)是正確的。通過幀頭校驗和數(shù)據(jù)信息CRC 校驗可以有效檢出幀頭錯誤和數(shù)據(jù)信息錯誤,這樣可靠地保證了數(shù)據(jù)傳輸?shù)挠行院蛿?shù)據(jù)信息的正確性。
發(fā)送方和接收方通過發(fā)送消息和接收應(yīng)答實現(xiàn)雙方的握手過程。首先發(fā)送方發(fā)送建立連接消息,接收方接收到建立連接消息后,根據(jù)幀頭校驗判斷是否是正確幀,正確幀發(fā)送正確接收應(yīng)答消息,錯誤幀發(fā)送錯誤接收應(yīng)答消息。發(fā)送方接收到正確接收應(yīng)答消息后開始發(fā)送數(shù)據(jù)消息;如果接收到錯誤接收應(yīng)答消息,則重新發(fā)送建立連接消息,如果重傳三次仍不成功,則退出發(fā)送過程。
發(fā)送方發(fā)送數(shù)據(jù)信息的握手過程與發(fā)送建立連接消息的握手過程相同,但接收方接收到數(shù)據(jù)信息后根據(jù)幀頭校驗和數(shù)據(jù)信息的CRC 校驗兩部分的結(jié)果判斷幀數(shù)據(jù)是否正確,如果幀頭校驗和數(shù)據(jù)信息校驗均正確,則發(fā)送正確接收應(yīng)答消息,如果幀頭和數(shù)據(jù)信息中任意一個校驗出現(xiàn)錯誤,均發(fā)送錯誤接收應(yīng)答消息。
協(xié)議握手過程如圖1所示。
圖1 協(xié)議握手過程
本協(xié)議通過發(fā)送—應(yīng)答—握手—重傳機(jī)制,即發(fā)送一幀數(shù)據(jù),一個應(yīng)答,若應(yīng)答沒收到或者接收到錯誤應(yīng)答,重新進(jìn)行協(xié)商握手,握手失敗則向應(yīng)用程序報告錯誤。握手過程建立了邏輯連接通道,保證了數(shù)據(jù)傳輸過程的可靠性;幀頭校驗和數(shù)據(jù)信息的CRC 校驗檢出了幀頭和數(shù)據(jù)信息的錯誤,確保了數(shù)據(jù)信息的正確性;數(shù)據(jù)重傳機(jī)制,保障了數(shù)據(jù)傳輸?shù)挠行?。該協(xié)議中多重手段的綜合應(yīng)用,使數(shù)據(jù)傳輸更加穩(wěn)定高效。
發(fā)送方發(fā)送數(shù)據(jù)的處理過程如下所示:
A.發(fā)送建立連接消息;
B.等待接收應(yīng)答消息;
C.接收應(yīng)答消息,如果應(yīng)答為正確接收應(yīng)答消息,轉(zhuǎn)E;否則,轉(zhuǎn)D;
D.判斷是否發(fā)送三次,是,轉(zhuǎn)J;否,轉(zhuǎn)A;
E.發(fā)送數(shù)據(jù)消息;
F.等待接收應(yīng)答消息;
G.接收應(yīng)答消息;如果應(yīng)答為正確接收應(yīng)答消息時,轉(zhuǎn)I;否則,轉(zhuǎn)H;
H.判斷是否發(fā)送三次,是,轉(zhuǎn)J;否,轉(zhuǎn)E;
I.判斷是否發(fā)送完畢,發(fā)送完畢,轉(zhuǎn)J;否則,轉(zhuǎn)E;
J.結(jié)束。
接收方接收數(shù)據(jù)的處理過程如下所示:
A.等待接收建立連接消息;
B.接收建立連接消息,校驗正確,轉(zhuǎn)D;校驗錯誤,轉(zhuǎn)C;
C.發(fā)送錯誤接收回傳消息,判斷是否接收三次,是,轉(zhuǎn)J;否,轉(zhuǎn)A;
D.發(fā)送正確接收回傳消息;
E.等待接收數(shù)據(jù)消息;
F.接收數(shù)據(jù)消息,校驗正確,轉(zhuǎn)H;校驗錯誤,轉(zhuǎn)G;
G.發(fā)送錯誤接收回傳消息,判斷是否接收三次,是,轉(zhuǎn)J;否,轉(zhuǎn)E;
H.發(fā)送正確接收回傳消息;
I.判斷文件是否接收完畢,接收完畢,轉(zhuǎn)J;否則,轉(zhuǎn)E;
J.結(jié)束。
數(shù)據(jù)發(fā)送接收過程流程圖如圖2所示。
圖2 數(shù)據(jù)發(fā)送接收過程流程圖
CRC 校驗采用多項式編碼方法。被處理的數(shù)據(jù)塊可以看作是一個n階的二進(jìn)制多項式,由an-1xn-1+an-2xx-2+···+a1x+a0組成。如一個8 位二進(jìn)制數(shù)10110101 可以表示為:
1x7+0x6+1x5+1x4+0x3+1x2+0x+1
多項式乘除法運算過程與普通代數(shù)多項式的乘除法相同。多項式的加減法運算以2 為模,加減時不進(jìn)、借位,和邏輯異或運算一致[6]。
采用CRC 校驗時,發(fā)送方和接收方用同一個生成多項式g(x),并且g(x)的首位和最后一位的系數(shù)必須為1。CRC 的處理方法是:發(fā)送方以g(x)去除待發(fā)送的二進(jìn)制數(shù)據(jù)t(x),得到的余數(shù)作為CRC校驗碼。校驗時,以計算的校正結(jié)果是否為0 為據(jù),判斷數(shù)據(jù)幀是否出錯。
CRC 校驗碼的編碼方法是用待發(fā)送的二進(jìn)制數(shù)據(jù)t(x)除以生成多項式g(x),將最后的余數(shù)作為CRC 校驗碼[7]。其實現(xiàn)步驟如下:
(1)設(shè)待發(fā)送的數(shù)據(jù)塊是m位的二進(jìn)制多項式t(x),生成多項式為r階的g(x)。在數(shù)據(jù)塊的末尾添加r個0,數(shù)據(jù)塊的長度增加到m+r位,對應(yīng)的二進(jìn)制多項式為xrt(x)。
(2)用生成多項式g(x)去除xrt(x),求得余數(shù)為階數(shù)為r-1 的二進(jìn)制多項式y(tǒng)(x)。此二進(jìn)制多項式y(tǒng)(x)就是t(x)經(jīng)過生成多項式g(x)編碼的CRC 校驗碼。
(3)用xrt(x)以(2)的方式減去y(x),得到二進(jìn)制多項式xrt'(x)。xrt'(x)就是包含了CRC 校驗碼的待發(fā)送字符串。
從CRC 的編碼規(guī)則可以看出,CRC 編碼實際上是將待發(fā)送的m位二進(jìn)制多項式t(x)轉(zhuǎn)換成了可以被g(x)除盡的m+r位二進(jìn)制多項式xrt'(x),所以解碼時可以用接收到的數(shù)據(jù)去除g(x),如果余數(shù)為0,則表示傳輸過程沒有錯誤;如果余數(shù)不為0,則在傳輸過程中肯定存在錯誤[8]。同時xrt'(x)可以看做是由t(x)和CRC 校驗碼的組合,所以解碼時將接收到的二進(jìn)制數(shù)據(jù)去掉尾部的r位數(shù)據(jù),得到的就是原始數(shù)據(jù)。
本網(wǎng)絡(luò)傳輸協(xié)議通過幀頭校驗和數(shù)據(jù)內(nèi)容的CRC 校驗,可有效檢出傳輸過程中的數(shù)據(jù)錯誤。通過接收發(fā)送方的握手和錯誤重傳機(jī)制,保障了傳輸過程的可靠性,提高了傳輸效率。本協(xié)議已在數(shù)據(jù)鏈系統(tǒng)網(wǎng)絡(luò)傳輸領(lǐng)域得到運用,為數(shù)據(jù)鏈系統(tǒng)數(shù)據(jù)的穩(wěn)定傳輸?shù)於藞詫嵉幕A(chǔ)。