2012-05-15 41 views

回答

11

Call-ID标头值可以是任何你想要的,但必须是唯一的,以避免请求被分类为重复。

Via头部的分支参数需要以魔术cookie值z9hG4bK开头,并且还必须是唯一的,以避免请求被分类为重复。对于希望进行循环检测的SIP代理来说,RFC 16.6第8点中的准则也详细说明了构建分支参数值时需要考虑的因素。

1

你的措辞很难理解。我假设你想知道如何 UAC应该生成一个Call-ID如何一个UAC或代理服务器应该生成一个branch参数。

Call-ID的唯一要求是它应该是唯一的。它通常采用独特的标记形式+“@”+主机名称,例如电子邮件的Message-ID,但它不一定是。它可以只是一个独特的令牌。唯一的标记可以是任何合理确定为唯一的东西。为了避免泄露私人信息,你可以只让伪随机的或私人的独特信息的加密哈希(时间,进程ID,等...)

相若方式中,branch参数只是一个唯一令牌,但要注意它必须以RFC中规定的z9hG4bK开头。

+1

对于唯一标记+“@”+主机名,不需要使用Call-ID。你会发现一堆SIP堆栈使用GUID或类似的。将IP地址放在Call-ID值中实际上是个不错的主意。我已经看到SIP ALG会破坏他们在SIP数据包中找到的每个私有IP地址,并且如果它们恰好包含私有IP地址,则会使Call-ID标头搞砸。 – sipwiz

+0

@sipwiz你说得对,我自己也看到过这种“光秃秃的”Call-ID。我编辑了我的答案。 – Celada

+0

@sipwiz是的,你是对的,我自己生成它。 – lucky

0

为什么重新发明轮子?

有开源的SIP项目,它们的实现可能会激励你。 你没有提到你使用的是什么编程语言。所以我假设你可以阅读C代码。

获取kamailio server的源代码。 Call-ID的实现在kamailio-4.0.x/modules/tm/callid.c中。我相信你很聪明,可以自己了解分支标签:o)