SIP和SDP消息详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SIP消息头域
1 general-header类:
为描述消息基本属性的通用头域,可用于请求消息或响应消息;通用头域的域名只有在协议版本改变时才可有效地扩展。不过,通信中的所有方均认为是“通用头域”的新的头域也可认为是通用头域。不被认可的头域作为实体头域。
1.1 Call-ID
Call-ID通用头域唯一标识一个特定的请求或者一个特定客户的所有登记。来自同一个客户的所有的登记应该使用同样的Call-ID头值,至少是在同一个重新启动的循环中。注意到单个的多媒体会议会产生不同Call-ID的几个呼叫,例如,用户多次邀请一个单个的私人加入同一个会议。
对于一个INVITE请求。主叫方用户代理服务器不应该警告用户,如果用户先前已经对INVITE请求中的Call-ID 作出了响应。如果用户已经是会议的一个成员,同时包含在会话描述中的会议参数并未改变,那么主叫方用户代理服务器可以接受此呼叫,而不管Call-ID。对于一个已存在的Call-ID或者会话的邀请可能改变会议的参数。一个客户应用可以决定向用户简单地指示会议参数已经改变,可以自动接受邀请或者可能需要用户的确认。
使用几个不同的Call-ID可以邀请一个用户加入同一个会议或者呼叫。如果需要的话,可以使用在会话描述中的标识来检测此副本。例如,SDP的“o”域中包含了会话标识和版本号。
REGISTER和OPTIONS方式使用Call-ID值来精确匹配请求和响应。一个单个的客户发布的所有的REGISTER请求应该使用同一个Call-ID,至少在同一个有效循环中。
Call-ID = (“Call-ID” | “i”)”:”local-id”@”host
Local-id = 1*uric
i是Call-ID的缩写形式。
“host”应该是一个真正的域名或者是一个全球性的IP地址。如此,”local-id”应该是一个由URI字符组成的标识,此标识在”host”中是唯一的。建议使用经过加密的随机标识。Call-ID 的值禁止被重用于另一个不同的呼叫。Call-ID区分大小写。
1.2 From
请求和响应必须包含From通用头域,指示请求的初始者。From域可以包含一个"tag"参数。服务器将From头域从请求复制到响应。可选的"display-name"意味着由用户接口提出(执行)。如果客户身份被隐藏,那么系统必须使用显示名"Anonymous"。
此SIP-URL禁止包含"transport-param","maddr-param","ttl-param","headers"。接收到含有以上元素的SIP-URL的服务器在执行下一步处理之前,应将这些元素删除。
即使"display-name"是空的,如果"addr-spec"包含了","、"?"、";","name-addr"形式也必须使用。
From =("From" | "f")":"(name-addr | addr-spec)
*(";"addr-params)
addr-params=tag-param
tag-param="tag="UUID
UUID=1*(hex | "-")
"tag"可以出现在一个请求的From头域中,当共享同一个SIP地址的用户的两个实例使用同一个Call-ID发出邀请时,必须使用此"tag"。
"tag"必须是全球唯一的,并且是一个经过加密的至少32比特的随机数。一个单个的用户应该在一个Call-ID所标识的整个呼叫中保持同一个tag。
Call-ID、T o和From用于标识一个Call leg。呼叫和Call-leg的区别在于多个响应对派生请求的呼叫。
1.3 To
To通用头域说明了请求的接收者。
To =("To" | "t")":"(name-addr | addr-spec)
*(";"addr-params)
请求和响应必须包含T o头域,指示请求的预定接收者。可选的"display-name"意味着由用户接口提出(执行)。UAS或者重定向服务器将To头域的内容复制到它的响应中,同时如果请求包含了不止一个Via头域,则必须增加"tag"参数。
如果Via头域不止一个,那么表明请求至少经过一个代理服务器的处理。因为接收者不知道此请求是哪一个代理服务器派生的请求,所以从安全方面考虑,可认为它们都派生了请求。
此SIP-URL禁止包含"transport-param","maddr-param","ttl-param","headers"。接收到含有以上元素的SIP-URL的服务器在执行下一步处理之前,应将这些元素删除。
"tag"参数作为一种通用机制,用于区分由一个SIP-URL标识的用户的多个实例。因为代理可以派生请求,所以同一个请求可以到达用户的多个实例(例如:移动和住宅电话);又由于每一个都可以响应,所以必须有一种方法来区分来自被叫方每一个实例的响应。这种情况也可由于多点传送(组播)请求而产生。"tag"参数用于区分UAC的响应。当请求有可能被一中间件代理派生时,每一个实例都必须在它的响应中包含"tag"参数。"tag"参数必须可以被UAS、登记器和重定向服务器增加,但禁止被加入到上传的响应中。"tag"参数可以增加到所有方式的所有已经定义的响应中,也可以加入到来自UAS或者重定向服务器的报
告性(1xx)响应。两个实体间随后所有的事务都必须包含"tag"参数。
当响应与请求相匹配时,如果请求的T o域中未包含"tag"参数,那么响应To域中的"tag"参数将忽略。"tag"允许代理派生同一个呼叫的未来的请求,而只对几个可能的响应UAS中的一个定位(寻址)。它也允许被叫方的多个实例发送可以区分的请求。
当SIP服务器接收到一个请求,此请求的To域中含有它不能识别的URI时,它应该返回一个400(Bad Request)响应。
即使"display-name"是空的,如果"addr-spec"包含了","、"?"、";","name-addr"形式也必须使用。
Call-ID、To和From用于标识一个Call leg。呼叫和Call-leg的区别在于多个响应对派生请求的呼叫。"tag"允许代理派生同一个呼叫的未来的请求,而只对几个可能的响应UAS 中的一个定位(寻址)。它也允许被叫方的多个实例发送可以区分的请求。
1.4 Via
Via头域指示请求迄今为止所走的路径。它防止了请求的循环,同时确保了响应(回答)沿同样的路径返回,这一点可以通过防火墙遍历和其他的异常路径情况提供帮助。
1.5 Contact
Contact通用头域可出现在INVITE、ACK和REGISTER请求中,1xx、2xx、3xx和485响应中。通常,它提供了一个URL,用户可以通过此URL来进行进一步的通信。INVITE和ACK请求:Contact域表明请求从哪个位置发起;
这允许主叫方直接向被叫方发送未来的请求,如BYE,而不是通过一系列的代理。由于所想要的地址可能是代理的地址,所以只Via头域并不够。