Sofia-SIP辅助文档十五 - Sofia SIP用户代理库 - "sip" - SIP解析模块

http://sofia-sip.sourceforge.net/refdocs/sip/index.html翻译自官网的这张网页。


模块元信息

Sofia sip模块提供SIP解析器接口,以及SIP头和消息对象。

联系人:
Pekka Pessi < Pekka.Pessi@nokia-email.address.hidden>
状态:
Sofia SIP Core library
许可:
LGPL

Overview

<sofia-sip/sip.h>头文件中定义了每个头的结构体。除了头的结构体,<sofia-sip/sip_header.h>头文件中还定义了头类结构体以及每个头的一些标准函数。对一个特定的头X而言,在<sofia-sip/sip_protos.h>头文件中有类型、函数、宏和头类的申明。请参考SIP Header X - Conventions获得更多关于特定头的模板申明细节。

除了这些接口,SIP parser文档包含了用新的头扩展解析器所需的功能描述。可以向SIP解析器增加新的头,或者扩展已有头的定义。

解析SIP消息

Sofia文本解析器遵循递归下降原则 。换句话说,它是一个自顶向下递归下降语法树的程序(所有的语法树在顶端有一个根,树向下生长)。

对SIP协议而言,这样一个解析器是非常高效的。解析器可以在基于每个记号的不同的格式中选择,因为协议语法是被小心设计的,以便只需要很少的向前扫描。通过标准API可以很容易扩展递归下降解析器,而不是例如用Bison生成的LALR解析器。

抽象消息模块msg包含一个高层解析器引擎,这个引擎驱动了解析过程和为每个头调用特定协议的解析器。因为SIP消息之间有分帧,因此解析器可以认为任何收到的数据,无论是UDP包还是TCP包,是一个消息流,由一或多个消息组成。解析器分解流成fragments,然后基于解析结果构建一个完整的消息。解析完一条消息后,消息将交给消息流客户(典型情况下是协议状态机)。解析器持续处理流,并且将消息提供给协议引擎直到到达流的尾端。一个fragment是消息的一个片段:第一行、每个头、头区域和消息体之间的空行(拿HTTP来说,消息体由被称为chunks的多个fragment组成)。

对每个消息而言,解析器以从字节流中分离出第一个fragment作为开始,请求或状态行。第一行处理完毕后,解析器引擎持续从消息中分离出一个个头。解析器遇到分隔头部和消息体的空行后,再调用一个解析分隔符和负载fragment的函数。当一个消息处理完毕后,解析器将消息提交给协议引擎。然后开始处理下一条消息的第一个fragment。

sip-parser.gif

Separating byte stream to messages

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值