FreeSWITCH容器化問題之rtp端口占用

操作系統 :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

一、端口分配及檢查邏輯

 文件:switch_core_port_allocator.c

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宕機

 測試效果如下:

 

好,就這麼多了,希望對你有幫助。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章