Gtalk Jingle (1) - TURN relay server
看了一下google放出來的libjingle-0.4.0源代碼中的relay server部分。基本原理是要有個public的Relay Server,Relay Server要可以分配Replayed Transport Address,倒是如TURN draft-ietf-behave-turn-09描述的那樣。但有挺多不同和簡化。當然了,這個東西私有的,不存在互通的問題。
?
TURN是一個client/server協議, 特指client和relay server之間的交互:
?
client-----relay server ------ peer.
?
一個地址對(SocketAddressPair)構成一個連接(RelayServerConnection):
?
libjingle-0.4.0并沒有實現TURN協議中的Send消息(client->server)和Data(server->client)消息:
?????? 0x006? :? Send
?????? 0x007? :? Data
沒有這些消息的封裝,那怎么知道數據要發給誰呢?
?
在libjingle中,把client和relay server直接的連接叫internal connection, 而relay server和peer直接的連接叫external connection。internal connection和external connection可以有綁定關系:
?
talk/p2p/base/relayserver.h:
一個internal connection跟一個external connection建立綁定關系之后,可以說這2個connection組成了一個link,從哪個internal connection進來的數據,就知道放到哪個external connection來發出去給peer;同樣,從哪個external connection進來的數據,也知道該從哪個internal connection發出去給client。
?
基本流程是:
client--> server: Allocate.
???????????????server記下user name和地址對/internal connection
client<---server : Reponse (帶上relayed transport? address,實際上就5001)
...(通過某個/另一個server,peer得到relayed transport? address)
peer---->server
?????????????? server取出user name,找到internal connection. 講external connection和internal connection綁定。
?
OK, 將四個地址綁死組成一個link了,數據就可以在上面按特定的方向傳送了。
?
?
另一個明顯不同,Gtalk的server transport address用端口5000,relayed transport address用端口5001. 所以Gtalk對所有allocation都分配的5001,并不像TURN協議所說的一個relayed transport address可以一一對應一個allocation。Gtalk用地址對和連接綁定來識別allocation。 當然了,有源代碼,你也可以修改,因為RelayServer的寫法是有一個sock address pool,可以從這個pool中(隨即)選擇/分配relayed transport address給某個client的allocation:
talk/p2p/base/relayserver.cc
只是這個pool被Gtalk設置為只有一個sock address,使用端口5001.
?
這樣,Relay sever只給client分配5001一個端口,并使用前述的綁定方法,那么一個client通過一個relayed transport address只能和一個peer交換數據,而不像TURN協議中說的可以和多個peer通信。
?
不過,這樣client的數據包直接發給server,而不是封裝在Send消息里,這倒是沒有了適用ChannelBinding的理由(Send/Data消息的包頭開銷),因此你見不到
?????? 0x009? :? ChannelBind
?
還有,比如說Gtalk中的allocation不是通過Refresh消息來刷新,而是用數據包去刷新。也沒有實現Allocation的一些高級屬性,比如TURN協議中REQUESTED-PROPS attribute可以指定要求分配相鄰偶數奇數端口對(方便RTP/RTCP), 這里就沒有。
?
- 千里
總結
以上是生活随笔為你收集整理的Gtalk Jingle (1) - TURN relay server的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021最佳DevOps监控工具
- 下一篇: DX8升级DX9