流程

解析过程
网络层收到 SIP 消息文本(如 INVITE sip:xxx SIP/2.0 开头的字符串),调用此函数触发解析
预处理与核心分发:__osip_message_parse:
- 调用 osip_util_replace_all_lws 做空白符归一化(把连续空白符、换行符等替换成单个空格,避免格式歧义);
- 调用 __osip_message_startline_parse 解析起始行(区分请求 / 响应行,提取方法 / 状态码等);
- 调用 msg_headers_parse 解析消息头域(To/From/CSeq 等核心头,处理多值、折叠行);
- 调用 msg_osip_body_parse 解析消息体(如 SDP 媒体描述,或其他 MIME 内容)。
osip_util_replace_all_lws:
Contact: sip:alice@example.com
;expires=3600 // 折叠换行,实际是同一行
此函数会把所有空白符(空格、制表符、换行)替换为单个空格,让后续解析逻辑更统一。
起始行解析:__osip_message_startline_parse:
区分请求 / 响应:
请求行格式:METHOD Request-URI SIP/2.0(如 INVITE sip:bob@example.com SIP/2.0);
响应行格式:SIP/2.0 STATUS_CODE Reason(如 SIP/2.0 200 OK)。
提取关键字段:
请求:提取 method(如 INVITE)、req_uri(请求目标);
响应:提取 status_code(如 200)、reason_phrase(如 OK)。
头域解析:msg_headers_parse:
复杂点:SIP 头域多且灵活(如 Via 带分支参数、Contact 多地址),需处理:
折叠行合并:还原被拆分的长头域(靠 osip_util_replace_all_lws 预处理后,此处只需拼接);
多值头处理:如 Via 可能有多个分支,需拆分成数组存储;
语法校验:检查 CSeq 格式是否合法(方法 + 序号)、Call-ID 是否符合规范等。
消息体解析:msg_osip_body_parse:
v=0
o=alice 12345 67890 IN IP4 example.com
s=
c=IN IP4 192.168.0.1
t=0 0
m=audio 5000 RTP/AVP 0 8 96
此函数会识别 Content-Type(如 application/sdp),调用对应解析器(SDP 解析逻辑常内置在此步骤),提取媒体类型、端口、编码载荷等
实际开发中的问题映射
- 解析失败排查:若解析报错,可按调用链反向定位:
空白符问题 → 看 osip_util_replace_all_lws 处理后的数据;
起始行格式错 → 检查 __osip_message_startline_parse 返回码;
头域不合法 → 重点看 msg_headers_parse 对特定头(如 Via)的处理。 - 扩展场景:若需支持新的 Content-Type(如 application/im-iscomposing+xml 用于聊天状态),需修改 msg_osip_body_parse,添加对应解析分支。
5599

被折叠的 条评论
为什么被折叠?



