亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 網絡協議 > 正文

flashP2P協議rtmfp解析

2020-05-13 13:28:14
字體:
來源:轉載
供稿:網友

   1 協議介紹

  Real-Time Media Flow Protocol(簡稱RTMFP)是Flash和Flash之間基于UDP的點對點傳輸協議,由Adobe公司在2008年在Flash 10.0中發布,隨后在Flash10.1中加入了Groups功能。

  2 常見用法

  rtmfp在Flash 10中的典型使用場景如下圖:

flashP2P協議rtmfp解析

 

  它有如下特點:

  l 使用Cirrus或者開源的Cumulus來提供Rendezvous服務

  l Cirrus或者Cumulus并不提供Peer ID的交換服務,需要提供其它的方式來交換客戶端之間的Peer ID

  l Flash客戶端之間使用NetStream來做點對點傳輸,Publisher需要給每一個Subscriber單獨傳輸一份數據,這也限制集群的規模。

  為了解決這個問題,Adobe在Flash 10.1中提出了Groups的概念,典型的架構如下:

flashP2P協議rtmfp解析

 

  它有如下特點:

  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的定義如下:

  typemeaning

  0x30initiator hello

  0x70responder hello

  0x38initiator initial keying

  0x78responder initial keying

  0x0fforwarded initiator hello

  0x71forwarded hello response

  0x10normal user data

  0x11next user data

  0x0csession failed on client side

  0x4csession died

  0x01reset keepalive request

  0x41reset keepalive response

  0x5enegative ack

  0x51some 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= x01x0Ax41x0E | dh-public-num | x02x15x02x02x15x05x02x15x0E

  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的意義如下:

  bitmeaning

  0x80options域是否存在

  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

 

  字段定義同上

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线免费视频| 亚洲欧美色婷婷| 91在线观看免费高清| 久久99国产精品自在自在app| 欧美激情xxxx性bbbb| 欧美wwwxxxx| 亚洲综合色激情五月| 97人人做人人爱| 92裸体在线视频网站| 亚洲xxxx3d| 日韩av在线直播| 97国产精品免费视频| 国产精品久久久精品| 欧美高清激情视频| 国产主播精品在线| 国产91在线播放精品91| 日韩av在线播放资源| 色噜噜久久综合伊人一本| 国产成人精品综合| 亚洲三级免费看| 亚洲性夜色噜噜噜7777| 97精品国产97久久久久久| 欧洲永久精品大片ww免费漫画| 成人激情av在线| 欧美最猛性xxxxx亚洲精品| 日韩av黄色在线观看| 国产精品观看在线亚洲人成网| 欧美亚洲免费电影| 一区国产精品视频| 久久久久久国产精品| 国产专区欧美专区| 日韩毛片在线看| 国产婷婷成人久久av免费高清| 欧美激情欧美激情| 亚洲最大福利网站| 一区二区三区视频免费| 最近2019中文字幕第三页视频| 热久久免费国产视频| 国产精品精品视频| 国产精品一区二区三区在线播放| 精品偷拍一区二区三区在线看| 97久久精品人人澡人人爽缅北| 成人免费福利视频| 国产在线播放不卡| 国产欧美婷婷中文| 成人深夜直播免费观看| 日本中文字幕不卡免费| 国产日韩欧美在线观看| 欧美黑人性视频| 欧美日韩在线观看视频小说| 最近2019中文字幕在线高清| 亚洲久久久久久久久久久| 2024亚洲男人天堂| 久久欧美在线电影| 日韩av电影国产| 欧美激情videoshd| 日韩欧美在线免费观看| 久久久久久噜噜噜久久久精品| 国产美女扒开尿口久久久| 国产精品专区第二| 国产精品视频久久| 日韩电影中文字幕在线观看| 国产精品视频白浆免费视频| 国产在线观看精品一区二区三区| 欧美成人免费全部观看天天性色| 庆余年2免费日韩剧观看大牛| 欧美国产第二页| 久久久在线观看| 日韩精品亚洲视频| 亚洲天堂日韩电影| 2018日韩中文字幕| 国产精品久久久久久亚洲调教| 亚洲无av在线中文字幕| 亚洲欧美激情在线视频| 久久久久久久久久久成人| 国产99久久精品一区二区永久免费| 成人黄色片网站| 国产日韩欧美黄色| 国产精品稀缺呦系列在线| 国产精品久久久av| 欧美裸体视频网站| 亚洲国产精品福利| 精品视频偷偷看在线观看| 亚洲最大成人免费视频| 国产亚洲综合久久| 亚洲精品aⅴ中文字幕乱码| 亚洲综合日韩在线| 日本成人激情视频| 欧美极品少妇xxxxⅹ裸体艺术| 日韩欧美综合在线视频| 久久久999国产精品| 国产ts一区二区| 在线观看日韩av| 欧美日韩成人黄色| 国产精品中文在线| 成人免费在线视频网址| 日本欧美黄网站| 亚洲日本成人女熟在线观看| 久久久久久噜噜噜久久久精品| 亚洲国产高清福利视频| 91夜夜揉人人捏人人添红杏| 亚洲自拍在线观看| 亚洲国产精品专区久久| 97国产真实伦对白精彩视频8| 日韩免费av片在线观看| 性欧美长视频免费观看不卡| 日韩av网站在线| 久久久久久久久久亚洲| 欧美精品videossex88| 日韩在线视频免费观看高清中文| 亚洲激情电影中文字幕| 国产精品久久久久91| 奇米四色中文综合久久| 国产精品亚洲激情| 日韩**中文字幕毛片| 欧美视频精品一区| 日韩电影大片中文字幕| 57pao国产精品一区| 欧美日韩国产中字| 欧美国产日韩一区二区| 欧美成人免费网| 亚洲美女免费精品视频在线观看| 久久综合网hezyo| 亚洲国产精久久久久久| 欧美日韩综合视频| 久久久国产成人精品| 国产精品xxx视频| 日韩毛片在线观看| 亚洲欧洲成视频免费观看| 精品久久香蕉国产线看观看gif| 欧美激情2020午夜免费观看| 中文字幕国产亚洲2019| 国产日韩欧美综合| 成人两性免费视频| 欧美极品欧美精品欧美视频| 1769国内精品视频在线播放| 成人激情在线播放| 色综合色综合久久综合频道88| 在线观看精品国产视频| 欧美日韩成人精品| 欧美一区二区色| 日本伊人精品一区二区三区介绍| 亚洲欧美日韩国产精品| 欧美天天综合色影久久精品| 国产精品高清免费在线观看| 俺去了亚洲欧美日韩| 最新69国产成人精品视频免费| 亚洲福利精品在线| 久久久午夜视频| 色婷婷**av毛片一区| 久久成年人免费电影| 九九精品在线观看| 日韩av电影免费观看高清| 亚洲黄色www| 2025国产精品视频| 日本电影亚洲天堂| 日韩电影中文字幕在线| www.欧美精品一二三区| 亚洲男人天堂久| 亚洲欧美日韩爽爽影院| 欧美日韩成人在线视频| 亚洲国产成人在线播放| 国产精品免费视频xxxx| 91欧美精品成人综合在线观看|