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