flash p2p rtmfp協議解析
原文地址:http://blog.csdn.net/vinowan/article/details/45934627
1 協議介紹
Real-Time Media Flow Protocol(簡稱RTMFP)是Flash和Flash之間基於UDP的點對點傳輸協議,由Adobe公司在2008年在Flash 10.0中釋出,隨後在Flash10.1中加入了Groups功能。
2 常見用法
rtmfp在Flash 10中的典型使用場景如下圖:
它有如下特點:
l 使用Cirrus或者開源的Cumulus來提供Rendezvous服務
l Cirrus或者Cumulus並不提供Peer ID的交換服務,需要提供其它的方式來交換客戶端之間的Peer ID
l Flash客戶端之間使用NetStream來做點對點傳輸,Publisher需要給每一個Subscriber單獨傳輸一份資料,這也限制叢集的規模。
為了解決這個問題,Adobe在Flash 10.1中提出了Groups的概念,典型的架構如下:
它有如下特點:
l Cirrus或者開源的Cumulus提供Rendezvous服務並提供所有連線client列表
l client從Cirrus或者開源的Cumulus獲取鄰居節點之後,就可以組成一個完整的P2P架構,所有的audio、video和data資料都在peer之間互動。
3 協議解析
3.1 基本概念
l session:session是兩個UDP地址之間的雙向管道。
l flow:flow是從一個實體到另一個實體之間的邏輯路徑。一個session可以包括多個flow。
l packet:網路中實際傳輸的資料,一個packet可以包含多個message。資料傳輸時都經過了128 bit的AES加密
l message:audio、video和data資料。
3.2 Scrambled Session ID
rtmfp協議中每個包的格式如下:
packet := scrambled-session-id | encrypted-part
其中scrambled-session-id是4位元組,其後是經過AES加密的資料體。
scramble-session-id的生成規則如下:
scrambled-session-id = a ^ b ^ c
這裡^代表XOR操作,a是session-id,b和c是encrypted-part的頭8個bytes。
當目標收到這個包後,unscramble的操作如下:
session-id = x ^ b ^ c
其中x是scrambled-session-id,b和c同上。
使用scramble-session-id的目的為了減少資料包流經的NAT裝置和layer-4 packet inspector對資料的干擾。
session-id用於標識通訊雙方建立的連線,並確定通訊時使用的加密和解密的key,這些key是通過DH key exchange演算法獲得。但在session建立之前,雙方使用一個公有加密key,即128 bit的字串”Adobe System 02”。
3.3 raw part
encrypted-part經過解密之後就得到了raw-part,它的格式如下:
raw-part := checksum | network-layer-data | padding
其中checksum有16位元組,network-layer-data是變長資料,padding都是0xFF,並把network-layer-data補齊為16位元組的倍數,這是因為rtmfp使用的是16位元組的加解密key。
checksum基於network-layer-data和padding計算。
3.4 network layer data
network-layer-data的格式如下:
network-layer-data = flags | timestamp | timestamp-echo | chunks
其中flags為1個位元組,其格式如下:
7 6 5 4 3 2 1 0
TC TCR reserved reserved TS TSE mode
l mode:11代表握手包,01代表initiator傳送包,10代表responder傳送包,00不是合法值
l TSE:包中是否包含timestamp-echo域
l TS:包中是否包含timestamp域
l TCR:time critical reverse notification表明傳送方正在從其它地方收到timecritical包
l TC:time critical forward notification表明傳送方傳送的是timecritical包
timestamp域有2位元組,精度是4ms,他的計算方式如下:
timestamp = int(time * 1000 / 4) & 0xFFFF
timestamp-echo域是server收到包的時間戳,當傳送放收到這個值之後,傳送方就可以計算RTT值了。
chunk型別的格式如下:
chunk = type | size | payload
type欄位為1個位元組,其中0xFF不可用,這個是用來區分chunk資料和padding資料的標記。type的定義如下:
type |
meaning |
0x30 |
initiator hello |
0x70 |
responder hello |
0x38 |
initiator initial keying |
0x78 |
responder initial keying |
0x0f |
forwarded initiator hello |
0x71 |
forwarded hello response |
0x10 |
normal user data |
0x11 |
next user data |
0x0c |
session failed on client side |
0x4c |
session died |
0x01 |
reset keepalive request |
0x41 |
reset keepalive response |
0x5e |
negative ack |
0x51 |
some ack |
size是2位元組payload長度。
payload根據type的不同有不同的資料體。
3.5 message flow
session中包括3類訊息:
l handshake:握手包,包括initiator hello, responder hello, initiator initial keying,responder initial keying, responder hello cookie change和responderredirect
l control:控制包,包括ping, ping reply, rekeying initiate, rekeying response, close, closeacknowledge, forwarded initiator hello.
l flow:流訊息,包括user data, next user data, buffer probe, user data ack, user dataack, flow exception report.
session的建立是通過握手(handshake)來完成的,正常的messageflow如下:
如果是在NAT打洞是,cumulus server就作為一個forwarder,他會把initiatro hello包轉發到其它的client:
另外,cumulus server還可以讓client重定向到其它server:
這裡所說的client是Flash Player,而server是cumulus server或者Flash media server。當然server也可以給client傳送initiator hello請求,這個在cumulus中被稱為man in the middle,不過這個特性還不穩定。
session的建立包括4次握手:
1 initiator -> target:initiator hello
2 target -> initiator: responder hello
3 initiator -> target:initiator initial keying
4 target -> initiator: responder initial keying
這個4次握手過程可以阻止Dos攻擊和syn-flooding攻擊。
每個session都有一個session-id來唯一標識這個session,並且session中的每個packet都會包含這個session-id,但是在session建立的4個握手包中,initiator-hello, responder hello和initiator initialkeying的session-id欄位都是0,在傳送最後一個包responder initial keying時,session建立成功並且session-id確定,所以responderinitial keying包含合法的session-id。
我們接下來詳細介紹一下這4個握手包
3.5.1 initiator hello
initiator hello包的格式如上所述,這裡只說明payload部分的格式:
initiator-hello payload = first | epd type | epd value| tag
其中:
l first:1 byte magic number
l epd type:1 byte,只有兩個合法值:
n 0x0a:client-server模式,epd value是想要連線的server的rtmfp url
n 0x0f:peer-to-peer模式,epd value是想要連線的client的peer id,一般是固定的32位元組
l epd value:varlen + body
l tag:16 bytes隨機數
3.5.2 responder hello
responder hello包的payload格式如下:
responder hello payload = tag-echo | cookie | responder-certificate
其中:
l tag-echo:和initiator hello中的tag一致,但和initiator hello中不同的是,這裡在前面有一個varlen來表明tag的長度
l cookie:responder產出的64 bytes隨機數,用來防止syn-flooding攻擊
l responder certificate:diffie-hellman key exchange演算法交換的資訊,它的格式如下:
certificate= \0x01\0x0A\0x41\0x0E | dh-public-num | \0x02\0x15\0x02\0x02\0x15\0x05\0x02\0x15\0x0E
dh-public-num是一個64 byte(128 byte)隨機數。
dh-public-num的生成規則為
y2 = g ^ x2 % p
其中g和p是公開的兩個數,其中g等於2,p是一個1024 bits的數,x2是responder隨機生成的數,y2就是在網路中傳輸的dh-public-num。
3.5.3 initiator initial keying
initiator initial keying包的payload格式如下:
payload = initiator-session-id | cookie-echo | initiator-certificate| initiator-component | ‘X’
其中:
l initiator-session-id:initiator選擇的session-id,responder用它來發送資料給initiator(生成scrambled session id)
l cookie-echo:和上一個包中的cookie一致
l initiator-certificate:格式和上面的responder certificate一致
和上述的一樣,這裡的dh-public-num的生成規則如下:
y1 = g ^ x1 % p
其中g和p的定義和上述一致,x1是initiator隨機生成的數,y1就是傳輸的dh-public-num。這時initiator知道了y2和x1,就可以生成sharedsecret:
shared secret = y2 ^ x1 % p
這時就可以生成這個session對應的加解密key了:
decode key = HMAC-SHA256(shared-secret, HMAC-SHA256(responder nonce,initiator nonce))
encode key = HMAC-SHA256(shared-secret, HMAC-SHA256(initiator nonce,responder nonce))
這些加解密key都只使用低位的128bit
l initiator-component:在DH演算法中使用的initiator nonce。
3.5.4 responder initial keying
responder initial keying的payload的格式如下:
payload = responder session id | responder’s nonce | ‘X’
其中:
l responder session id:responder生成的session id,initiator用它來生成scrambled session id,這個值和initiator session id不一樣。
l responder’s nonce:
這時responder知道了y1和x2,就可以生成sharedsecret:
shared secret = y2 ^ x1 % p
DH演算法保證這個responder的sharedsecret和initiator的shared secret是一樣的。
這時就可以生成這個session對應的加解密key了:
encode key = HMAC-SHA256(shared-secret, HMAC-SHA256(responder nonce,initiator nonce))
decode key = HMAC-SHA256(shared-secret, HMAC-SHA256(initiator nonce,responder nonce))
這些加解密key都只使用低位的128bit。
可以看到responder的encode key和initiator的decode key是一樣的,同樣,responder的decode key和initiator的encode key是一樣的。
注意responder initial keying依然使用”Adobe System 02”作為對稱key來加解密,而不是使用新生成的非對稱的key來加解密,非對稱的key僅在session建立之後使用。
3.5.5 user data
至此session就建立好了,後續傳輸的就是資料訊息,主要包括兩類:
l normal user data:正常的flow中資料訊息
l next user data:和normal user data在一個packet中傳輸,不能單獨使用。
normal user data包的payload格式如下:
payload = flags | flow-id | seq | forward-seq-offset | options |data
其中:
l flags:1 byte,各bit的意義如下:
bit |
meaning |
0x80 |
options域是否存在 |
0x40 |
|
0x20 |
這個包前面還有包 |
0x10 |
這個包後面還有包 |
0x08 |
|
0x04 |
|
0x02 |
丟棄包 |
0x01 |
結束包 |
l flow-id:flow標識,varlen型別
l forward-seq-offset:用於滑窗的標識,varlen型別
l options:一些選項
l data:audio、video和data資料
next user data包的payload格式如下:
payload = flags | data
欄位定義同上
相關推薦
flash p2p rtmfp協議解析
原文地址:http://blog.csdn.net/vinowan/article/details/45934627 1 協議介紹 Real-Time Media Flow Protocol(簡稱RTMFP)是Flash和Flash之間基於UDP的點對點傳輸協議
Flash Player 10 中的RTMFP協議(實現P2P技術)
RTMFP是Adobe公司開發的一套新的通訊協議,該協議可以讓使用Adobe Flash Player的終端使用者之間進行直接通訊。用Adobe AIR框架開發的程式也可以用此協議來發布直播、實時資訊。 通過使用RTMFP, 那些以來直播、實時通訊的應用,比如社群、
(轉)服務端使用c++實現websocket協議解析及通信
nec req 和數 http響應 表示 new base64 枚舉 unsigned 轉自:http://blog.csdn.net/grafx/article/details/54234518 WebSocket 設計出來的目的就是要使客戶端瀏覽器具備像
STUN和TURN協議解析
use 穿透 環境 tcp協議 域名 未收到 判斷 求一個 p地址 在現實Internet網絡環境中,大多數計算機主機都位於防火墻或NAT之後,只有少部分主機能夠直接接入Internet。很多時候,我們希望網絡中的兩臺主機能夠直接進行通信,即所謂的P2P通信,而不需要其他公
HTTP協議解析
協議 http 解析 HTTP協議解析http即超文本傳輸協議,是一種詳細規定了瀏覽器和萬維網服務器之間相互通信的規則。他是萬維網交換嘻嘻的基礎,他允許將HTML文檔從web服務器傳到web瀏覽器。發送一個HTTP請求很簡單,只需要在搜索引擎上輸入url。HTTP協議詳解當瀏覽器向Web服務器發出
ppp協議解析二
全部 打包 數據鏈路 技術 數據 自己的 這就是 長度 但是 轉:http://blog.csdn.net/yangzheng_yz/article/details/11526747 PPP(Point to Point Protocol,點對點協議)協議是為在兩個對等實體
fastcgi協議解析(nginx)
fst agent role sock req 包括 connect nginx 定義 請求NGINX ->[ {(post data) +> (NGX_HTTP_FASTCGI_STDIN)} * N +> {(environment variabl
socks 5 協議解析
class password 私人 sock 認證 private user strong cep 本文所列的表格通常長這樣的: ┌────────┬────────┬────────┐ │ field1 │ field2 │ field3 │ ├────────┼────
藍牙協議解析
ofo category art 查看 follow href .net cat 文章 藍牙相關的文章請到csdn 博客 查看。地址:http://blog.csdn.net/gysmmzh/article/category/6830529藍牙協議解析
PCIE協議解析 synopsys IP loopback 讀書筆記(1)
overview 沒有 發出 調試 期望 pci 附加 error edit 1 Overview Core支持單個Pcie內核的Loopback功能,該功能主要為了做芯片驗證,以及在沒有遠程接收器件的情況下完成自己的回環。同時,Core也支持有遠程接收器件的lo
詳解BLE 空中包格式—兼BLE Link layer協議解析
廣播包 emp 功能 4.0 ID 5.0 下一個 標示 ini BLE有幾種空中包格式?常見的PDU命令有哪些?PDU和MTU的區別是什麽?DLE又是什麽?BLE怎麽實現重傳的?BLE ACK機制原理是什麽?希望這篇文章能幫你回答以上問題。 雖然BLE空中包(pack
OpenVPN協議解析-網路結構之外
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
gh0st遠控原始碼圖文詳解Gh0st通訊協議解析(1)
與大家分享下gh0st通訊的全過程解析。瞭解gh0st的通訊上線發包全過程,網上有很多相關資料,自己在總結了下。希望對初學者有幫助少走彎路,gh0st的核心是個不錯的經典值得學習。轉載請註明: 速維網路 Gh0st通訊協議解析(1) gh0st遠控原始碼釋出至今已有不少
網際網路協議解析(一) | TCP 與UDP
作者有話說 在很多面試中,有 很多面試官會問到:“你說說TCP UDP有什麼區別呀?”,你會巴拉巴拉說一堆區別。有很多人是應試性的背誦,但不一定很系統地理解TCP/UDP。我一個同事曾這樣形容過,就算面試的問題是“你說說龍肉 跟麒麟肉 有什麼區別呀?”,也會有人巴拉巴拉說出1234條來。壓根沒見
DHT協議解析(1)
BEP-003 BitTorrent 是一個分發檔案的協議( a protocol for distributing files).它根據URL定義內容,與web無縫整合.它相對於普通HTTP的優勢在於當多個下載者下載同一個檔案時,下載者互相也會上傳給對方.這使得檔案資源只需要一些代
紅外協議解析
title: 紅外協議解析 tags: ARM date: 2018-11-06 17:55:26 --- 紅外協議解析 設計思路 NEC紅外波形是由引導碼,資料碼,結束碼組成,不同的編碼時間間隔不一致.可以採用環形緩衝區的形式先將波形儲存,然後處理.環形緩衝區儲存著電平狀態以及持續時間.
FUSE協議解析
由於以前有專案是用到FUSE,將S3等物件儲存對映為檔案儲存的,但我不是負責那一塊,所以一直只是知道FUSE是個什麼東西,而沒有用過。剛好趁著沒工作的這段時間,學習Golang,順便把FUSE也瞭解下,實現了一個簡易版的libfuse: https://github.com/mingforpc/fuse-go
OPC協議解析-OPC客戶端與伺服器通訊解析
1 OPC伺服器 OPC伺服器, 是指按照OPC基金組織規定的OPC規範群開發的軟體驅動。OPC伺服器作為中間媒介負責從資料來源讀取資料再跟另外一端的客戶端通訊。在 OPC客戶端/伺服器 的結構圖中, 通訊的發起端是, 也只能是OPC客戶端。客戶端
基於ModBus-TCP/IT 臺達PLC 通訊協議解析
com 服務端 inf eve esp code ons copy nbsp 客戶端發送:19 B2 00 00 00 06 06 03 00 27 00 02 上面是modbus客戶端發出的報文內容,為modbus tcp/ip協議格式,其前面的六個字節為頭字節( he
can協議解析字串的原理
這裡的資料使用的是標準的can裝置產生的can訊號(擴充套件幀傳送資料ID=0x11121181 Data=0x06 0x08) 訊號的波形如圖1所示,這裡示波器的探頭接的是CAN_H,探頭的夾子接的是CAN_L: 圖1 示波器顯示波形 首先根據本部落格中前面寫的一