mediasoup udp 單埠方案設計

2021-10-21 08:38:07 字數 2228 閱讀 4371

mediasoup udp 單埠**實現

github 路徑

mediasoup sfu 每建立乙個webrtctransport都會分配乙個udp port 來作為通訊的埠,並且mediasoup 每個 room client 會建立乙個recv webrtctransport 來接受其他client 的資料,建立乙個send webrtctransport 來傳送自身的資料,也就是乙個room client 會占用mediasoup 兩個udp埠。

參會人數過多,就會造成暴露的udp埠過多,造成運維上的困難。但如果採用udp 單個埠來服務全部通訊使用者,這裡就會遇到乙個問題,如何區分udp資料報是屬於哪個使用者的?

功能上要解決udp 資料報區分的問題

修改不破壞mediasoup sfu 整體的**框架,保持**的一致性

效能上不能有大的下降

單個埠來區分udp資料報,主要是基於ice的使用者名稱來做處理:

首先每個webrtctransport 建立的時候,都分配了 sdp 中的 ice 使用者名稱和密碼,這樣就建立了username_webrtctransport的對映關係。

mediasoup room client webrtc 建聯的過程,會首先傳送stun包過來,進行ice candidate 的提名,傳送的stun 包是攜帶了使用者名稱和密碼,這樣就知道了該webrtctransport的 ip:port,後續就可以通過ip:port來區分webrtctransport,建立了ip:port_webrtctransport的對映關係

不過這樣的設計會導致乙個問題,要支援rtp/rtcp/dtls的位址切換的情況下,只有先傳送stun包,讓伺服器重新對映ip_port 和 webrtctransport的關係。

主要的改造過程是對 webrtctransport 收udp資料那塊做處理。

webrtctransport 原有設計有個成員變數std::unordered_mapudpsockets,每個網絡卡建立乙個rtc::udpsocket,webrtctransport繼承 rtc::udpsocket::listener這個類,把自己的this指標傳給rtc::udpsocket,實現onudpsocketpacketreceived 這個函式具體處理接收udp 資料。

考慮到**最小侵入,我設計了乙個全域性變數

std::unordered_mapsingleudpsocket,每個網絡卡建立乙個rtc::singleudpsocket,通過rtc::singleudpsocket::settransportbyusername這個介面,rtc::singleudpsocket 繫結對應的ice username 和webrtctransport,rtc::singleudpsocket具體處理udp資料報的區分,把udp資料報**給對應的webrtctransport。

區分udp資料報的具體**邏輯

void singleudpsocket::

onudpsocketpacketreceived

( rtc::udpsocket* socket,

const

uint8_t

* data, size_t len,

const

struct sockaddr* remoteaddr)

if(listener)

rtc::stunpacket* packet = rtc::stunpacket::

parse

(data, len);if

(!packet)

std::string username = packet-

>

getusername()

;auto size = username.

find

(":");

if(size != std::string::npos)

auto name_iter = maptransportname.

find

(username);if

(name_iter == maptransportname.

end())

listener = name_iter-

>second;

settransportbypeerid

(listener, peer_id);if

(listener)

delete packet;

}

apache單IP多埠多站點配置

centos7.3系統 1.找到httpd.conf 在本檔案最下面新增 docuentroot 設定為預設80埠 documentroot 凡事都要在理解的前提下去做操作,沒有一模一樣的操作 includeoptional conf.d vhost conf 並且去掉servename的 更改為i...

apache實現單ip多埠對映

我使用乙個apache伺服器。在我的apache根目錄下有這麼幾個 如test child這兩個資料夾,也就是兩個 我想這樣,當我訪問http localhost的時候就訪問test,當我訪問http localhost 8080的時候就訪問child。我們需要配置apache。講apache資料夾...

python單ip埠掃瞄器

from socket import import threading 匯入執行緒相關模組 qianxiao996精心製作 lock threading.lock opennum 0 threads 定義執行緒列表 def portscanner host,port global opennum t...