日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gtalk Jingle (1) - TURN relay server

發布時間:2023/12/29 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

  • class?RelayServerBinding
  • {
  • ??std::vector<RelayServerConnection*>?internal_connections_;
  • ??std::vector<RelayServerConnection*>?external_connections_;
  • }
  • 一個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

  • void?RelayServer::HandleStunAllocate(
  • ????RelayServerConnection*?int_conn,?const?StunMessage&?request)?{
  • ...
  • ??size_t?index?=?rand()?%?external_sockets_.size();
  • ??talk_base::SocketAddress?ext_addr?=?external_sockets_[index]->GetLocalAddress();
  • ...
  • }
  • 只是這個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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。