寫在前面:spa
本文包含以下內容:.net
1、文件傳輸簡介3d
2、傳輸協議code
3、協議特色對象
4、XModem協議解析blog
(4-1)協議校驗和方式傳輸流程解析開發
(4-2)CRC校驗信息包解析class
5、YModem協議解析軟件
(5-1)YModem起始幀的數據格式解析file
(5-2)YModem數據幀的數據格式解析
(5-3)YModem結束幀的數據格式解析
(5-4)YModem的文件傳輸流程解析
文件傳輸是數據交換的主要形式。在進行文件傳輸時,爲使文件能被正確識別和傳送,咱們須要在兩臺計算機之間創建統一的傳輸協議。這個協議包括了文件的識別、傳送的起止時間、錯誤的判斷與糾正等內容。Xmodem、Ymodem和Zmodem協議是最經常使用的三種通訊協議。
在SecureCRT下的傳輸協議有ASCII、Xmodem、Ymodem、Zmodem等。以下圖所示,在開發中,可使用SecureCRT軟件進行文件傳輸。
(1)Xmodem協議是最先的,傳輸128字節信息塊。
(2)Ymodem是Xmodem的改進版協議,具備傳輸快速穩定的優勢。它能夠一次傳輸1024字節的信息塊,同時還支持傳輸多個文件。
日常所說的Ymodem協議是指的Ymodem-1K,除此還有Ymodem-g(沒有CRC校驗,不經常使用)。
YModem-1K用1024字節信息塊傳輸取代標準的128字節傳輸,數據的發送會使用CRC校驗,保證數據傳輸的正確性。它每傳輸一個信息塊數據時,就會等待接收端迴應ACK信號,接收到迴應後,纔會繼續傳輸下一個信息塊,保證數據已經所有接收。
Xmodem協議傳輸有接收程序和發送程序完成,先由接收程序發送協商字符,協商校驗方式,協商經過以後發送程序就開始發送數據包,接收程序接收到完整的一個數據包以後按照協商的方式對數據包進行校驗。校驗經過以後發送確認字符,而後發送程序繼續發送下一包;若是校驗失敗,則發送否定字符,發送程序重傳此數據包。
定義:
SOH 01H(modem數據頭) EOT 04H(發送結束) ACK 06H(應答) NAK 15H(非應答) CAN 18H(取消發送)
Xmodem數據包,包含一個標題開始字符,一個單字節包序號,一個包序號的補碼,128字節數據和一個雙字節的CRC校驗。數據包結構以下圖所示:
(1)校驗和方式傳輸流程:
接收方要求發送方以校驗和方式發送時以NAK來請求,發送方將對此作出應答。以下圖:
計算16位CRC校驗的除數多項式爲X ^ 16 + X ^ 12 + X ^ 5 + 1,信息報中的128數據字節將參加CRC校驗的計算,在發送端CRC16的高字節在前,低字節在後。
傳輸流程:接收方要求發送方以CRC校驗方式發送時以‘C’來請求,發送方將對此做出應答。
信息報中若是剩餘的數據不足128字節,不足的部分將以0x1A填充。
5、YModem協議解析
(1)起始幀的數據格式
YModem的起始幀並不直接傳輸文件的數據,而是將文件名與文件的大小放在數據幀中傳輸,它的幀長=3字節數據首部+128字節數據+2字節CRC16校驗碼=33字節。它的數據幀結構以下:
起始數據幀結構:
SOH | 00 | FF | filename | filezise | NUL | CRCH | CRCL 起始數據幀結構解析: 1、其中SOH=0x01,表示這個數據幀中包含着128個字節的數據(STX表示1024字節,初始幀只有128個) 2、00表示數據幀序號,初始是0,依次向下排 3、FF是幀序號的取反 4、filename是要傳輸的文件名,如USTB_V3_1.0.1.26_NMEA.Bin,它在數據幀中的格式爲:55 53 54 42 5F 56 33 5F 31 2E 30 2E 31 2E 32 36 5F 4E 4D 45 41 2E 42 69 6E 00,也就是把ASCII碼轉成十六進制,可是最後必定要在文件名後加上00,表示文件名的結束 5、filesize表示文件的大小,如上面的USTB_V3_1.0.1.26_NMEA.Bin大小是132KB,也就是135168Byte,轉換成十六進制就是0x21000,它在數據幀中的格式就是32 31 30 30 30 00,也就是ASCII的「21000」,一樣最後要加上00表示結束 6、NUL就是數據部分的128字節中除去文件名和文件大小佔據的剩下的字節都用00填充 7、CRCH和CRCL分別表示16位CRC校驗碼的高8位與低8位。
(2)數據幀的數據格式
YModem的數據幀中會預留1024字節空間用來傳輸文件數據,它跟起始幀接收差很少,以下:
數據幀結構:
STX | 01 | FE | data[1024] | CRCH | CRCL 數據幀結構解析 1、其中STX=0x02,表示這幀數據幀後面包含着1024字節的數據部分; 2、01是表示幀序號,FE是它的取反,再下一幀數據就是02 FD,以此類推; 3、data[1024]表示存放着1024字節的文件數據; 4、CRCH與CRCL是CRC16檢驗碼的高8位與低8位。
特殊狀況 一、若是文件數據的最後剩餘的數據在128~1024以前,則仍是使用STX的1024字節傳輸,可是剩餘空間所有用0x1A填充,以下結構: STX | 01 | FE | data[1024] | 1A 1A……… CRCH | CRCL 二、有一種特殊的狀況:若是文件大小小於或等於128字節或者文件數據最後剩餘的數據小於128字節,則YModem會選擇SOH數據幀用128字節來傳輸數據,若是數據不滿128字節,剩餘的數據用0x1A填充
這時數據幀的結構就變成: 1)、文件大小小於128字節: SOH | 01 | FE | data[ ] | 1A ...1A | CRCH | CRCL 2)、文件最後剩餘數據小於128字節: SOH | 01 | FE | data[ ] | 1A...1A | CRCH | CRCL
(3)結束幀的數據格式
YModem的結束幀數據也採用SOH的128字節數據幀,它的結構以下:
SOH | 00 | FF | NUL | [128] | CRCH | CRCL
結束幀一樣以SOH開頭,表示後面跟着128字節大小的數據;結束幀的幀序也認爲是00 FF;結束幀的128字節的數據部分不存聽任何信息,即所有用00填充。
(4)文件傳輸過程
文件的傳輸過程,以具體的例子說明。把USTB_V3_1.0.1.26_NMEA.Bin,大小爲135168Byte(16進製爲0x21000,它在數據幀中的格式就是32 31 30 30 30 00)的文件做爲傳輸的對象,則它的傳輸過程以下:
發送端 接收端
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
SOH 00 FF [55 53…6E 00]" "[32…30 00]'' NUL[96] CRC CRC >>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
SOH 05 FA data[100] 1A[28] CRC CRC>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NAK
EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C
SOH 00 FF NUL[128] CRCCRC >>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK
參考原文連接:
https://blog.csdn.net/sinat_33323544/article/details/83994835
https://blog.csdn.net/lcmsir/article/details/80550821