連 宏
(中國電子科技集團公司第二十研究所,西安 710068)
基于非連接的網絡傳輸層協議提供的是不可靠的數據傳輸服務[1],無法保證接收端接收到的字節流是完整的、無差錯的和有序的。此時,就需要設計應用層上的傳輸協議來保證面向非連接網絡傳輸的可靠性[2]。
針對不可靠的非連接網絡傳輸,本文設計了一種具有檢錯功能的傳輸協議。該協議綜合運用握手、確認、應答、校驗和錯誤重傳等多種手段,能有效檢查出傳輸數據的錯誤,對錯誤的數據采用重傳確認機制,保證了數據傳輸的正確性和有效性。
傳輸協議包括幀格式定義和傳輸過程定義兩部分內容[3]。幀格式描述了協議報文的基本定義,握手過程描述了數據發送和應答的交互過程。下面分別描述本協議的幀格式、握手過程以及具體實現。
幀格式由同步頭、起始字、消息類型、報文長度、信息正文內容、保留和校驗等九部分組成。報文幀格式如表1所示。
表1中消息類型與信息正文內容定義如表2所示。

表2 消息類型
幀頭校驗采用校驗和形式,即表1報文幀格式中‘2’、‘3’、‘4’、‘5’項各個字節的值進行累加,溢出則丟棄,累加和由#0100H 減后存入第6 項。數據信息校驗采用循環冗余校驗(Cyclic Redundancy Check,CRC)。CRC 校驗的生成多項式的階數越高,那么誤判的概率就越小[4]。本協議使用16 位校驗,生成多項式為g(x)=x16+x12+x5+1,可以100%地檢測出所有奇數個隨機錯誤和長度小于等于k(k為g(x)的階數)的突發錯誤[5]。

表1 報文幀格式
(1)表1的報文幀格式分為報頭幀和數據幀兩種。報頭幀僅包含表1中的1~6 項,用來發送建立連接和發送應答等握手信號,即消息類型為101(正確接收應答消息)、102(錯誤接收應答消息)和104(建立連接消息)時采用報頭幀格式發送。數據幀包含表1中1~9 項的全部內容,用來發送數據,即消息類型為100(本幀數據內容)和103(上幀數據內容)時采用數據幀格式發送。
(2)表1報文幀格式中,第6 項幀頭校驗采用校驗和形式進行校驗。
(3)表1報文幀格式中,第9 項數據信息的校驗采用循環冗余校驗進行校驗。
(4)表1報文幀格式中,第7 項信息正文內容的最大長度為2048 字節。如果待發送的信息長度小于2048 字節,則為實際字節長度。
使用協議幀格式進行數據傳輸,首先由報文同步頭和報文起始字共同決定一幀的開始,這樣避免了非法數據進入到內部處理;然后使用幀頭保留作為判斷字節,可以過濾掉錯誤幀,保留正確幀;最后利用幀頭校驗來判斷幀頭是否正確。通過以上三層處理,僅保留了正確的幀數據。接下來對數據信息進行CRC 校驗,確保進入后續處理程序的數據是正確的。通過幀頭校驗和數據信息CRC 校驗可以有效檢出幀頭錯誤和數據信息錯誤,這樣可靠地保證了數據傳輸的有效性和數據信息的正確性。
發送方和接收方通過發送消息和接收應答實現雙方的握手過程。首先發送方發送建立連接消息,接收方接收到建立連接消息后,根據幀頭校驗判斷是否是正確幀,正確幀發送正確接收應答消息,錯誤幀發送錯誤接收應答消息。發送方接收到正確接收應答消息后開始發送數據消息;如果接收到錯誤接收應答消息,則重新發送建立連接消息,如果重傳三次仍不成功,則退出發送過程。
發送方發送數據信息的握手過程與發送建立連接消息的握手過程相同,但接收方接收到數據信息后根據幀頭校驗和數據信息的CRC 校驗兩部分的結果判斷幀數據是否正確,如果幀頭校驗和數據信息校驗均正確,則發送正確接收應答消息,如果幀頭和數據信息中任意一個校驗出現錯誤,均發送錯誤接收應答消息。
協議握手過程如圖1所示。

