四川長虹網(wǎng)絡科技有限責任公司:熊建勇
隨著我國數(shù)字電視的普及,無論是廣電網(wǎng)絡的數(shù)字電視一體機、數(shù)字電視機頂盒還是三大運營商的iptv機頂盒已經(jīng)走進了家家戶戶;而隨著數(shù)字電視業(yè)務的發(fā)展,軟件升級也越來越頻繁;龐大的用戶群同時進行升級對前端網(wǎng)絡服務器具有非常大的壓力;常規(guī)的降壓方式是限制升級峰值,對用戶進行分時段升級,但此種方式必然要加大整體網(wǎng)絡的升級時長;如果不想進行升級限流,必然要提升服務器的訪問吞吐量;如何在不增加前端服務器硬件配置的前提下進行吞吐量提升呢?本文的觀點是:優(yōu)化升級內(nèi)容,在實現(xiàn)相同升級功能的前提下,減少用戶對前端服務器的訪問;如何進行升級內(nèi)容優(yōu)化,減少用戶對服務器的訪問,從升級數(shù)據(jù)處理的角度,本文分為以下三個模塊:升級內(nèi)容優(yōu)化、前端服務器廣播與訪問處理、終端升級;而終端升級被分為四個步驟:觸發(fā)升級、升級數(shù)據(jù)請求、升級數(shù)據(jù)校驗與軟件寫入四個部分。
如上述所說,本文需要通過優(yōu)化升級內(nèi)容達到提升升級效率、減少用戶對服務器的訪問,進而達到提升吞吐量的目的;那么數(shù)字電視軟件升級的內(nèi)容有哪些呢?就目前而言數(shù)字電視軟件支持網(wǎng)絡訪問功能的系統(tǒng)通常有兩種:linux操作系統(tǒng)與android操作系統(tǒng);這兩種操作系統(tǒng)都是以文件系統(tǒng)的方式存在,且就存儲方式而言都是采用分區(qū)存儲。相對的linux操作系統(tǒng)較android操作系統(tǒng)而言其容量會小很多。但無論哪種系統(tǒng),對整個數(shù)字電視系統(tǒng)進行升級是必須要實現(xiàn)的功能,而整體升級則意味著非常高的數(shù)據(jù)訪問量;而普通的軟件升級則可能升級其中某個分區(qū),或者某個分區(qū)中的部分文件;這些文件大小不一,有的文件可能很大,造成數(shù)據(jù)傳遞阻塞,有的文件又很小造成終端頻繁向服務器請求數(shù)據(jù);因此本文提出對升級內(nèi)容進行優(yōu)化,就提就是制定數(shù)字電視升級包規(guī)則,以標準升級文件大小為基準,將所有的升級文件按預定的規(guī)則進行打包,將零散的小文件打包成一個大小適合的大文件包,將容量超大的文件分割成指定大小的小文件包;因此終端向服務器請求的數(shù)據(jù)基本上都是近似大小的文件,從而達到請求數(shù)據(jù)大小與請求次數(shù)平衡;升級數(shù)據(jù)內(nèi)容分為三種:升級觸發(fā)包、升級文件內(nèi)容校驗包與升級文件包。具體如下:
1.1.1 升級觸發(fā)包
具體包括:固定長度升級觸發(fā)包標志字符串,包長度,硬件版本,升級軟件版本、軟件版本判斷模式、軟件版本差值、升級總臺數(shù),開始序列號、結(jié)束序列號,服務器地址、升級類型、升級文件包個數(shù)、分區(qū)個數(shù)、分區(qū)描述子1、分區(qū)描述子2……分區(qū)描述子n、crc校驗位;其中包長度為硬件版本到包結(jié)束的長度,包括文件包結(jié)尾的crc校驗位長度;crc校驗位校驗的區(qū)域為包開始到分區(qū)描述子n,對這個區(qū)間的內(nèi)容進行crc計算。
軟件版本判斷模式:值為0,表示不判斷軟件版本,直接升級;值為1,表示機頂盒軟件版本加軟件版本差值等于待升級版本;值為2,表示機頂盒軟件版本減去軟件版本差值等于待升級版本。
升級類型:值為0,表示前臺強制升級。通過界面告知用戶機器必須升級,進入升級流程,然后開始接收升級數(shù)據(jù),并顯示進度,最后更新升級軟件再重啟(用戶無法選擇);值為1,表示后臺強制升級。后臺接收升級數(shù)據(jù),接收數(shù)據(jù)不提示用戶,直到升級數(shù)據(jù)準備完畢,再提示用戶進行升級并顯示進度,然后更新升級軟件再重啟(用戶無法選擇);值為2,表示前臺非強制升級。提示用戶需要升級,用戶可做如下選擇,立即升級(同升級類型0)、下次開機升級(進入數(shù)據(jù)接受,并顯示接收進度,接受完成不更新,在下次開機時更新軟件)、不升級;值為3,表示后臺非強制升級。后臺接收升級數(shù)據(jù),接收數(shù)據(jù)不提示用戶,直到升級數(shù)據(jù)準備完畢,再提示用戶進行升級。用戶可以選擇立即升級和下次開機升級和不升級。
分區(qū)個數(shù):該次升級涉及的分區(qū)總個數(shù)。
分區(qū)描述子:包括分區(qū)ID號,分區(qū)名字,分區(qū)文件模式,升級文件個數(shù)。
分區(qū)文件模式:值為0,表示單文件分區(qū),如boot,kernel等非文件系統(tǒng)分區(qū)(只讀文件系統(tǒng)作為單文件處理);值為1,表示多文件系統(tǒng)分區(qū),如非只讀文件系統(tǒng)ubi文件系統(tǒng)等。
1.1.2 升級文件內(nèi)容校驗包
具體包括:固定長度升級文件內(nèi)容校驗包標志字符串,包長度,分區(qū)個數(shù),分區(qū)校驗描述子1,分區(qū)校驗描述子2……分區(qū)校驗描述子n,crc校驗位,包長度字段包括分區(qū)個數(shù)加上crc校驗位長度;crc校驗位校驗包開頭到分區(qū)校驗描述子n。
分區(qū)校驗描述子:包括分區(qū)ID,分區(qū)名字,升級文件總個數(shù),文件校驗描述子1……文件校驗描述子n。
文件校驗描述子:文件名長度,文件名,文件路徑長度、文件路徑、壓縮后的文件長度、壓縮后的文件crc校驗值、原始文件長度、原始文件crc校驗值。
1.1.3 升級文件包
具體包括固定長度升級文件包標志字符串,包長度,升級包序號,分區(qū)個數(shù),分區(qū)描述子1……分區(qū)描述子n,包文件1數(shù)據(jù)(壓縮后)…包文件n數(shù)據(jù),CRC校驗。
分區(qū)個數(shù):表示該升級包下有多少個分區(qū)的升級文件。
分區(qū)描述子:包括分區(qū)ID,分區(qū)名字,分區(qū)文件模式,分區(qū)文件總個數(shù),包_分區(qū)_文件個數(shù),包_分區(qū)_文件描述子1……包_分區(qū)_文件描述子n。
包_分區(qū)_文件描述子:
文件序號,文件名長度,文件名,文件路徑長度,文件路徑,壓縮后的文件長度,壓縮后的文件CRC,原始文件長度,原始文件CRC,文件切割模式,文件切割個數(shù),文件切割描述子。
文件切割模式:值為0,表示文件較小,不需要切割;值為1,表示文件較大,需要切割為n個子段。
文件切割個數(shù):當文件切割模式為0,則該值為1,即切割子段描述子里的內(nèi)容為正常文件信息。
文件切割描述子:包括文件子段序號,子段數(shù)據(jù)長度、子段CRC、子段數(shù)據(jù)偏移地址。
文件子段序號:對應文件切割個數(shù)1~n。當升級文件包出現(xiàn)文件切割,那么切割子段要么出現(xiàn)在包的最后,要么出現(xiàn)在包的最前且后面還有空間容納小文件。因此,一個包只可能出現(xiàn)一次“文件切割模式”為1的情況。
升級包序號:對應規(guī)則1.1.1的升級文件包個數(shù)。
分區(qū)文件模式:同規(guī)則1.1.1定義。
升級文件總個數(shù):同規(guī)則1.1.2分區(qū)校驗描述子下的升級文件總個數(shù),即1個分區(qū)下有多少個文件需要更新。
包文件模式:值為0:表示多文件組合(可以是1個文件也可以是多個文件);值為1,表示單文件切割(將1個很大的文件切割成多個小文件,并切放到不同的升級文件包)一個升級文件包可能包含多個升級文件,也可以是一個被切割的文件的一部分)。
當前文件序號:對應升級文件總個數(shù),且為該包下的第一個文件的序號。
包文件個數(shù):該字段基于包文件模式。當包文件模式為0,表示該包下有n個升級文件;后續(xù)跟隨的包文件描述子有n跟,且描述子內(nèi)的文件序號為正常的升級文件,且文件序號為s,s+1……s+n-1;當包文件模式為1,文件S被切割成了n個小文件;后續(xù)跟隨的包文件描述子只有1個,且描述子內(nèi)的文件序號為文件S的子段,且序號為1,2……n;(2到n在后續(xù)的升級文件包內(nèi),升級包序號+1到升級包序號+n-1)。
包文件描述子:包括文件序號,文件名長度,文件名,文件路徑長度,文件路徑,壓縮后的文件長度,壓縮后的文件CRC,原始文件長度,原始文件CRC,文件開始位置。
文件序號:同包文件個數(shù)描述。
文件開始位置:壓縮文件數(shù)據(jù)在整個升級文件包里的偏移位置。
包文件數(shù)據(jù):需要升級的文件被壓縮后的數(shù)據(jù);當包文件模式為1時,包文件數(shù)據(jù)只有一個;即一個文件需要切割時,那么這個文件所有切割的子段都將使用1個單獨升級文件包。
使用與規(guī)則1.1配套工具對各個分區(qū)的升級文件進行封包處理。配置人員使用封包工具進行升級參數(shù)設置:先設置每個升級文件包的大?。ㄔ摯笮榕c服務器契合的最優(yōu)值)、然后設置升級觸發(fā)包所需要的硬件版本,升級軟件版本、軟件版本判斷模式、軟件版本差值、升級總臺數(shù),開始序列號、結(jié)束序列號,服務器地址、升級類型等內(nèi)容控制升級方式與升級規(guī)模;然后依次按分區(qū)導入本分區(qū)需要升級的文件或文件包;封包工具會對所有分區(qū)的升級的文件按大小進行組合,按照規(guī)則1.1.3的定義,將一些小的文件組合成一個升級文件包,然后將超大的文件拆分成符合要求的多個升級文件包,然后根據(jù)規(guī)則1.1.1計算出升級文件包個數(shù)、分區(qū)個數(shù)、分區(qū)描述子1、分區(qū)描述子2……分區(qū)描述子n等信息生成完整的升級觸發(fā)包;在封包工具進行文件組合的同時也會依據(jù)1.1.2規(guī)則對原始文件信息、優(yōu)化后的文件信息等進行記錄、計算并生成升級文件內(nèi)容校驗包。
首先將升級觸發(fā)包、升級文件內(nèi)容校驗包、所有升級文件包導入前端服務器;服務器循環(huán)向全網(wǎng)廣播升級觸發(fā)包以及升級文件內(nèi)容校驗包;升級觸發(fā)包以較高頻率廣播,內(nèi)容校驗包以較低頻率廣播;然后服務器等待終端數(shù)字電視發(fā)送升級數(shù)據(jù)請求及結(jié)果反饋。數(shù)據(jù)請求有三種:申請升級文件內(nèi)容校驗包、模糊申請升級文件包、精確申請升級文件包。
申請升級文件內(nèi)容校驗包:終端數(shù)字電視若在一定時間內(nèi)未捕獲到前端廣播的升級內(nèi)容校驗包,則會向服務器發(fā)送內(nèi)容校驗包請求;服務器監(jiān)聽到該請求則單獨將升級內(nèi)容校驗包發(fā)送給本機。
模糊申請升級文件包:終端數(shù)字電視在通過分析升級觸發(fā)包后會知道本次升級需要申請的升級文件包個數(shù)且需要申請所有的升級包;為降低終端數(shù)字電視向服務器發(fā)送數(shù)據(jù)請求的次數(shù),終端數(shù)字電視采用模糊申請的方式一次將所有的升級包數(shù)據(jù)進行請求(若升級包數(shù)量巨大,可分為幾次請求,每次請求一定范圍內(nèi)的升級包);服務器在接收到該請求后,會分析該終端請求的數(shù)據(jù)包,并結(jié)合自身的資源分配情況,優(yōu)先發(fā)送瞬時請求量少的包,后續(xù)發(fā)送請求量大的包,使服務器資源處于相對均衡狀態(tài);如若終端請求的所有升級包均處于滿負荷狀態(tài),前端會視服務器資源情況,向終端發(fā)送可申請升級包信息。
精確申請升級文件包:當終端數(shù)字電視長時間接收不到某個升級包,則向服務器單獨請求該數(shù)據(jù)包;服務器監(jiān)聽到該請求則單獨將升級內(nèi)容校驗包發(fā)送給本機。
結(jié)果反饋:當終端服務器完成升級或者升級勝敗均會向服務器發(fā)送升級結(jié)果,服務器根據(jù)該反饋結(jié)果更新數(shù)據(jù)庫中該終端的軟件版本及升級結(jié)果;該信息用于運營商掌握、分析全網(wǎng)終端數(shù)字電視的軟件狀態(tài)、分析升級過程中出現(xiàn)的問題,更好的服務于全網(wǎng)終端用戶。
數(shù)字電視終端在運行過程中會監(jiān)聽監(jiān)控對應的端口,當檢測到服務器廣播的升級觸發(fā)包,將獲取該包并分析出內(nèi)容,然后根據(jù)本機的硬件版本、軟件版本等規(guī)則1.1.1定義的各字段來判斷本機是否符合升級要求;若符合升級要求,則去獲取升級內(nèi)容校驗包并分析;若在一定時間內(nèi)未捕獲到升級內(nèi)容校驗包,則向服務器單獨申請該包,服務器會根據(jù)請求單獨將升級內(nèi)容校驗包發(fā)送給本機(或者向終端發(fā)送可優(yōu)先請求的升級包)。
然后數(shù)字電視終端向服務器發(fā)送升級文件包請求;終端會通過分析升級觸發(fā)包后會知道本次升級需要申請的升級文件包個數(shù)且需要申請所有的升級包;且根據(jù)升級文件包個數(shù)來判定是一次模糊申請所有的升級包,還是分為多次模糊申請,每次申請一定數(shù)量的升級包;然后等待服務器的反饋;若服務器資源充足則會發(fā)送申請范圍的升級包數(shù)據(jù),終端將該數(shù)據(jù)進行保存;當服務器資源不足則會發(fā)回可申請升級包信息,終端調(diào)整升級包請求,對升級請求循序進行重新劃分,優(yōu)先請求服務器資源充足的升級包;在此過程中如若部分升級包超過指定時間或次數(shù)均未請求到,則進入下一范圍的升級包請求;待所有模糊請求完成后對未收到的升級包進行精準請求。
當所有的升級包均收到后,首先對數(shù)據(jù)進行自身的準確性驗證,包括分區(qū)個數(shù)、各分區(qū)下的升級文件個數(shù)、包內(nèi)的文件長度、文件crc等驗證,確保收到的是一個準確的升級包;其次按照規(guī)則1.1.3,定義,對包進行分析,提取出的壓縮狀態(tài)的各分區(qū)的升級文件(包括還原被切割的文件),并與規(guī)則1.1.2定義的升級文件內(nèi)容校驗包里相關(guān)的數(shù)據(jù)進行比對,若校驗錯誤則向服務器發(fā)送升級失敗、失敗步驟及原因,并結(jié)束升級;若文件都正確,則將壓縮文件進行解壓縮,得到原始狀態(tài)的升級文件,并與升級文件內(nèi)容校驗包里的原始文件信息進行比對,若錯誤則向服務器發(fā)送升級失敗及升級失敗的步驟及原因;若所有數(shù)據(jù)均正確則進入軟件更新步驟。
數(shù)據(jù)接收完成后終端更具規(guī)則1.1.1定義的升級類型信息,提示用戶選擇。無論立即升級升級還是開機升級,均需要進行軟件更新。軟件更新按分區(qū)進行,并根據(jù)分區(qū)文件模式信息得到分區(qū)文件的具體寫入方法;通常單文件分區(qū)的操作方法為將整個分區(qū)擦除,然后寫入該分區(qū)的文件;若分區(qū)為多文件系統(tǒng)分區(qū),則根據(jù)升級文件問題的路徑,去替換原有路徑下的對應文件。所有文件更新完成后,重啟數(shù)字電視,整個軟件升級完成。