摘要:HTTP Live Streaming(縮寫是HLS)是一個(gè)由蘋果公司提出的基于HTTP的流媒體網(wǎng)絡(luò)傳輸協(xié)議。今天主要以HLS協(xié)議為中心講述它的一些原理。
HLS協(xié)議簡(jiǎn)介
HTTP Live Streaming(縮寫是HLS)是一個(gè)由蘋果公司提出的基于HTTP的流媒體網(wǎng)絡(luò)傳輸協(xié)議。是蘋果公司QuickTime X和iPhone軟件系統(tǒng)的一部分。它的工作原理是把整個(gè)流分成一個(gè)個(gè)小的基于HTTP的文件來下載,每次只下載一些。當(dāng)媒體流正在播放時(shí),客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會(huì)話適應(yīng)不同的數(shù)據(jù)速率。在開始一個(gè)流媒體會(huì)話時(shí),客戶端會(huì)下載一個(gè)包含元數(shù)據(jù)的extended M3U (m3u8)playlist文件,用于尋找可用的媒體流。
HLS只請(qǐng)求基本的HTTP報(bào)文,與實(shí)時(shí)傳輸協(xié)議(RTP)不同,HLS可以穿過任何允許HTTP數(shù)據(jù)通過的防火墻或者代理服務(wù)器。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡(luò)來傳輸媒體流。
蘋果公司把HLS協(xié)議作為一個(gè)互聯(lián)網(wǎng)草案(逐步提交),在第一階段中已作為一個(gè)非正式的標(biāo)準(zhǔn)提交到IETF。但是,即使蘋果偶爾地提交一些小的更新,IETF卻沒有關(guān)于制定此標(biāo)準(zhǔn)的有關(guān)進(jìn)一步的動(dòng)作。
HLS整體架構(gòu)
上面是HLS整體架構(gòu)圖,可以看出,總共有三個(gè)部分:Server,CDN,Client.
HLS協(xié)議規(guī)定要求
1.視頻的封裝格式是TS。
2.視頻的編碼格式為H264,音頻編碼格式為MP3、AAC或者AC-3。
3.除了TS視頻文件本身,還定義了用來控制播放的m3u8文件(文本文件)。
為什么蘋果要提出HLS這個(gè)協(xié)議,其實(shí)他的主要是為了解決RTMP協(xié)議存在的一些問題。比如RTMP協(xié)議不使用標(biāo)準(zhǔn)的HTTP接口傳輸數(shù)據(jù),所以在一些特殊的網(wǎng)絡(luò)環(huán)境下可能被防火墻屏蔽掉。但是HLS由于使用的HTTP協(xié)議傳輸數(shù)據(jù),不會(huì)遇到被防火墻屏蔽的情況(該不會(huì)有防火墻連80接口都不放過吧)。
另外于負(fù)載,RTMP是一種有狀態(tài)協(xié)議,很難對(duì)視頻服務(wù)器進(jìn)行平滑擴(kuò)展,因?yàn)樾枰獮槊恳粋€(gè)播放視頻流的客戶端維護(hù)狀態(tài)。而HLS基于無狀態(tài)協(xié)議(HTTP),客戶端只是按照順序使用下載存儲(chǔ)在服務(wù)器的普通TS文件,做負(fù)責(zé)均衡如同普通的HTTP文件服務(wù)器的負(fù)載均衡一樣簡(jiǎn)單。
另外HLS協(xié)議本身實(shí)現(xiàn)了碼率自適應(yīng),不同帶寬的設(shè)備可以自動(dòng)切換到最適合自己碼率的視頻播放。其實(shí)HLS最大的優(yōu)勢(shì)就是他的親爹是蘋果。蘋果在自家的IOS設(shè)備上只提供對(duì)HLS的原生支持,并且放棄了flash。Android也迫于平果的“淫威”原生支持了HLS。這樣一來flv,rtmp這些Adobe的視頻方案要想在移動(dòng)設(shè)備上播放需要額外下點(diǎn)功夫。當(dāng)然flash對(duì)移動(dòng)設(shè)備造成很大的性能壓力確實(shí)也是自身的問題。
但HLS也有一些無法跨越的坑,比如采用HLS協(xié)議直播的視頻延遲時(shí)間無法下到10秒以下,而RTMP協(xié)議的延遲最低可以到3、4秒左右。所以說對(duì)直播延遲比較敏感的服務(wù)請(qǐng)慎用HLS。
HLS的請(qǐng)求流程:
1 http請(qǐng)求m3u8 的 url。
2 服務(wù)端返回一個(gè)m3u8的播放列表,這個(gè)播放列表是實(shí)時(shí)更新的,一般一次給出5段數(shù)據(jù)的url。
3 客戶端解析m3u8的播放列表,再按序請(qǐng)求每一段的url,獲取ts數(shù)據(jù)流。
RSA實(shí)現(xiàn)細(xì)節(jié)
密鑰生成
首先要使用概率算法來驗(yàn)證隨機(jī)產(chǎn)生的大的整數(shù)是否質(zhì)數(shù),這樣的算法比較快而且可以消除掉大多數(shù)非質(zhì)數(shù)。假如有一個(gè)數(shù)通過了這個(gè)測(cè)試的話,那么要使用一個(gè)精確的測(cè)試來保證它的確是一個(gè)質(zhì)數(shù)。
除此之外這樣找到的p和q還要滿足一定的要求,首先它們不能太靠近,此外p-1或q-1的因子不能太小,否則的話N也可以被很快地分解。
此外尋找質(zhì)數(shù)的算法不能給攻擊者任何信息,這些質(zhì)數(shù)是怎樣找到的,尤其產(chǎn)生隨機(jī)數(shù)的軟件必須非常好。要求是隨機(jī)和不可預(yù)測(cè)。這兩個(gè)要求并不相同。一個(gè)隨機(jī)過程可能可以產(chǎn)生一個(gè)不相關(guān)的數(shù)的系列,但假如有人能夠預(yù)測(cè)出(或部分地預(yù)測(cè)出)這個(gè)系列的話,那么它就已經(jīng)不可靠了。比如有一些非常好的隨機(jī)數(shù)算法,但它們都已經(jīng)被發(fā)表,因此它們不能被使用,因?yàn)榧偃缫粋€(gè)攻擊者可以猜出p和q一半的位的話,那么他們就已經(jīng)可以輕而易舉地推算出另一半。
此外密鑰d必須足夠大,1990年有人證明假如p大于q而小于2q(這是一個(gè)很經(jīng)常的情況)而,那么從N和e可以很有效地推算出d。此外e = 2永遠(yuǎn)不應(yīng)該被使用。
運(yùn)算速度
由于進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上好幾倍,無論是軟件還是硬件實(shí)現(xiàn)。速度一直是RSA的缺陷。一般來說只用于少量數(shù)據(jù)加密。RSA的速度比對(duì)應(yīng)同樣安全級(jí)別的對(duì)稱密碼算法要慢1000倍左右。
比起DES和其它對(duì)稱算法來說,RSA要慢得多。實(shí)際上Bob一般使用一種對(duì)稱算法來加密他的信息,然后用RSA來加密他的比較短的對(duì)稱密碼,然后將用RSA加密的對(duì)稱密碼和用對(duì)稱算法加密的消息送給Alice。
這樣一來對(duì)隨機(jī)數(shù)的要求就更高了,尤其對(duì)產(chǎn)生對(duì)稱密碼的要求非常高,因?yàn)榉駝t的話可以越過RSA來直接攻擊對(duì)稱密碼。
密鑰分配
和其它加密過程一樣,對(duì)RSA來說分配公鑰的過程是非常重要的。分配公鑰的過程必須能夠抵擋一個(gè)從中取代的攻擊。假設(shè)Eve交給Bob一個(gè)公鑰,并使Bob相信這是Alice的公鑰,并且她可以截下Alice和Bob之間的信息傳遞,那么她可以將她自己的公鑰傳給Bob,Bob以為這是Alice的公鑰。Eve可以將所有Bob傳遞給Alice的消息截下來,將這個(gè)消息用她自己的密鑰解密,讀這個(gè)消息,然后將這個(gè)消息再用Alice的公鑰加密后傳給Alice。理論上Alice和Bob都不會(huì)發(fā)現(xiàn)Eve在偷聽他們的消息。今天人們一般用數(shù)字認(rèn)證來防止這樣的攻擊。
RSA缺點(diǎn)
1)產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密。
2)安全性,RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià),而且密碼學(xué)界多數(shù)人士?jī)A向于因子分解不是NP問題。
3)速度太慢,由于RSA 的分組長(zhǎng)度太大,為保證安全性,n 至少也要 600 bits以上,使運(yùn)算代價(jià)很高,尤其是速度較慢,較對(duì)稱密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長(zhǎng)度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。
RSA的安全性
首先,我們來探討為什么RSA密碼難于破解?
在RSA密碼應(yīng)用中,公鑰KU是被公開的,即e和n的數(shù)值可以被第三方竊聽者得到。破解RSA密碼的問題就是從已知的e和n的數(shù)值(n等于pq),想法求出d的數(shù)值,這樣就可以得到私鑰來破解密文。從上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我們可以看出。密碼破解的實(shí)質(zhì)問題是:從Pq的數(shù)值,去求出(p-1)和(q-1)。換句話說,只要求出p和q的值,我們就能求出d的值而得到私鑰。
當(dāng)p和q是一個(gè)大素?cái)?shù)的時(shí)候,從它們的積pq去分解因子p和q,這是一個(gè)公認(rèn)的數(shù)學(xué)難題。比如當(dāng)pq大到1024位時(shí),迄今為止還沒有人能夠利用任何計(jì)算工具去完成分解因子的任務(wù)。因此,RSA從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。
然而,雖然RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。即RSA的重大缺陷是無法從理論上把握它的保密性能如何。
此外,RSA的缺點(diǎn)還有:A)產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密。B)分組長(zhǎng)度太大,為保證安全性,n 至少也要 600 bits 以上,使運(yùn)算代價(jià)很高,尤其是速度較慢,較對(duì)稱密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長(zhǎng)度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。因此,使用RSA只能加密少量數(shù)據(jù),大量的數(shù)據(jù)加密還要靠對(duì)稱密碼算法。
實(shí)例描述
在這篇科普小文章里,不可能對(duì)RSA算法的正確性作嚴(yán)格的數(shù)學(xué)證明,但我們可以通過一個(gè)簡(jiǎn)單的例子來理解RSA的工作原理。為了便于計(jì)算。在以下實(shí)例中只選取小數(shù)值的素?cái)?shù)p,q,以及e,假設(shè)用戶A需要將明文“key”通過RSA加密后傳遞給用戶B,過程如下:
(1)設(shè)計(jì)公私密鑰(e,n)和(d,n)。
令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3與20互質(zhì))則e×d≡1 mod f(n),即3×d≡1 mod 20。
d怎樣取值呢?可以用試算的辦法來尋找。試算結(jié)果見下表:
通過試算我們找到,當(dāng)d=7時(shí),e×d≡1 mod f(n)同余等式成立。因此,可令d=7。從而我們可以設(shè)計(jì)出一對(duì)公私密鑰,加密密鑰(公鑰)為:KU =(e,n)=(3,33),解密密鑰(私鑰)為:KR =(d,n)=(7,33)。
(2)英文數(shù)字化。
將明文信息數(shù)字化,并將每塊兩個(gè)數(shù)字分組。假定明文英文字母編碼表為按字母順序排列數(shù)值,即:
則得到分組后的key的明文信息為:11,05,25。
(3)明文加密
用戶加密密鑰(3,33) 將數(shù)字化明文分組信息加密成密文。由C≡Me(mod n)得:
因此,得到相應(yīng)的密文信息為:11,31,16。
(4)密文解密。
用戶B收到密文,若將其解密,只需要計(jì)算,即:
用戶B得到明文信息為:11,05,25。根據(jù)上面的編碼表將其轉(zhuǎn)換為英文,我們又得到了恢復(fù)后的原文“key”。
你看,它的原理就可以這么簡(jiǎn)單地解釋!
當(dāng)然,實(shí)際運(yùn)用要比這復(fù)雜得多,由于RSA算法的公鑰私鑰的長(zhǎng)度(模長(zhǎng)度)要到1024位甚至2048位才能保證安全,因此,p、q、e的選取、公鑰私鑰的生成,加密解密模指數(shù)運(yùn)算都有一定的計(jì)算程序,需要仰仗計(jì)算機(jī)高速完成。
評(píng)論