操作系統 :CentOS 7.6_x64、debian 11 (bullseye,docker)
FreeSWITCH版本 :1.10.9
Docker版本:23.0.6
FreeSWITCH容器化帶來部署便利的同時,也會遇到一些問題,比如今天要討論的RTP端口占用問題(FreeSWITCH申請宿主機已佔用的端口)。
我將從以下三個方面進行展開:
1)從源碼層面分析FreeSWITCH的端口分配及檢查邏輯;
2)描述開啓RTP端口占用檢測的方法;
3)演示RTP端口占用檢測效果;
FreeSWITCH容器化參考我之前的文章:
https://www.cnblogs.com/MikeZhang/p/dockerPackFs20230617.html
https://www.cnblogs.com/MikeZhang/p/dockerFS20230716.html
一、端口分配及檢查邏輯
1、 端口查找的主循環
如果系統認爲還有端口可分配,則一直重試,沒有退出循環的邏輯,存在導致fs宕機的風險。
2、端口檢查邏輯
端口檢查通過bind函數實現,嘗試bind,成功後,關閉socket,釋放端口。
存在以下兩個問題:
1) 效率不高;
2) bind後會執行釋放操作,rtp使用時仍然會存在失敗的風險;
二、啓RTP端口占用檢測的方法
FreeSWITCH默認不開啓rtp端口檢測佔用,端口分配了就直接使用。可通過如下配置開啓rtp端口檢查。
文件 :autoload_configs/switch.conf.xml
內容:
<param name="rtp-port-usage-robustness" value="true"/>
三、RTP端口占用檢測效果演示
1、調整端口範圍
文件:autoload_configs/switch.conf.xml
內容:
<param name="rtp-start-port" value="$${force_rtp_start_port}"/> <param name="rtp-end-port" value="$${force_rtp_end_port}"/>
示例如下:
2、容器外佔用端口
安裝netcat:
yum install netcat
佔用端口:
nc -l -u 20002
3、呼叫測試
3.1、開啓後可實現端口占用檢查,如果佔用了則重新分配
測試效果如下:
3.2、如果rtp端口範圍比較小,會出現一直嘗試分配端口的情況,可能會導致fs宕機
測試效果如下:
好,就這麼多了,希望對你有幫助。