5

我对 SIP 有一个微不足道的疑问。我尝试了谷歌搜索并参考了许多书籍,但我仍然无法找到在 SIP 请求中添加 from-tag 的充分理由。

示例 SIP 请求(来自 rfc-3261 的快照)

INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application//sdp
Content-Length: 142

根据 rfc-3261:

可以使用 from-tag、to-tag 和 call-id 来识别对话。

我知道添加 to-tag 和 call-id 的确切原因。我不知道的是,

  1. 为什么我们需要 from-tag ?
  2. 如果没有 from-tag 会有什么影响(假设 rfc-3261 没有强制要求)?
4

6 回答 6

4

[编辑] 关于标题字段中属性“tag”的含义来自,这是你的答案:http ://andrewjprokop.wordpress.com/2013/09/23/lets-play-sip-tag/

删除标签只会让服务器认为消息是重复的。

恢复 Andrew Prokop 所写的内容:

使用 Call-ID 唯一标识消息的最明显问题是呼叫分叉。在呼叫分叉中,单个 SIP Invite 消息会变成多个 Invite 消息到不同的目的地。例如,您可能会打电话给我,Andrew Prokop,但呼叫分叉可能会导致邀请消息发送到我所有注册的端点——我的智能手机、我的桌面电话和我的 PC 电话。当它是一个 Invite 时,那个单一的 Call-ID 很好,但当它变成三个时就不那么好了。这就是标签的用武之地。

标签真的很简单,但需要一些解释。标签的目标是与 Call-ID 一起工作,以使整个对话独一无二,无论会话可能被分叉多少次。实际上,我应该说标签,因为有两个。有一个本地标签(From 标签),它是由消息的发送者或 UAC 分配的。还有由消息的最终接收者或UAS(用户代理服务器)分配的远程标签(To tag)。UAC 将其标签放入 From 标头,UAS 将其标签放入 To 标头。因此,当一条消息离开 UAC 时,它的 From 标头中有一个标签,而 To 标头中没有标签。当 UAS 接收到该消息并以 SIP 响应(例如 180 Ringing)进行响应时,它会在 To 报头中添加一个标签。如果多个客户端收到原始消息,那么他们都会添加自己的特定标签值。换句话说,所有这些 SIP 消息都将具有相同的 From 标签,但根据响应者的不同,会有不同的 To 标签。

于 2014-10-09T10:25:25.970 回答
4

@Ani,这是一个现实的例子,您可以说出为什么确实需要“From-tag”。在 re-INVITE 的情况下,当它是从初始 INVITE 的被叫方/终止号码完成时,To 和 From 标头被交换,因此 From 标签和 To-Tag。

示例链接:示例重新邀请流程

假设A向B发送初始INVITE,From头有A的标签(本地标签),To Header有B的标签(远程标签)。稍后在呼叫接受后,B 向 A 发送 re-INVITE,在此 re-INVITE 中,From Header 有 B 的 sip uri 和 B 的 tag,而 TO header 有 A 的 sip uri 和 A 的 tag。现在对于这种情况,B 的标签成为本地标签,A 的标签成为远程标签。

现在,如果您认为如果初始 INVITE 本身中没有 From-tag,那么 re-INVITE 中将没有 To-Tag,并且难以识别收件人。

于 2019-07-29T10:09:24.500 回答
1

From Tag 是 UAC 的对话标识符,而不是 Call-Id。它们结合起来为对话提供了独特的性质。

其他用例

  1. Hair-pinning / Tromboning - 虽然服务不同,但它们都依赖 FROM 标签来区分基于 Dialog 标签的呼叫方向。

  2. 发送多个 INVITE 与 PSTN 互通,其中 IAM 和 SAM 中的后续数字在 INVITE 和相同的 FROM 头中携带。帮助下游网关匹配特定的对话。RFC 3578 有更多细节。因此,在这种情况下,同一呼叫的 FROM 标记有助于 GW 确定如何处理包含更多数字的 INVITE。

于 2014-10-16T05:23:25.687 回答
0

“发件人”字段用于请求发起者信息。

试试这个 PDF http://www.sipknowledge.com/rfc3261_explained_light.zip

第 8.1.1.3 节“发件人”

此外,第 8.3.1 节说 From 字段是强制性的,作为任何 SIP 请求中的基本块之一。

于 2014-10-08T19:19:44.560 回答
0

就像收件人一样。呼叫发起者可以有多个设备。笔记本电脑上的 IP 电话、呼叫处理代理或 IP Communicator。来自呼叫的不同标签可以帮助识别呼叫来自的设备。同样如上所述,如果接收方回拨发起方,则回拨原始设备可能会有所帮助。

于 2020-12-25T05:17:50.733 回答
0

首先,我也在寻找相同的答案。是的,CALL-ID 是有目的的。但 From & To 标签用于处理 SIP 进展。SIP 呼叫中包含了许多新功能。

但是需要 3 个:(可能有很多)

  1. 如果 From 地址可以出现在其他用户代理客户端为同一调用生成的请求中,则调用者必须在 From 字段中插入 tag 参数。

https://www.ietf.org/rfc/rfc2543.txt

  1. 最新:使用 FROM 和 TO 标记进行验证的 JOIN 标头。假设有 2 个人正在通话,而另一个想要加入通话。

RFC3911-会话发起协议 (SIP)“加入”标头 https://www.rfc-editor.org/rfc/rfc3911.txt

  1. 用于验证后续请求:-

    11.5 接收后续请求

    随后收到请求时,将进行以下检查:

    1.   If the Call-ID is new, the request is for a new call,
         regardless of the values of the To and From header fields.
    
    2.   If the Call-ID exists, the request is for an existing call.
         If the To, From, Call-ID, and CSeq values exactly match
         (including tags) those of any requests received previously,
         the request is a retransmission.
    
    3.   If there was no match to the previous step, the To and From
         fields are compared against existing call leg local and
         remote addresses. If there is a match, and the CSeq in the
         request is higher than the last CSeq received on that leg,
         the request is a new transaction for an existing call leg.
    
于 2019-08-31T10:58:21.530 回答