阅读SIP协议观后感
本文主要记录阅读 SIP rfc3261 文档的一些所思所考,不会对其进行整理分类,并且存在跳跃性
生成 SIP 响应
8.2.6
除了 invite 外需要生成临时响应,其它响应应该立即响应
生成的临时响应,请求中的时间戳应该直接复制到响应中。如果响应慢就需要将延迟时间以 s 为单位,将时间生成在响应中
响应的 Call-ID、CSeq、VIA的顺序必须相同。除了 100,其它响应的 uri 内容必须相同,并且需要添加一个 tag,用于 dialog。
事务的解读事务的分为客户端事务与服务器事务,客户端事务发送请求,服务器事务发送响应。
无状态代理不包含客户端事务或服务器事务。
200(Ok)的ack作用:主要为了确保 200ok 能够正常发送到 UAC。如果后续不发送 ACK,那么服务端会不断发送,并且在三分钟后断开连接
疑问:为啥 200 ok 的 ack 作为自己单独的事务?
解答:这样设计的原因是保证送达到UAC,并且如果没有回复 ACK,那么 UAS 将会重传
客户端事务:客户端事务的主要负责将接收到的响应传递给 TU, 并过滤重传与不允许的传递。对于 invite ...
Sip协议中的一些概念
本文主要介绍 SIP 协议中的一些缩写字符的含义,这些缩写在阅读 Sofia-sip 的代码时常有出现
Sip 缩写字符
线性空白(Linear White Space,简称LWS): 位于文本字符序列中的空白字符,包括空格、制表符和换行符等。在计算机编程中,线性空白通常用来描述文本中字符之间的间距,包括但不限于字母、数字、标点符号等。线性空白与非线性空白(Non-Linear White Space,简称NLWS)相对,非线性空白一般指符号或标点之间的间距,如句子结束的标点符号与下一句的起始字母之间的间隔
CRLF: 换行符
Sofia中的一些概念
本文主要对 Sofia 中的一些概念进行分析与解释,方便进行源码阅读。
Sofia 概念事件循环Event loop 与根对象 root object
NUA以事件反应器模式(也称为分发及通知模式)驱动事件系统(请参考[Using Design Patterns to Develop Reusable Object-oriented Communication Software, D.C. Schmidt, CACM October ‘95, 38(10): 65-74]一书)。Sofia以任务作为编程模型的基本执行单元。根据编程模型,程序可以请求事件循环在特定事件触发时调用回调函数。具体事件包括I/O激活,定时器或其它任务传递的异步消息。
root 对象是应用软件中描述一个任务的句柄。
透视事件的另一种方式是:root对象描述任务的主事件循环。通过root对象,任务代码可以访问它的上下文信息(magic)和线程同步,比如说等待对象、定时器,消息。
使用NUA服务的应用必须创建一个root对象,并设置处理NUA事件的回调函数。
调用 su_root_create()创建root对象 ...
Sofia发送subscriber的源码解析
本文将对 sofia 发送 subscriber 这个信令进行源码分析其中会对一些涉及到的其它源码进行解析,用以后续学习
Sofia 的 handle这里对 handle 进行一定的解释。这个 handle 用于管理向谁发送什么样的数据,这个谁一般指定 uac 。 一个 handle 会生成一个新的 call-id,产生一个新的 session。
nua_handle_destroy(): 用于销毁这个 handle。
小知识:FreeSWITCH 一般在创建后 nua_handle_bind(fnh, &mod_sofia_globals.destroy_private),后续不用后会自动销毁, 这个销毁主要依赖于 our_sofia_event_callback中的以下代码:12345if ((sofia_private && sofia_private == &mod_sofia_globals.destroy_private)) { nua_handle_bind(nh, NULL); nua_handle ...
cmake的使用记录
cmake 在 win 中的编译需要使用的一些配置,主要是记录曾经使用情况
Release 生成PDB123set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
cmake原生中的配置
123set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELWITHDEBINFO ...
powershell安装配置内容
PowerShell 配置脚本123456789101112131415161718Import-Module DirColorsSet-Alias bb "busybox" Set-Alias vim "nvim"Set-Alias vi "nvim"Set-Alias open "explorer.exe"Set-Alias which "gcm"Set-Alias vscode "code"Set-Alias ll "ls"Set-Alias android "D:\Install\IDE\Android Studio\bin\studio64.exe"Set-Alias yd "C:\Users\heping\Documents\WindowsPowerShell\yd.ps1"function locate{ if ($args[0].StartsWith("-" ...
FreeSWITCH问题分析
本文主要讲解在实际运维过程中容易出现的问题现象以及导致其出现问题的根本原因,可能附带有解决方法
30s挂断呼叫通没问题,但是会出现 30s 挂断。一般原因有以下几个方面:
外网端口与内网端口没有一对一映射:端口错误,导致客户端与 FS 的沟通出现网络无法连接问题,可能是 ACK 问题。
解决方案:将接口一对一映射
FS与opensip使用tls对接时,2分钟 tcp 断连opensips 本身有个参数 tcp_connection_lifetime 用于控制 tcp 的存活时长,此存活时长只能通过与服务端发送数据来延长时间,无法通过 tcp 本身的 keepalive 来进行保活。
最后,必须通过 fs 端发送 option 来延长 tcp 的存活时间。想要实现在通话中发送 option,那么必须使用 gateway ,并在 gateway 中配置 ping 来发送 option。
其中,option 存在问题还没开始通话就有 option 进行发送,其中的端口与通话的端口有什么关系呢?根据抓包发现:当前没通话,有新的呼叫创建情况下,有option,那就直接用option的端口 ...
WebRTC问题分析内容
WebRTC 的问题分析分析主要记录一些使用 WebRTC 过程中出现的问题,并且当前没有成体系的内容用于总结,简单的零散分析
WebRTC 的 oncandidate 时候失败,导致 setLocalDescription 耗时增加
问题:如标题所诉,由于在收集本地网络环境的,一些网卡(虚拟网卡等)的 ip,不具有连接网络的能力,导致在收集 IP 的时候会出现失败。
解决方案:监听来自 oncandidate 的事件,检测到有 relay 或 srly 的就可以直接调用 complete 1234567session.on("icecandidate", function (event) { if (event.candidate.type === "srflx" && event.candidate.relatedAddress !== null && event.candidate.relatedPort !== null) { event ...
WebRTC源码中文件的作用
本文主要讲解在 WebRTC 中一些文件的作用,并且其用途在编译过程中的一些用途。当然这些文件主要是一些配置文件,不包括源码文件
src 中源码
BUILD.gn:本文件主要包含了各种需要编译的各种源码,其中配置了编译 SDK 时,需要编译的源码。
DEPS:主要包含的是一些依赖文件,例如:openh264、ffmpeg等这类依赖文件
WebRTC在Mac中的编译
webrtc 在 mac 编译 Mac 与 IOS本文将会讲解在 mac 中从拉取代码到打包成 xcframework 的所有步骤,包中包括了ios 与 mac 的所有包。
设置代理编译 WebRTC 全程需要代理软件,所以建议设置好代理软件。
12export http_porxy="http://127.0.0.1:21087"export https_porxy="https://127.0.0.1:21087"
注意:即使在 MAC 中开启全局代理,仍然需要设置代理。本人编译时,没配置这个有时候出现无法下载外网资源,即使开了全局代理也没用。
安装 depot_toolsdepot_tools 是一套 Google 用来编译 WebRTC 的构建工具,获取 depot_tools 前,请先开启 VPN。
下载 depot_tools 解压到某个目录,然后配置系统环境
1export PATH=$PWD/depot_tools:$PATH
获取源代码获取源代码不能使用官网的源代 ...