圖1 協議握手過程
本協議通過發送—應答—握手—重傳機制,即發送一幀數據,一個應答,若應答沒收到或者接收到錯誤應答,重新進行協商握手,握手失敗則向應用程序報告錯誤。握手過程建立了邏輯連接通道,保證了數據傳輸過程的可靠性;幀頭校驗和數據信息的CRC 校驗檢出了幀頭和數據信息的錯誤,確保了數據信息的正確性;數據重傳機制,保障了數據傳輸的有效性。該協議中多重手段的綜合應用,使數據傳輸更加穩定高效。
發送方發送數據的處理過程如下所示:
A.發送建立連接消息;
B.等待接收應答消息;
C.接收應答消息,如果應答為正確接收應答消息,轉E;否則,轉D;
D.判斷是否發送三次,是,轉J;否,轉A;
E.發送數據消息;
F.等待接收應答消息;
G.接收應答消息;如果應答為正確接收應答消息時,轉I;否則,轉H;
H.判斷是否發送三次,是,轉J;否,轉E;
I.判斷是否發送完畢,發送完畢,轉J;否則,轉E;
J.結束。
接收方接收數據的處理過程如下所示:
A.等待接收建立連接消息;
B.接收建立連接消息,校驗正確,轉D;校驗錯誤,轉C;
C.發送錯誤接收回傳消息,判斷是否接收三次,是,轉J;否,轉A;
D.發送正確接收回傳消息;
E.等待接收數據消息;
F.接收數據消息,校驗正確,轉H;校驗錯誤,轉G;
G.發送錯誤接收回傳消息,判斷是否接收三次,是,轉J;否,轉E;
H.發送正確接收回傳消息;
I.判斷文件是否接收完畢,接收完畢,轉J;否則,轉E;
J.結束。
數據發送接收過程流程圖如圖2所示。

圖2 數據發送接收過程流程圖
CRC 校驗采用多項式編碼方法。被處理的數據塊可以看作是一個n階的二進制多項式,由an-1xn-1+an-2xx-2+···+a1x+a0組成。如一個8 位二進制數10110101 可以表示為:
1x7+0x6+1x5+1x4+0x3+1x2+0x+1
多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2 為模,加減時不進、借位,和邏輯異或運算一致[6]。
采用CRC 校驗時,發送方和接收方用同一個生成多項式g(x),并且g(x)的首位和最后一位的系數必須為1。CRC 的處理方法是:發送方以g(x)去除待發送的二進制數據t(x),得到的余數作為CRC校驗碼。校驗時,以計算的校正結果是否為0 為據,判斷數據幀是否出錯。
CRC 校驗碼的編碼方法是用待發送的二進制數據t(x)除以生成多項式g(x),將最后的余數作為CRC 校驗碼[7]。其實現步驟如下:
(1)設待發送的數據塊是m位的二進制多項式t(x),生成多項式為r階的g(x)。在數據塊的末尾添加r個0,數據塊的長度增加到m+r位,對應的二進制多項式為xrt(x)。
(2)用生成多項式g(x)去除xrt(x),求得余數為階數為r-1 的二進制多項式y(x)。此二進制多項式y(x)就是t(x)經過生成多項式g(x)編碼的CRC 校驗碼。
(3)用xrt(x)以(2)的方式減去y(x),得到二進制多項式xrt'(x)。xrt'(x)就是包含了CRC 校驗碼的待發送字符串。
從CRC 的編碼規則可以看出,CRC 編碼實際上是將待發送的m位二進制多項式t(x)轉換成了可以被g(x)除盡的m+r位二進制多項式xrt'(x),所以解碼時可以用接收到的數據去除g(x),如果余數為0,則表示傳輸過程沒有錯誤;如果余數不為0,則在傳輸過程中肯定存在錯誤[8]。同時xrt'(x)可以看做是由t(x)和CRC 校驗碼的組合,所以解碼時將接收到的二進制數據去掉尾部的r位數據,得到的就是原始數據。
本網絡傳輸協議通過幀頭校驗和數據內容的CRC 校驗,可有效檢出傳輸過程中的數據錯誤。通過接收發送方的握手和錯誤重傳機制,保障了傳輸過程的可靠性,提高了傳輸效率。本協議已在數據鏈系統網絡傳輸領域得到運用,為數據鏈系統數據的穩定傳輸奠定了堅實的基礎。